Les tests à assertion simple violent-ils donc DRY?
Non, mais cela favorise la violation.
Cela dit, une bonne conception orientée objet a tendance à sortir de la fenêtre pour les tests unitaires - principalement pour une bonne raison. Il est plus important que les tests unitaires soient isolés les uns des autres afin que le test puisse être interrogé isolément et, le cas échéant, corrigé en toute confiance que vous ne casserez pas les autres tests. Fondamentalement, la justesse et la lisibilité des tests sont plus importantes que leur taille ou leur maintenabilité.
Franchement, je n'ai jamais été fan de la seule assertion par règle de test pour les raisons que vous décrivez: cela conduit à beaucoup de code passe-partout difficile à lire, facile à mal bouillir et difficile à bien réparer si vous refactorisez (ce qui vous pousse à refactoriser moins).
Si une fonction est censée retourner une liste de "foo" et "bar" pour une entrée donnée, mais dans n'importe quel ordre, il est tout à fait correct d'utiliser deux assertions pour vérifier que les deux sont dans le jeu de résultats. Là où vous avez des problèmes, c'est quand un seul test vérifie deux entrées ou deux effets secondaires et que vous ne savez pas lequel des deux a provoqué l'échec.
Je le vois comme une variation du principe de responsabilité unique: il ne devrait y avoir qu'une seule chose peut faire échouer un test, et dans un monde idéal, ce changement ne devrait casser qu'un seul test.
Mais en fin de compte, c'est un compromis. Êtes-vous plus susceptible de passer plus de temps à maintenir tout le code copier-coller, ou passerez-vous plus de temps à rechercher les causes profondes lorsque les tests peuvent être interrompus par plusieurs sources. Tant que vous écrivez -certains- tests, cela n'a probablement pas trop d'importance. Malgré mon dédain pour les tests à assertion simple, j'ai tendance à pécher par excès de tests. Votre kilométrage peut varier.