- Je parle de tests unitaires au sens TDD. ("Intégration" non automatisée, ou ce que vous aimez appeler des tests.)
- Code hérité comme dans: (C ++) code sans tests. (voir: Michael Feathers travaille efficacement avec Legacy Code )
- Mais aussi le code hérité comme dans: Code avec lequel notre équipe travaille depuis 10-5 ans, donc nous avons très souvent une assez bonne idée de l'endroit où mettre les choses pour changer quelque chose.
- Nous avons des tests unitaires en place (via Boost.Test) pour certains modules qui sont venus plus tard ou qui ont été un ajustement "naturel" pour les tests unitaires (conteneurs spécifiques aux applications courantes, trucs de chaîne, aides réseau, etc.)
- Nous n'avons pas encore de tests d'acceptation automatisés appropriés.
Maintenant, récemment, j'ai eu le «plaisir» de mettre en œuvre 3 nouvelles fonctionnalités destinées aux utilisateurs.
Chacun d'eux m'a pris environ 1 à 2 heures pour me familiariser avec les parties de code que je devais changer, 1 à 2 heures pour implémenter le (petit) code que je devais changer et encore 1 à 2 heures pour m'assurer que l'application a fonctionné correctement par la suite et a fait ce qu'il était censé faire.
Maintenant, j'ai vraiment ajouté peu de code. (Je pense qu'une méthode et quelques lignes d'appel pour chaque fonctionnalité.)
La factorisation de ce code (via l'une des méthodes suggérées dans WEwLC ), de sorte qu'un test unitaire aurait eu du sens (et n'aurait pas été une tautologie complète) aurait facilement pris encore 2 à 4 heures, sinon plus. Cela aurait ajouté 50% à 100% de temps à chaque fonctionnalité, sans aucun avantage immédiat, comme
- Je n'avais pas besoin du test unitaire pour comprendre quoi que ce soit sur le code
- Les tests manuels représentent la même quantité de travail, car j'ai encore besoin de tester si le code est correctement intégré dans le reste de l'application.
Certes, si , plus tard, "quelqu'un" venait et touchait ce code, il pourrait théoriquement bénéficier de ce test unitaire. (Seulement en théorie, car cette île de code testée vivrait dans un océan de code non testé.)
Donc, "cette fois-ci", j'ai choisi de ne pas faire le travail difficile de l'ajout d'un test unitaire: les modifications de code pour mettre ces choses sous test auraient été beaucoup plus complexes que les modifications de code pour obtenir la fonctionnalité correctement (et proprement) implémentée.
Est-ce quelque chose de typique pour un code hérité fortement couplé? Suis-je paresseux / fixons-nous les mauvaises priorités en équipe? Ou suis-je prudent, ne testant que des choses où les frais généraux ne sont pas trop élevés?