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 :D 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 :D

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 :