2009-10-14 6 views
7

J'ai un projet que je construis que je dois changer une méthode pour se comporter légèrement différent. J'ai plusieurs tests unitaires déjà construits contre cette méthode, mais je devrai en ajouter d'autres pour couvrir le nouveau comportement que je vais y ajouter. Est-ce une bonne forme de changer/ajouter ces tests avant de faire le changement de code, ou changez-vous votre code, corrigez les tests brisés et ajoutez les nouveaux tests pour couvrir le nouveau comportement?Si vous changez de code avec un test unitaire, lequel changez-vous en premier?

Répondre

6

Il est préférable de mettre à jour les premiers tests et les laisser ne puis revenir en arrière et mettre à jour le code jusqu'à ce que le test passe. A.K.A Développement piloté par test ou Test premier développement.

13

Si vous êtes à suivre TDD pratiques, vous devez mettre à jour vos premiers tests. Vous aurez des cas de test cassés qui, espérons-le, seront corrigés lorsque vous corrigerez votre code.

+1

s/hopefully/definitely/ –

+0

Le mot a été choisi avec intention :) –

-1

Ce que je fais est le code d'abord, puis créer des tests après. Puisque vous pourriez avoir un cas où vous programmez votre test pour travailler d'une manière ou d'une autre et ensuite quand vous codez, vous réalisez que vous ne pouvez pas faire cela. Donc, vous devrez changer les tests à nouveau.

+6

Dans mon expérience, cela conduit à des tests biaisés vers le code écrit, plutôt que les exigences. Écrire les tests en premier est la meilleure façon d'obtenir des tests appropriés, et les tests appropriés sont très utiles pour obtenir le bon code. –

+0

Ils peuvent être oui. Donc c'est quelque chose que je cherche. Ce que je teste est tous les chemins de code. –

+0

L'écriture de tests après le code suppose implicitement que le code est correct. Si c'est votre hypothèse, écrire le test est une perte de temps. Dans les cas triviaux, cela peut même être une hypothèse sûre, mais a) je suppose que vous avez affaire à beaucoup de cas non triviaux dans votre travail quotidien, et b) si le code est si trivial, écrire des tests pour cela est probablement pas une utilisation judicieuse de votre temps. Les tests d'écriture * définissent d'abord * le comportement correct, plutôt que d'apposer un "PASS" après le fait. – bradheintz

3

Si vous faites test de premier développement, au minimum, vous devez écrire un nouveau test qui justifie le changement. Le changement pourrait alors casser les vieux tests et vous pourriez les réparer après que vous les voyiez échouer, si le changement est accessoire au test. Si, cependant, vous savez que le test utilisé pour tester l'ancien comportement et il a juste besoin de changer pour le nouveau comportement, il n'y a aucune raison de ne pas simplement changer ce test au lieu d'en écrire un nouveau.

Il ne vaut pas la peine (à mon avis) de déterminer quels tests vont rompre avec le changement et de les changer tous d'abord parce que le coureur d'essai vous dira qu'après avoir effectué le changement.

EDIT (en réponse au commentaire): Je préfère écrire le premier test, mais qui est le style TDD. Dans ce cas, le test entraîne la conception. Il y a aussi un rythme et un modèle pour ce type de développement (refactor rouge-vert). L'inverse est plus le pur test de l'unité, vous avez déjà conçu et mis en œuvre ce que vous voulez, maintenant vous le testez. Il n'y a rien de mal à cela, c'est une approche de développement différente et le choix ne dépend pas de l'existence d'autres tests. C'est vraiment une approche de développement en général.

+0

Dans mon cas particulier, les anciens tests devraient tous fonctionner comme ils sont écrits. J'ajoute simplement un ensemble supplémentaire de fonctionnalités à une méthode particulière qui n'est déclenchée par aucun test existant, donc je dois écrire de nouveaux tests pour couvrir cela. Souhaitez-vous d'abord écrire ces tests, ou faire le changement et ensuite coder les nouveaux tests? Je tiens pour acquis que tous les anciens tests devraient encore fonctionner. – Jason

+0

Les bonnes nouvelles sont, vous ne devez pas le prendre pour acquis - vous pouvez exécuter les tests. Parce que je trouve le processus TDD utile dans mon propre travail, je suggèrerais d'écrire les tests en premier - définir quantitativement ce que vous voulez que le code fasse avant de l'implémenter. Voir ma réponse pour plus de détails. – bradheintz

-1

Personnellement, je préfère d'abord écrire la fonctionnalité et ensuite faire les tests unitaires (si cela est approprié à la fonctionnalité spécifique). Si c'est quelque chose qui ne vaut pas vraiment le test unitaire, je le passe d'habitude. J'ai trouvé que, c'est généralement une perte de temps pour ajouter un test unitaire au code all que vous écrivez. Il y a certainement des endroits où il est très utile de l'avoir, mais cela ne s'étend pas à tout votre code.

Il est facile de repérer la productivité perdue lorsque vous refactoring quelque chose, et se rendre compte que vous avez cassé la moitié des tests unitaires qui ne vraiment pas ajouter de la valeur pour commencer; puisqu'une faute aurait été facilement repérée en premier lieu. Donc tout cet effort est une perte de temps. Si vous travaillez dans un environnement où il n'y a pas d'incitation à livrer rapidement et à s'adapter rapidement, alors je suppose qu'il est possible d'avoir des tonnes de tests unitaires. Autrement, vous avez juste augmenté vos coûts d'un tas sans ajouter beaucoup plus de valeur à vos utilisateurs.

+0

Si vous cassez la moitié de vos tests, vous ne refactorisez pas; vous faites des changements fonctionnels. Le refactoring ne modifie pas le comportement observable du logiciel. – bradheintz

2

J'avouerai que parfois je triche. Si un changement est assez simple pour que je puisse connaître le résultat avec certitude, je vais parfois changer de code, puis tester. Comme si je multiplie un nombre par une constante, et tout ce que je fais change la constante, je vais aller de l'avant avec le changement et mettre à jour le cas de test par la suite.

Si vous êtes bien, en faisant quoi que ce soit même un peu plus complexe, je vous conseille de coller à l'orthodoxie TDD et changer le premier test. Définissez ce que vous voulez faire avant de le faire.Aussi, je recommande de mettre de nouveaux tests après tests préexistants, de sorte que les tests liés aux fonctionnalités existantes que vous souhaitez conserver soient exécutés en premier, vous assurant que vous n'avez rien cassé (ou vous avertir le plus tôt possible que tu as).

+0

+1 pour l'honnêteté et le pragmatisme. –

Questions connexes