Je sais que la raison pour laquelle Microsoft est sorti avec ASP.NET MVC était de rendre plus simple de faire TDD (Test Driven Design) pour ASP.NET. Cependant, j'ai une assez grande application marron (existante) dans ASP.NET WebForms que j'adorerais implémenter certaines fonctionnalités de type TDD. Je suppose qu'il existe un moyen de le faire, mais quelles sont les options viables?Comment implémenter TDD dans ASP.NET WebForms
Répondre
Microsoft a présenté ASP.NET MVC parce qu'il pensait pouvoir gagner de l'argent sur un marché inexploité - ceux qui estiment que les formulaires Web sont trop lourds et qui programment en utilisant un cadre plus léger. Cela inclut ceux qui sont habitués au paradigme MVC.
Il comprend également ceux qui ne pouvaient pas comprendre comment effectuer des tests unitaires dans des formulaires Web, et qui veulent utiliser des tests unitaires et TDD. La manière de le faire avec les formulaires Web, comme avec n'importe quoi d'autre, est de séparer tout sauf le code d'interface utilisateur en classes séparées dans une bibliothèque de classes. Utilisez TDD pour développer ces classes. Le prochain niveau de controverse est de savoir s'il est nécessaire d'utiliser TDD pour développer le reste du code: le balisage, le code côté client, les interactions avec l'utilisateur, etc. Ma réponse est que si vous avez le reste isolé et testé, que ça ne vaut pas la peine d'utiliser TDD pour cela.
Considérez: vos pages doivent avoir une apparence particulière. Allez-vous écrire un test unitaire qui échoue pour prouver que vous utilisez correctement CSS? Pour prouver que vous utilisez les styles CSS corrects? Je ne pense pas. Pour clarifier: Dans TDD, nous commençons par un test unitaire défaillant. Nous faisons ensuite les changements les plus simples possibles qui feront le test réussir. Imaginez l'utilisation de TDD pour une page Web.
Quels tests échouer allez-vous produire?
- test cette page est bien formé HTML
- test cette page contient le titre correct
- test cette page comprend
- étiquette "Enter ID"
- Une zone de texte identifiant
- Une grille de données
- Un bouton "Go"
- Vérifiez que la grille de données est vide après un test
- Vérifiez que la grille se charge avec les données du client 1 lorsque "1" est entré dans la zone de texte et que "OK" est cliqué.
Et aucun des tests ci-dessus pour l'apparence de la page. Rien de tout cela ne teste le comportement côté client de tout JavaScript sur la page. Je pense que c'est stupide. Au lieu de cela, testez votre méthode DAL qui récupère les données en fonction de l'ID. Assurez-vous qu'il renvoie l'ID correct pour l'ID 1.Ensuite, combien de temps faudra-t-il pour tester manuellement la page pour vous assurer qu'elle semble correcte, vous pouvez entrer le "1" et cliquer sur "Go", et les données qui apparaissent dans la grille sont les données correctes pour le client 1?
Le développement piloté par les tests et les tests unitaires automatisés sont destinés à tester le comportement. L'interface utilisateur d'un formulaire Web est principalement déclarative. Il y a un grand "décalage d'impédance" ici.
Donc, juste pour clarifier: Séparer ma couche d'interface utilisateur de ma logique métier. Je devine que je vais devoir changer mes databinds de grille de vue pour quelque chose d'autre. Est-ce que tous mes contrôles doivent être générés dans le code derrière? Cela faciliterait-il la séparation? –
Votre réponse a été très éclairante. Merci, John. –
J'espère que ça aide. N'hésitez pas à commenter ici ou à poser une autre question si j'ai raté la base quelque part. Je peux imaginer certaines sortes d'interactions d'interface utilisateur complexes où le TDD pourrait être utile, mais ce serait rare. Si vous en touchez un, faites-le nous savoir. –
Vous pouvez exécuter des tests basés sur HTTP pour tester la fonctionnalité de haut niveau. Le mieux serait d'encapsuler le code code-behind dans votre couche de gestion et de lancer des tests unitaires dessus.
Vous pouvez utiliser le cadre officiel UnitTest: http://msdn.microsoft.com/en-us/library/ms182526.aspx
Cela peut être officiel, mais c'est de la merde. Il suppose que vous utilisez un «projet» de site Web pour commencer, puis échoue totalement dans un environnement TDD (ce qui est à propos de cette question). –
tout d'abord, il est vraiment difficile de tester WebForms. Mais si vous présentez une logique aux contrôleurs/présentateurs comme le modèle MVC/MVP, vous pouvez au moins tester les présentateurs.
pseudo-code
Default.aspx
public void Page_Init(object sender, EventArgs e) {
_presenter = new DefaultPresenter(IDependencyOne, IDependencyTwo etc) //Init new presenter, either from IoC container of choose or "new-it-up"
}
public void Save() {
_presenter.Save(txtValue.Text)
}
Que vous pouvez facilement tester le présentateur dans l'isolement au moins =)
Pouvez-vous me donner des détails sur ce qui se passerait de chaque côté de la séparation? –
Habituellement, je laisse uniquement la page prendre en charge le rendu de l'interface utilisateur et transformer les valeurs de QueryString/Form/Viewstate, puis appeler le présentateur qui parle avec d'autres services et/ou référentiels. –
Ces modèles sont une formalisation de ce que je proposais. Je pense qu'ils peuvent être beaux en tant que paradigme de développement, mais je pense qu'ils dépassent un peu la note en termes de TDD. À mon avis, le but des tests dans TDD est de créer du code qui manque un ensemble de bogues en créant des tests qui prouvent que les bogues sont absents. Je pense qu'une fois que vous arrivez à l'interface utilisateur, vous n'alliez pas avoir beaucoup de ces bugs dans tous les cas. Les bugs que vous auriez eu seraient mieux trouvés en utilisant des tests manuels, peut-être augmentés par un cadre d'automatisation, mais pas de TDD et même pas purement tests unitaires. –
Juste pour clarifier, vous wan't faire piloté par les tests développement ou juste des tests unitaires? – alexn
Je voudrais incorporer certains TDD qui me permettraient aussi de bénéficier de meilleurs tests unitaires, j'avais espéré. –