Le code dupliqué est une odeur dans le code de test unitaire autant que dans un autre code. Si vous avez du code dupliqué dans les tests, il est plus difficile de refactoriser le code d'implémentation car vous avez un nombre disproportionné de tests à mettre à jour. Les tests doivent vous aider à refactoriser en toute confiance, plutôt que d'être un lourd fardeau qui empêche votre travail sur le code testé.
Si la duplication est en cours de configuration, envisagez d'utiliser davantage la setUp
méthode ou de fournir des méthodes de création plus (ou plus flexibles) .
Si la duplication est dans le code manipulant le SUT, alors demandez-vous pourquoi plusieurs tests dits «unitaires» exercent exactement la même fonctionnalité.
Si la duplication se trouve dans les assertions, vous avez peut-être besoin d' assertions personnalisées . Par exemple, si plusieurs tests ont une chaîne d'assertions comme:
assertEqual('Joe', person.getFirstName())
assertEqual('Bloggs', person.getLastName())
assertEqual(23, person.getAge())
Alors peut-être avez-vous besoin d'une seule assertPersonEqual
méthode pour pouvoir écrire assertPersonEqual(Person('Joe', 'Bloggs', 23), person)
. (Ou peut-être avez-vous simplement besoin de surcharger l'opérateur d'égalité Person
.)
Comme vous l'avez mentionné, il est important que le code de test soit lisible. En particulier, il est important que l' intention d'un test soit claire. Je trouve que si de nombreux tests se ressemblent pour la plupart (par exemple, les trois quarts des lignes sont identiques ou pratiquement identiques), il est difficile de repérer et de reconnaître les différences significatives sans les lire attentivement et les comparer. Je trouve donc que la refactorisation pour supprimer la duplication contribue à la lisibilité, car chaque ligne de chaque méthode de test est directement pertinente par rapport à l'objectif du test. C'est beaucoup plus utile pour le lecteur qu'une combinaison aléatoire de lignes directement pertinentes et de lignes qui ne sont que des passe-partout.
Cela dit, les tests exercent parfois des situations complexes qui sont similaires mais toujours significativement différentes, et il est difficile de trouver un bon moyen de réduire la duplication. Faites preuve de bon sens: si vous pensez que les tests sont lisibles et que leur intention est claire, et que vous êtes à l'aise avec le fait d'avoir peut-être besoin de mettre à jour plus qu'un nombre théoriquement minimal de tests lors de la refactorisation du code invoqué par les tests, acceptez l'imperfection et déplacez-vous sur quelque chose de plus productif. Vous pouvez toujours revenir et refactoriser les tests plus tard, lorsque l'inspiration vous frappe!