Le coût des tests unitaires

Les tests unitaires sont un thème récurrent pour moi ces dernières semaines; entre les discutions sur Stackoverflow et d’autres forums et les tests que j’écris pour deux projets en cours, je me suis posé quelques questions quant au coût réel de ces tests unitaire.

C’est surtout un article de Thomas Brandt (en allemand: « TDD in der (meiner) Praxis – Wunsch und Wirklichkeit ») qui m’a fait réfléchir sérieusement. Dans son article Brandt décrit assez bien le gouffre bel et bien présent entre la théorie et la pratique du Test Driven Developpement. De but en blanc, il adhère plutôt aux principes du TDD;

Je dois tout d’abord dire que le Test Driven Development, surtout le principe „test first“, est une manière plutôt « sexy » de développer. Elle permet très certainement d’améliorer l’architecture du logiciel et nous évite de faire certaines (petites) erreurs.
— Traduction relativement libre des propos de T. Brandt

Il considère donc TDD comme un outil performant – du moins d’un point de vue purement académique. Mais la suite immédiate constitue un doute;

La question est simplement: à quel prix?

Comme dit, hormis T. Brandt et moi, bien d’autres personnes semblent se poser la question, et la question la plus fréquente est la suivante: est-ce que l’utilisation de tests unitaires produit-elle réellement des logiciels de meilleure qualité, et est-ce que les efforts à investir sont-ils réalistes?

Condensée, la question se résume à un simple:

Ça me coûte combien les tests unitaires?

Souvent la question implique, que celui qui la pose pense que les tests unitaires sont bien trop chers pour les appliquer de manière conséquente. Je me souviens d’une discussion que j’ai eue à propos de l’intérêt d’une couverture de test totale en dehors de l’idéal théorique. Rapporté aux efforts à fournir j’ai répondu que « non » à l’époque.

Au jour d’aujourd’hui je trouve que toutes ces questions sont simplement mal posées, car ce n’est pas connaitre le coût des tests unitaires qui est important, mais:

Combien me coûte l’omission des tests unitaires?

Et voici ma réponse, illustrée à l’aide d’un exemple concret;

L’un de mes projets actuels comprend un grand nombre de composantes distribuées. J’ai découvert une erreur dans le projet, ce qui m’a forcé à refactoriser deux classes. Le tout m’a pris environ 1 heure. Lancer les tests unitaires? Environ 30 secondes. 30 secondes qui m’ont fait découvrir que certains comportements n’étaient plus comme prévus initialement. Il m’a fallu environ 20minutes pour les corrections. L’écriture des tests m’avaient coûté environ 45min.
Le bilan est donc environ de deux heures.

Sans les tests unitaires, je n’aurais surement pas remarqué une partie des erreurs immédiatement. J’aurais donc eu 1 heure de refactorisation, plus un temps plus ou moins indéterminable, certainement réparti sur plusieurs jours, pour corriger les problèmes passés inaperçus lors du changement. La probabilité que ce temps dépasse largement une heure est relativement grande (débugger « à la main », recréer les conditions dans des applis multi-threadées etc…).

Pour ma part, je conclus que pouvoir calculer avec un temps défini (en ayant des tests couvrant une partie réaliste du logiciel – pas 100%) est plus intéressant que la navigation à l’aveuglette tant pratiquée.

Faites des tests! ;)



Partager cet article:

Laisser un commentaire