Que signifie «DAMP not DRY» lorsque l'on parle de tests unitaires?

345

J'ai entendu quelqu'un dire que les tests unitaires (par exemple nUnit, jUnit, xUnit) devraient être

DAMP not DRY

(Par exemple, les tests unitaires doivent contenir "code humide" et non "code sec")

De quoi parlent-ils?

Ian Ringrose
la source
2
Il n'y a rien de spécial dans les tests unitaires qui garantissent un code non-DRY. L'écriture de tests non DRY est une excuse pour les programmeurs paresseux pour tenter de se tailler une place pour leur paresse. Autrement dit, la SECHÉITÉ et la lisibilité sont des préoccupations orthogonales.
Acumenus
2
DRYness augmente la distance de navigation du code, ce qui entraîne à son tour une charge mentale plus élevée à comprendre. Cela se produit dans un environnement texte "normal". Un éditeur de projection pourrait réduire l'orthogonalité du code mais pas dans tous les cas.
Peter
Je recommande cet article: enterprisecraftsmanship.com/posts/dry-damp-unit-tests
Vladimir

Réponses:

596

C'est un équilibre, pas une contradiction

DAMP et DRY ne sont pas contradictoires, ils équilibrent plutôt deux aspects différents de la maintenabilité d'un code . Le code maintenable (code facile à modifier) ​​est le but ultime ici.

DAMP (Phrases descriptives et significatives) favorise la lisibilité du code.

Pour conserver le code, vous devez d'abord comprendre le code. Pour le comprendre, il faut le lire. Considérez un instant combien de temps vous passez à lire le code. C'est beaucoup. DAMP augmente la maintenabilité en réduisant le temps nécessaire pour lire et comprendre le code.

SEC (ne vous répétez pas) favorise l' orthogonalité du code.

La suppression de la duplication garantit que chaque concept du système a une seule représentation faisant autorité dans le code. Une modification d'un concept d'entreprise unique entraîne une modification unique du code. DRY augmente la maintenabilité en isolant le changement (risque) uniquement sur les parties du système qui doivent changer.

Alors, pourquoi la duplication est-elle plus acceptable dans les tests?

Les tests contiennent souvent une duplication inhérente car ils testent la même chose encore et encore, uniquement avec des valeurs d'entrée ou un code de configuration légèrement différents. Cependant, contrairement au code de production, cette duplication n'est généralement isolée que pour les scénarios au sein d'un seul appareil / fichier de test. Pour cette raison, la duplication est minime et évidente, ce qui signifie qu'elle présente moins de risques pour le projet que d'autres types de duplication.

De plus, la suppression de ce type de duplication réduit la lisibilité des tests. Les détails qui étaient précédemment dupliqués dans chaque test sont désormais cachés dans une nouvelle méthode ou classe. Pour obtenir l'image complète du test, vous devez maintenant rassembler mentalement toutes ces pièces.

Par conséquent, étant donné que la duplication de code de test comporte souvent moins de risques et favorise la lisibilité, il est facile de voir comment il est considéré comme acceptable.

En principe, privilégiez DRY dans le code de production, privilégiez DAMP dans le code de test. Bien que les deux soient tout aussi importants, avec un peu de sagesse, vous pouvez faire pencher la balance en votre faveur.

Chris Edwards
la source
18
Ceci est un excellent résumé concis. J'aime également souligner qu'un test DAMP est plus résilient face à l'évolution des exigences, et la mesure de l'évidence d'un test est un énorme avantage lorsque quelqu'un d'autre est chargé de réécrire vos tests pour répondre aux nouvelles exigences. Jesper Lundberg a également un bon traité à ce sujet.
Jason
3
@Jason, Btw existe-t-il un lien vers "Jesper Lundberg a également un bon traité à ce sujet" ?
Pacerier
2
@JohnSaunders, vous pouvez éviter une partie de cette duplication en utilisant le modèle de générateur de données de test: natpryce.com/articles/000714.html
si618
2
Le séchage du code de test a le potentiel de créer un test obscur en introduisant un invité mystère
jayeff
1
J'ajouterais également que les tests bien écrits sont essentiellement la documentation / les commentaires de votre application. Donc, être plus descriptif aide à expliquer votre intention aux autres développeurs. Et comme le dit l'OP, ils sont autonomes dans chaque test, donc le danger pour votre application est minime. Dans le pire des cas, vous disposez d'un test ou d'une configuration de test redondants et l'exécution de la suite de tests prend plus de temps. Je préfère me tromper du côté d'une bonne couverture de test.
Lee McAlilly
60

DAMP - Phrases descriptives et significatives.

"DAMP not DRY" valorise la lisibilité lors de la réutilisation du code. L'idée de DAMP not DRY dans les cas de test est que les tests doivent être faciles à comprendre, même si cela signifie que les cas de test ont parfois du code répété.

Voir aussi Le code dupliqué est-il plus tolérable dans les tests unitaires? pour une discussion sur les mérites de ce point de vue.

Il a peut-être été inventé par Jay Fields , en relation avec les langages spécifiques au domaine.

Dominic Rodger
la source
1
Bonne réponse et lien vers une question connexe. Il n'y a pas de choix DAMP vs DRY parfait. Nous voulons un code aussi sec que possible et dans les tests, cela signifie qu'il n'est pas si sec que le test devient difficile à comprendre. Lorsqu'un test échoue, je veux que la raison soit évidente afin que le développeur puisse commencer à réparer le SUT, ce qui signifie que je penche vers le code DAMP dans les tests. Comme la plupart des concepts de programmation, il est toujours possible d'aller trop loin. Si votre code de test unitaire est si sec qu'il faut du temps pour déterminer comment et pourquoi le test a échoué, il peut être "trop ​​sec".
Gerald Davis
29

"SEC" est "Ne vous répétez pas"

C'est un terme qui est utilisé pour dire aux gens d'écrire du code qui est réutilisable, afin que vous ne finissiez pas par écrire du code similaire encore et encore.

"DAMP" est "Phrases descriptives et significatives".

Ce terme est destiné à vous dire d'écrire du code qui peut être facilement compris par quelqu'un qui le regarde. Si vous suivez ce principe, vous aurez des noms de fonction et de variable longs et descriptifs, etc.

Spudley
la source
15
AIUI, DRY n'est pas seulement une question de gain de temps grâce à la réutilisabilité - il empêche également les différents chemins de code de «se désynchroniser». Si vous copiez-collez la même logique sur plusieurs classes, chaque instance de ce code devra être mise à jour lorsqu'une modification est requise. (Et inévitablement, l'un d'eux ne le fera pas et explosera lors de l'exercice.)
Andrzej Doyle
20

Damp = 'Phrases descriptives et significatives' - vos tests unitaires devraient pouvoir être 'lus':

La lisibilité est plus importante que d'éviter le code redondant.

De l'article:

DAMP signifie «phrases descriptives et significatives» et est l'opposé de DRY, pas dans le sens où il dit «tout devrait ressembler à un tas de déchets et être impossible à lire», dans la mesure où la lisibilité est plus importante que d'éviter le code redondant.

Qu'est-ce que cela signifie et où l'utiliser?

DAMP s'applique principalement lors de l'écriture de code de test. Le code de test doit être très facile à comprendre au point qu'une certaine redondance est acceptable.

stuartd
la source
11

Il y a déjà plusieurs réponses ici, mais je voulais en ajouter une autre car je ne pensais pas qu'elles l'expliquaient nécessairement du mieux qu'elles pouvaient.

L'idée de DRY (ne vous répétez pas) est que dans votre code d' application , vous voulez éviter le code redondant ou répétitif. Si vous avez quelque chose que votre code doit faire plusieurs fois, vous devriez avoir une fonction ou une classe pour cela, plutôt que de répéter du code similaire à plusieurs endroits.

Il s'agit d'un concept de programmation assez bien connu.

DAMP (Phrases descriptives et signifiantes) est pour vos tests unitaires. L'idée ici est que les noms de vos méthodes de test unitaire doivent être longs et descriptifs - en fait des phrases courtes qui décrivent ce que vous testez.

par exemple: testWhenIAddOneAndOneIShouldGetTwo() { .... }

Lorsque vous lisez un nom de méthode DAMP comme celui-ci, vous devez comprendre exactement ce que le rédacteur de test essayait de réaliser, sans même avoir à lire le code de test (bien que le code de test puisse également suivre ce concept également avec des noms de variables verbeux, etc).

Ceci est possible car une méthode de test unitaire a une entrée et une sortie attendues très spécifiques, donc le principe DAMP fonctionne bien pour elles. Il est peu probable que les méthodes de votre code d'application principal soient suffisamment spécifiques pour garantir des noms comme celui-ci, surtout si vous l'avez écrit en gardant à l'esprit le principe DRY.

DAMP et DRY ne se contredisent pas - ils couvrent différents aspects de la façon dont votre code est écrit - mais néanmoins ils ne sont généralement pas utilisés ensemble car les méthodes écrites avec le principe DRY à l'esprit seraient à usage général et peu susceptibles d'être adaptées à un nom de méthode très spécifique. En général donc, comme expliqué ci-dessus, votre code d'application doit être SEC et votre code de test unitaire DAMP.

J'espère que cela aide à l'expliquer un peu mieux.

SDC
la source
5

Je suis d'accord avec Chris Edwards en ce que vous devez trouver un équilibre entre les deux. Une autre chose à noter est que si, dans une tentative de supprimer la duplication, vous finissez par ajouter beaucoup de structure supplémentaire dans votre code de test unitaire (c'est-à-dire lorsque vous prenez DRY à des extrêmes), vous courez le risque d'y introduire des bogues. Dans une telle situation, vous devrez soit tester vos tests unitaires soit laisser des morceaux de structure non testés.

Philip Atz
la source
0

Je ne souhaite pas dupliquer l'effort ici, mais vous pouvez avoir des tests qui sont DAMP mais qui ont l'avantage de SEC. D'un autre côté, les tests DRY ne satisferont pas les tests DAMP dans certains cas.

J'ai blogué sur DRY vs DAMP qui comprend quelques exemples.

Aucune de ces approches ne devrait être votre seule solution, parfois DAMP est exagéré, d'autres fois un très bon ajout.

En règle générale, vous devez appliquer la règle des trois. Si vous repérez une duplication une troisième fois, cela peut valoir la peine d'écrire des tests de style DAMP, mais même alors, la duplication n'est pas toujours mauvaise . Le contexte est important.

Finglas
la source