J'ai entendu quelqu'un dire que les tests unitaires (par exemple nUnit, jUnit, xUnit) devraient être
(Par exemple, les tests unitaires doivent contenir "code humide" et non "code sec")
De quoi parlent-ils?
unit-testing
Ian Ringrose
la source
la source
Réponses:
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.
la source
"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.
la source
"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.
la source
Damp = 'Phrases descriptives et significatives' - vos tests unitaires devraient pouvoir être 'lus':
De l'article:
la source
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.
http://codeshelter.wordpress.com/2011/04/07/dry-and-damp-principles-when-developing-and-unit-testing/
la source
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.
la source
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.
la source
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.
la source