TL; DR
Écrire de bons tests utiles est difficile et a un coût élevé en C ++. Pouvez-vous des développeurs expérimentés partager votre justification sur quoi et quand tester?
Longue histoire
J'avais l'habitude de faire du développement piloté par les tests, toute mon équipe en fait, mais cela ne fonctionnait pas bien pour nous. Nous avons de nombreux tests, mais ils ne semblent jamais couvrir les cas où nous avons de réels bugs et régressions - qui se produisent généralement lorsque les unités interagissent, et non de leur comportement isolé.
C'est souvent si difficile à tester au niveau de l'unité que nous avons cessé de faire TDD (sauf pour les composants où cela accélère vraiment le développement), et avons plutôt investi plus de temps pour augmenter la couverture des tests d'intégration. Bien que les petits tests unitaires n'aient jamais détecté de vrais bogues et n'étaient essentiellement que des frais de maintenance, les tests d'intégration en valaient vraiment la peine.
Maintenant, j'ai hérité d'un nouveau projet et je me demande comment procéder pour le tester. C'est une application native C ++ / OpenGL, donc les tests d'intégration ne sont pas vraiment une option. Mais les tests unitaires en C ++ sont un peu plus difficiles qu'en Java (vous devez faire explicitement des trucs virtual
), et le programme n'est pas fortement orienté objet, donc je ne peux pas me moquer de certaines choses.
Je ne veux pas déchirer et OO-ize le tout juste pour écrire des tests pour le plaisir d'écrire des tests. Je vous demande donc: pour quoi dois-je écrire des tests? par exemple:
- Fonctions / classes que je m'attends à changer fréquemment?
- Fonctions / classes plus difficiles à tester manuellement?
- Fonctions / Classes déjà faciles à tester?
J'ai commencé à enquêter sur quelques bases de code C ++ respectueuses pour voir comment elles procèdent aux tests. En ce moment, je regarde le code source de Chromium, mais j'ai du mal à extraire leur justification de test du code. Si quelqu'un a un bon exemple ou un article sur la popularité des utilisateurs de C ++ (gars du comité, auteurs de livres, Google, Facebook, Microsoft, ...), ce serait très utile.
Mise à jour
J'ai cherché sur ce site et sur le Web depuis que j'ai écrit ceci. J'ai trouvé de bonnes choses:
- Quand est-il approprié de ne pas effectuer de test unitaire?
- /programming/109432/what-not-to-test-when-it-come-to-unit-testing
- http://junit.sourceforge.net/doc/faq/faq.htm#best
Malheureusement, tous ces éléments sont plutôt centrés sur Java / C #. L'écriture de nombreux tests en Java / C # n'est pas un gros problème, donc l'avantage surpasse généralement les coûts.
Mais comme je l'ai écrit ci-dessus, c'est plus difficile en C ++. Surtout si votre base de code n'est pas si-OO, vous devez sérieusement gâcher les choses pour obtenir une bonne couverture de test unitaire. Par exemple: l'application dont j'ai hérité a un Graphics
espace de nom qui est une fine couche au-dessus d'OpenGL. Afin de tester l'une des entités - qui utilisent toutes directement ses fonctions - je devrais transformer cela en une interface et une classe et l'injecter dans toutes les entités. Ce n'est qu'un exemple.
Donc, en répondant à cette question, gardez à l'esprit que je dois faire un investissement assez important pour écrire des tests.