L’utilité des tests unitaires

Posté le dimanche 23 mai 2010 à 22 h 43, Read it in english with Google

On en entends beaucoup parler: « il faut faire des tests ! », « comment utiliser phpunit« … tout les formateurs php vous montrerons rapidement comment faire, mais au fond qui écrit vraiment des tests unitaires ?

De la théorie à la pratique il y a un grand pas. Personnellement je ne connais aucune agence de française qui écrit des tests unitaires. C’est vrai que mes connaissances sont plutôt axées web et donc une forte majorité travaille principalement sur PHP.

Pour ceux qui n’ont jamais entendu parler de cette méthode de test, un test unitaire en PHP utilise PHPUnit (le seul framewrok de tests unitaires PHP à ma connaissance) et permet de tester toutes les fonctionnalités d’une application PHP. Attention c’est pas automatique 😀 pour chaque fonctions, chaque classes, chaque méthodes vous pourrez écrire un ou plusieurs tests permettant de valider leurs bon fonctionnement en comparant, en fonction des valeurs envoyées, les valeurs de retours et ce qui devrait théoriquement être retourné. Alors évidemment toutes les fonction n’ont pas besoin de tests unitaires, mais ce sera à vous d’en juger.

Le problème (qui peut aussi être une solution) devient un peu plus complexe lorsque l’application est dépendante d’une base de donnée. Dans la plupart des cas, il vous faudra dupliquer celle-ci pour la garder fixe, car dans tout vos tests la valeur de retour est comparées à une valeur fixe (une bonne grosse statique à l’ancienne).

Faire des tests unitaires est donc utile, mais surtout long et peut devenir très compliqué. Si la fonction renvoie un objet mais que cet objet est uniquement chargé via un autre, il vous faudra étendre votre model pour pouvoir charger quand même l’objet, pour peu qu’il ne se charge pas via une méthode intégré de php… bref ça peut devenir un vrai casse tête.

Mais alors, quand utiliser les tests unitaires ?!

A mon humble avis, jamais, sauf dans des projets de très bas niveaux et difficilement modifiable une fois livrés. Même les banques n’intègre pas forcément des tests unitaires (c’est pas pour rien que certains développent encore en COBOL, faut bien fixer les bugs, même s’ils y en a qui investissent encore dedans… fous ça ! bon je ferme la parenthèse). Alors si vous croyez que la SSII même à 20M de CA va intégrer des tests unitaires… On peu en voir quelques uns dans les projets outsourcés mais même là c’est rare, parce que si les dev n’ont pas de conscience professionnel, c’est surement pas les managers qui l’auront 😀

De plus les tests utilisateurs sont suffisants et ne requièrent pas de compétences particulières, et surtout, sont beaucoup moins couteux que les tests unitaires. Ajouter à cela qu’on est en micro-pénurie de bon développeurs objets et vous pèserez vite le pour et le contre. Si vous ne codez pas pour la gloire et que le budget n’a pas une marge à faire pâlir le client s’il l’apprenait, oubliez les !

6 réponses à “L’utilité des tests unitaires”

  1. Michael

    Hello,

    Les tests unitaires sont pourtant largement employes dans les gros projets open source, je pense a la plupart des frameworks (zend, jquery, etc..), ou certain CMS. Car il primordiale, pour leur notoriete, et leur image de fiabilite de garantir une certaine stabilite.

    Car si effectivement les tests sont ecrit correctement, c’est la garantie absolue de ne jamais rencontrer de bug. Si bug il y’a, test il manquait..

    Si les tests unitaires sont aussi.. chiant.. en php, c’est parceque meme avec de superbes plugins d’autocompletion, c’est horriblement gavant a « ecrire »

    Dans d’autres langages, comme le python, les tests unitaires sont simplement magiques. Vous les ecrivez en meme temps que la documentation de votre methode/fonction ou classe. Ce sont les doctests (http://docs.python.org/library/doctest.html).

    En ecrivant vos commentaires de code, vous donnez des exemples ainsi que le resultat escompte. Quand vous souhaitez ensuite tester votre code, le script « relis » les differentes « documentation » (les commentaires), pour voir si tout se deroule comme prevu.

    Ca deviens tout de suite bcp moin chiant d’ecrire des tests, et au moins, la pluspart des docs/commentaires en python, ont la meme guelle. et ca.. j’aime.

    sinon pour finir ma petite intervention, en php, il y a simpletest. (tout aussi chiant)

    desole pour l’absence d’accent, clavier qwerty australien sous la main…

  2. XoraX

    C’est tellement intuitif que je me demande si je vais pas me mettre à en faire.
    Il y a un portage sur PHP (non testé) : http://code.google.com/p/doctest-php/

  3. jean

    Salut,
    tu as testé doctest-php ?

  4. Jonathan Petitcolas

    Je ne suis pas du tout d’accord avec l’article. 🙂

    Certes, les tests unitaires semblent fastidieux et inutiles à écrire aux premiers abords, mais il n’en est rien. Au contraire : ce sont des gains précieux de temps et assurent une fiabilité à toute épreuve de l’application (ou du site).

    Je développe avec plusieurs collaborateurs. Je suis souvent amené à modifier leur code, à ajouter d’autres méthodes, etc. Comment faire pour vérifier tout cela rapidement ? Grâce aux tests unitaires.

    Par exemple, je modifie une méthode qui est utilisé à plusieurs endroits. Deux solutions : soit je teste partout (en espérant ne pas oublier une page), soit je lance (sous Symfony) un php symfony test:all et regarde le retour. Si tout est vert, c’est que je n’ai rien cassé. 🙂

    On est plus rassurés (certain de ne pas avoir tout cassé), on est plus efficaces, et plus fiables. Bref, que du bon avec eux.

    A noter qu’il y également les tests fonctionnels, qui sont importants (si ce n’est plus importants). 😉

  5. Pablo22

    Pour ma part, je suis totalement d’accord avec l’auteur de cet article.
    Mon projet actuel met en place des tests unitaires, et résultat on multiplie par deux (voir plus) les temps de développements.
    Sachant que ce sont les développeurs eux-mêmes qui écrivent les tests unitaires, rien ne garantit que l’appli sera plus fiable qu’auparavant!
    Par ailleurs, des tests utilisateurs sont déjà en place…
    Je suis d’accord avec le principe de tests unitaires mais uniquement
    – Dans le cas d’application « O » bugs, de type nasa ou autre. Et là en général, ce sont plutôt les langages utilisés qui garantissent la fiabilité et l’absence de bugs…
    – A condition que ceux-ci soient écrits par des personnes qui ne font que ça, et à partir des spécifications fonctionnelles et techniques!

  6. Pyo

    Tes commentaires sont peut-être valables pour un site web ou, plus généralement, le développement web.
    Mais à partir du moment où tu travailles sur de plus gros logiciels, les tests unitaires sont obligatoirement nécessaires !

Laissez un commentaire :