Comment puis-je tester un site de formulaires Web? Il me semble que cela dépend en grande partie de l'état et de la contribution de l'utilisateur, ce ne serait pas faisable.
Si ce n'est pas possible, existe-t-il une alternative automatisée valide?
Oui, vous pouvez. Vous devez juste faire attention à bien séparer vos préoccupations. En bref, vous devez supprimer toute votre logique du code-behind et la mettre dans d'autres classes.
Il existe deux façons courantes de procéder.
Le moyen le plus simple est de repenser tous vos gestionnaires d'événements en termes de "Quelles informations le système me donne-t-il? De quelles informations ai-je besoin pour remplir la page?" puis fournir une classe de service qui effectue cette conversion.
Dans ce cas, la couche de service doit en savoir très peu sur la nature de votre couche de présentation. Vous devez toujours prendre les données renvoyées par le service et remplir les composants corrects du WebForm dans votre code-behind et cela reste non testé (au moins par des tests unitaires, vous pouvez toujours utiliser des tests d'intégration). Mais c'est rarement là où le code va mal, il est beaucoup plus susceptible d'échouer dans la logique.
Une manière plus compliquée, mais plus efficace, consiste à utiliser le modèle de présentation du modèle . Lorsque nous avons essayé cela, nous avons constaté que les Presenters étaient rapidement devenus très couplés au framework et, plus nous développions MVP, plus il était clair que MVP voulait vraiment être MVC mais ne pouvait pas l'être.
Cela dit, d'autres l'ont fait avec beaucoup de succès - il y a même un framework webformsmvp disponible pour supprimer les charges lourdes - donc votre kilométrage peut varier.
De toute évidence, une page entière de formulaires Web n'est pas une unité et ne peut donc pas être testée à l'unité. Cependant, vous pouvez faire certaines choses pour les tests automatisés:
Je suis désolé d'avoir raté la partie "unité" de la question ...
SeleniumHQ est votre ami pour les tests du front-end. Ce n'est pas un test unitaire, plutôt un test de boîte noire. Vous devez toujours penser à des cas de test valides ...
Parlant d'expérience: seulement si c'est bien fait. Par "droit", j'entends un code-back minimal et quelque chose comme le Model-View-Presenter susmentionné pour rendre le formulaire Web "stupide". Cela s'avère généralement être très difficile avec les applications de friches industrielles car elles n'ont pas été conçues dans cet esprit et c'est un effort presque herculéen de refactoriser/réécrire des pages pour l'utiliser.
Je trouve que les tests web unitaires sont extrêmement utiles, même si c'est juste pour donner une idée générale d'un bug de régression ou pour de nouveaux projets.
En ce qui concerne l'état, vous créez vos tests unitaires comme vous le feriez avec des tests non-UI - ils effacent la base de données au début du test et reconstruisent la base de données pour ne contenir que l'état de démarrage. Chaque test unitaire encapsule ensuite une seule page, ou généralement une tâche distincte sur une page.
http://watin.org/ est un autre outil de test Web mais pour C # /. NET. Vous écrivez les tests sous forme de tests unitaires:
[Test]
public void SearchForWatiNOnGoogle()
{
using (var browser = new IE("http://www.google.com"))
{
browser.TextField(Find.ByName("q")).TypeText("WatiN");
browser.Button(Find.ByName("btnG")).Click();
Assert.IsTrue(browser.ContainsText("WatiN"));
}
}
Il est actuellement IE basé mais a un support expérimental pour Firefox et Chrome. Vous pouvez à peu près automatiser tout ce que vous feriez dans les tests manuels, y compris l'interaction Javascript.
Vous ne pouvez pas vraiment tester un site Web, simplement parce que les demandes Web se produisent sur un fil (ou via une pile TCP). Ainsi, les tests ne correspondent pas à la définition de "test unitaire" , il s'agirait vraisemblablement de tests de bout en bout.
Pour ces types de tests, vous pouvez utiliser une suite comme Selenium qui exécute un navigateur Web dans les coulisses. Un mot d'avertissement cependant: généralement ce type de test est très difficile et imprévisible, car il y a beaucoup de pièces mobiles!
Plus intéressant cependant, cela m'inquiète un peu pourquoi vous voudriez besoin pour tester les formulaires Web. N'insérez-vous pas trop de logique dans le code et avez-vous une logique commerciale anémique par hasard?