Avez-vous déjà ajouté des tests unitaires, après le fait, au code hérité? À quel point le code était-il compliqué et à quel point il était difficile de tout gâcher Le résultat final en valait-il la peine?
Réponses
Trop de publicités?La meilleure façon, j'ai trouvé, c'est d'ajouter de manière incrémentielle les tests unitaires, de ne pas simplement sauter dans et dire que nous allons maintenant l'unité de test de l'application.
Donc, si vous allez toucher au code, pour les corrections de bugs ou de refactoring, puis la première à écrire les tests unitaires. Pour les bugs tests unitaires vous aidera à prouver d'où le problème est, comme vous pouvez le dupliquer.
Si refactoring, vous aurez envie d'écrire des tests unitaires, mais vous pouvez constater que le test est impossible d'écrire, de sorte que vous pouvez avoir besoin de trouver un niveau élevé, qui appelle la fonction qui va être refait, et l'unité de test de la partie. Alors, comme vous le refactor l'offensive de la fonction, écrire vos tests, vous pouvez vous assurer qu'il fonctionne comme il le devrait.
Il n'y a pas de moyen facile de le faire.
Cette question peut vous aider avec des suggestions. http://stackoverflow.com/questions/748503/how-do-you-introduce-unit-testing-into-a-large-legacy-c-c-codebase
Michael Plumes livre "Travailler Efficacement avec les Legacy Code" est un livre entier sur ce thème. Michael affirme qu'il est souvent trop difficile à introduire des tests de code legacy, car il n'est pas structuré pour être testées. Ce que j'ai reçu le livre le plus, c'est un couple de motifs nommé "de germes de fonctions" et "de Germination des classes". D'un germe de fonction est celui qui incarne le changement que vous devez faire dans le code. Vous avez alors l'unité de tester ces fonctions. La germination de la classe est la même idée à l'exception de la nouvelle fonctionnalité est contenue dans une classe.
Oui, et c'est généralement douloureux. J'ai souvent fini par avoir à écrire des tests d'intégration à la place.
Le livre L'Art de Tests Unitaires a quelques bons conseils sur ce. Il recommande également le livre de Travailler de façon Efficace avec le Code existant; je n'ai pas lu le dernier encore, mais il est sur ma pile.
EDIT: Mais oui, même un minimum de couverture de code en valait la peine. Il m'a donné confiance et un filet de sécurité pour la refactorisation du code.
EDIT: je n'ai lu de Travailler de façon Efficace avec le Code existant, et il est excellent.
Une alternative aux tests unitaires, également mis en place dans de Travailler de façon efficace avec le code existant est les tests de caractérisation. J'ai eu des résultats intéressants avec de tels tests. Ils sont plus faciles à mettre en place de tests unitaires comme vous le test de point que ce qui peut être testé (appelé couture). L'inconvénient est que, lorsqu'un test échoue, vous avez moins d'indication sur l'emplacement du problème que l'aire sous test peut être beaucoup plus grande qu'avec les tests unitaires. La journalisation de l'aide ici.
Une unit test framework tels ceux de la xUnit de la famille peuvent être utilisées pour écrire les tests de caractérisation.
Dans de telles épreuves, écrites après les faits, les assertions de vérifier le comportement actuel du code. Contrairement aux tests unitaires, ils ne prouvent pas que le code est correct, ils sont juste épingler le bas (caractérisation) le comportement actuel du code.
Le processus est le même que le TDD,:
- écrire un test pour une portion de code
- exécuter fail
- fixer le test à partir du comportement observé du code
- exécuter elle - pass
- répétez
Les tests échouent si vous modifier le comportement externe du code. Comportement externe du code ? cela vous semble familier ? Oui, il est, nous sommes ici. Maintenant, vous pouvez refactoriser le code.
Évidemment, le risque dépend de la couverture des tests de caractérisation.
Jetez un coup d’œil à la bibliothèque d’utilitaires de test unitaire, open source et gratuite, ApprovalTests . Si vous êtes un développeur .NET, le créateur, Llewellyn Falco, a réalisé une série de vidéos montrant comment il utilise ApprovalTests pour améliorer le test unitaire du code nouveau et du code hérité.