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 :