Choix des noms pour les tests d'intégration


13

Avec les tests unitaires, le domaine est assez petit, donc c'est facile. J'ai utilisé le methodName_conditions_result()schéma d'Osherove et je l'ai trouvé très clair.

Mais avec les tests d'intégration, j'ai l'impression que cela ferait un nom très long, et que dois-je mettre en place methodName? Comment nommer les classes de test d'intégration?

Des exemples réels de noms de test d'intégration sont les bienvenus. J'espère que les réponses m'aideront également à mieux comprendre ces tests.


1
pourquoi cette question a-t-elle été rejetée (deux fois)?
bigstones

Réponses:


6

J'adopte une approche un peu différente avec les tests unitaires et d'intégration. J'essaie de les nommer en fonction des fonctionnalités autant que possible. Ensuite, lorsque tous les tests sont réussis, vous pouvez voir une liste de toutes les fonctionnalités qui fonctionnent et ne fonctionnent pas.

  • canRegisterUser
  • canHandleInvalidInput
  • canRelayDocumentBetweenServers
  • canCreateSchema
  • canLoginUsingWebService
  • canLoginUsingBasicAuth
  • canDeleteDocument
  • canAddDocument

Il n'est pas toujours pragmatique de nommer les tests de cette façon, mais cela peut être très utile, surtout après avoir lu des centaines de tests unitaires et d'intégration. Le nom de classe englobant global qui contient ces méthodes doit également être indicatif des fonctionnalités testées. Cela aidera à l'organisation.

Je suggère également de nommer tous les tests unitaires pour les corrections de bogues avec un préfixe unique bugfix1002afin de prouver que le bogue a été corrigé.


5

Cela a vraiment été écrit pour aider avec les tests unitaires, mais vous constaterez peut-être que les mêmes règles s'appliquent (plus ou moins) aux tests d'intégration:

Découvrez sept étapes !

Ma préférence est que, peu importe comment vous l'appelez, c'est vraiment le nom de la suite de tests (nom du luminaire sur notre carte), l'effet que vous vérifiez et le message d'assertion qui doivent se démarquer et clarifier la cause de l'erreur. Si vous trouvez que c'est plus facile avec la dénomination d'Asherove, alors je l'approuve de tout cœur. Mais peut-être que l'astuce consiste à remplir la partie "méthode" avec tout ce qui rend la condition, le résultat et l'exception logique.

Je suis heureux de voir une suite nommée "MakingADeposit" avec un test appelé "AccountDoesntExist" et une erreur qui dit "Exception NonesuchAccount attendue - aucune reçue."

Alternativement, si cela ne vous dérange pas de séparer le nom de la suite de tests par "::", je suis d'accord avec "AccountHandling :: MakingADeposit_AccountDoesntExist_ThrowsAnException"

La carte suggère également que si vous n'avez pas un bon nom, continuez et donnez un meilleur nom quand un vous vient à l'esprit (j'espère bien avant de soumettre le code à CI).


2

Les tests d'intégration doivent suivre des règles similaires aux tests unitaires dans la mesure où chaque test doit tester un aspect d'une exigence mais teste le système dans son ensemble. La classe doit nommer la chose globale qui est testée, par exemple "TpcInputValidation" et la dénomination de la méthode doit refléter expressément ce que le test essaie de faire sans être trop verbeux, par exemple "shouldRaiseValidationErrorWithBadDates ()".

Les méthodes devraient tester un concept de la fonctionnalité et un grand nombre d'assertions pourraient indiquer le contraire. (Réf. «Clean Code: A Handbook of Agile Software Craftmanship» p. 132, par Robert Martin).


Pourquoi croyez-vous qu'une «caractéristique» équivaut généralement à «une affirmation»? Il semble que vous souhaitiez affirmer que le système est dans l'état dans lequel vous vous attendez, ce qui peut être un certain nombre d'assertions. Mais je m'éloigne du sujet car la question porte sur la dénomination, et non sur la façon de rédiger un test d'intégration.
Jeremy Heiler

@Andrew, je n'ai pas dit que c'était une règle stricte, mais regarder le nombre d'assertions pourrait aider à guider le test d'un concept de la fonctionnalité pas nécessairement un par méthode. Le fait de les garder quelque peu limités permet d'identifier où se trouvent les problèmes lorsqu'ils échouent. Mais je vais vous dire que ce n'est pas génial de dire une affirmation, et je vais le modifier, merci.
Clé en main

1

Le problème est donc qu'un nom correct de fonctionnalité est trop long pour un nom de méthode? Je sais qu'il est gênant de commencer à écrire des méthodes de test avec des noms comme registerAndValidateUnderageUniversityDriverWithCoverageSetA_test()et pourrait jamais enfreindre les règles du compilateur pour les noms de méthode longs (PL / SQL ne permet que jusqu'à 30 caractères - je ne sais pas si Java et C # imposent des limites de nom aussi courtes, mais même s'ils ne le font pas, cela devient assez difficile à gérer au-delà d'un certain point et les noms de méthode vraiment très longs ne peuvent être utiles que pour le code généré qui est lu / géré par un autre code généré). Vous pouvez essayer de le raccourcir enregValUnderageUnivDrvrWCovrgA_test() mais c'est aussi vraiment horrible à lire. Une option que j'ai utilisée que je n'ai pas aimée mais qui était le meilleur choix à l'époque étaitunderageUnivDrvr_test_01()puis il y avait une feuille de calcul mappant les noms de méthode à une description beaucoup plus longue de la fonctionnalité testée. Moche, mais ça a marché. Vous pouvez également documenter la description du test dans la documentation de la fonction dans le fichier source, ce qui peut être utile car vous pouvez générer la documentation des tests directement à partir du code, au lieu de faire un va-et-vient entre la feuille de calcul et le code.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.