Les meilleures pratiques ont toujours un but, une raison derrière elles. C'est toujours une bonne idée de tenir compte de ces raisons dans votre conception - en particulier lorsque vous essayez de décider comment et à quel point suivre ces meilleures pratiques.
Dans ce cas, le principal raisonnement derrière le fait de faire de chaque test une seule chose est que si la première chose échoue, la seconde ne sera pas testée. Étant donné que trop de faiseurs d'opinion semblent trouver utile de tout casser dans les moindres bits possibles et d'envelopper chaque bit dans le plus de ballonnement possible, cela a donné naissance à l'idée que chaque test devrait contenir une seule assertion.
Ne suivez pas cela aveuglément. Même si chaque test doit tester une chose, vous devez quand même réfléchir à la taille de chaque "chose", et pour ce faire, vous devez garder à l'esprit pourquoi vous voulez que chaque test teste une chose - pour vous assurer un bug dans la première chose ne laisse pas la deuxième chose non testée.
Donc, vous devez vous demander - "ai-je vraiment besoin de cette garantie ici?"
Disons qu'il y a un bogue dans le premier cas de test - le code de réponse HTTP ne l'est pas 200
. Vous commencez donc à pirater le code, découvrez pourquoi vous n'avez pas obtenu le code de réponse que vous devriez avoir et corrigez le problème. Et maintenant?
- Si vous réexécutez manuellement le test, pour vérifier que votre correctif a résolu le problème, vous devez rencontrer tout autre problème masqué par le premier échec.
- Si vous ne l'exécutez pas manuellement (peut-être parce que cela prend trop de temps?), Et que vous appuyez simplement sur votre correctif en attendant que le serveur de tests automatisés exécute tout, vous souhaiterez peut-être placer différentes assertions dans différents tests. Les cycles dans ce cas sont très longs, il vaut donc la peine de faire l'effort de découvrir autant de bugs dans chaque cycle.
Il y a quelques autres choses à considérer:
Dépendances d'assertions
Je sais que les tests que vous avez décrits ne sont qu'un exemple, et vos tests réels sont probablement plus compliqués - donc ce que je vais dire peut ne pas être valable avec autant de force dans les vrais tests, mais il peut quand même être quelque peu efficace pour que vous peut vouloir le considérer.
Si vous avez un service REST (ou tout autre protocole HTTP) qui renvoie des réponses au format JSON, vous écrivez généralement une classe client simple qui vous permet d'utiliser les méthodes REST comme des méthodes régulières qui renvoient des objets normaux. En supposant que le client a des tests séparés pour s'assurer qu'il fonctionne, j'aurais abandonné les 3 premiers assertions et n'en garderais que 4!
Pourquoi?
- La première assertion est redondante - la classe cliente doit lever une exception si le code de réponse HTTP n'est pas 200.
- La deuxième assertion est redondante - si la réponse est vide, l'objet résultat sera nul ou une autre représentation d'un objet vide, et vous n'aurez nulle part où mettre la clé X.
- La troisième assertion est redondante - si le JSON n'est pas valide, vous obtiendrez une exception lorsque vous essayez de l'analyser.
Vous n'avez donc pas besoin d'exécuter tous ces tests - exécutez simplement le quatrième test, et si l'un des bogues que les trois premiers essaient de détecter se produit, le test échouera avec une exception appropriée avant même d'obtenir l'assertion réelle.
Comment souhaitez-vous recevoir les rapports?
Supposons que vous n'obteniez pas d'e-mails d'un serveur de test, mais que le service QA exécute les tests et vous informe des tests ayant échoué.
Jack de QA frappe à votre porte. Il dit que la première méthode de test a échoué et que la méthode REST a renvoyé un mauvais code de réponse. Vous le remerciez et commencez à chercher la cause profonde.
Vient ensuite Jen de QA et dit que la troisième méthode de test a échoué - la méthode REST n'a pas renvoyé un JSON valide dans le corps de la réponse. Vous lui dites que vous examinez déjà cette méthode, et vous pensez que la même chose qui l'a fait retourner un mauvais code de sortie l'a également fait renvoyer quelque chose qui n'est pas un JSON valide, et ressemble plus à une trace de pile d'exceptions.
Vous vous remettez au travail, mais Jim de QA arrive, disant que la quatrième méthode de test a échoué et qu'il n'y a pas de clé X dans la réponse ...
Vous ne pouvez même pas chercher la raison, car il est difficile de regarder le code lorsque vous n'avez pas d'écran d'ordinateur. Si Jim avait été assez rapide, il aurait pu esquiver à temps ...
Les e-mails du serveur de test sont plus faciles à ignorer, mais ne préférez-vous pas simplement être averti UNE FOIS que quelque chose ne va pas avec la méthode de test et consulter les journaux de test pertinents vous-même?