Test unitaire: quelle utilité ?

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : Test unitaire: quelle utilité ?

Re: Test unitaire: quelle utilité ?

par MarcAgile » 22 avr. 2014, 21:32

Dans le genre inutile, je réponds 3 ans après =D> ... on ne sait jamais si le fantôme de mario vient lire ma réponse :priere:

En ce qui me concerne, je suis agiliste (non encore tout à fait agile, c'est assez difficile je trouve). En tant que tel, je pratique le TDD et le BDD dès que je le peux : en disant "dès que je le peux", je veux dire par là qu'il n'est pas toujours facile d'avoir un framework de test qui tienne la route, prêt à l'emploi ou assez simple à intégrer dans le workflow déjà existant du code que l'on maintien. Bref.

En TDD, comme en BDD, le développement est guidé par les tests : TDD signifiant Test-Driven-Development et en français Développement-Dirigé-par-les-Tests. En quelques mots simples (et malheureusement simplistes), il s'agit lorsque je veux réaliser quelque chose :
1) d'en écrire le plus petit test me permettant d'avancer dans la solution à mon problème. Le test en question ne peut pas être vert (= fonctionner sans erreur) car je n'ai pas réalisé le travail (que le test me demande de réaliser).
2) Le test étant donc rouge, je fais le nécessaire pour le faire passer au vert au plus vite : en implémentant la fonctionnalité requise par le test.
3) J'ai réussi, mon test est vert et là, je dois revoir mon code pour le rendre plus propre (= refactoring). Là, je prends le temps nécessaire pour faire le travail au mieux... si nécessaire, je rajoute d'autres tests (mais là, ça devient trop complexe pour être expliquer en deux mots).
4) Mon test est vert. Mon code réalisé est refactoré (donc relativement propre). Je peux donc retourner à l'étape 1 pour continuer mon travail.

Le but (difficile) est d'arriver à écrire une suite de tests "unitaires" me permettant de me guider dans l'écriture (l'implémentation) de la fonctionnalité finale que je veux obtenir. Typiquement, il n'est pas rare qu'une "simple" fonctionnalité prennent des dizaines de tests unitaires pour être réalisé complètement (dans un seul cas particulier).

Avec cette manière de faire, il n'est pas question de se demander quand faire des tests et quand ne pas en faire : aucun code ne peut apparaître ni exister avant l'écriture d'un code de test. Notez que quand j'écris un test, je code déjà puisque du code de test, c'est du code !

Les problèmes relever par le fait que "plus y a de code, plus y a de tests" et qu'après ça devient plus ou moins ingérable... sont une réalité. Mais là, on quitte le domaine des tests unitaires uniquement lorsque l'on parle d'une telle complexité car typiquement les tests unitaires sont des tests de fonctions (!) et par extensions, des tests de fonctions de classes. C'est "tout" !
Le nombre de ces tests n'est donc pas bien grand et ne dépend que du nombre de fonctions à tester dans une classe (donc le nombre de fonction, sauf les getters :o~ enfin, on peut les tester aussi pourquoi pas :roll: ). Lorsque je refactore une classe tellement violemment que je doive détuire quasiment la classe en question, il est clair que tous les tests sont à jeter à la poubelle...
Ceci est vrai et faux à la fois ! car il est rare d'avoir à refactorer du code en l'écrivant complètement du début à la fin : ça ne s'appelle pas du refactoring d'ailleurs mais de le réécriture. Et c'est très rare (mais ça arrive... dans le cas notamment du code vieux et relativement difficile à maintenir).

Lorsque l'on développe en TDD :
1) les tests ne sont plus juste des "tests" qui certifient qu'un travail est bien fait : l'ensemble de ces tests constitue une documentation "fonctionnelle" de ce que doit faire chaque fonction ; on appelle ça parfois les "spécifications d'une fonction".
2) les tests permettent de guider dans l'écriture du code d'implémentation : oui, car tant que le test est rouge, le travail n'est pas réalisé. On a donc une idée bien claire d'où on doit arriver ! et on sait qu'on a fini le travail dès que le test devient vert : il faut donc l'exécuter le plus souvent possible, en général une fois chaque fois qu'on écrit quelque chose qui compile (donc à chaque fois qu'une ligne de code est écrite ou modifidiée ! et oui). Il n'est pas rare de lancer les tests unitaires toutes les 10s quand on est vraiment super bon (c'est pas moi hey #-o )
3) les tests consistuent la première documentation par l'exemple du code que l'on développe : oui, car dans les tests, on a une utilisation du code que l'on écrit, les tests sont donc les premiers codes clients des fonctions que l'on développe... plus qu'une doc de l'API seulement, nous avons donc un exemple réel d'utilisation viable des fonctions... de TOUTES les fonctions et dans TOUS les cas requis, c'est-à-dire TOUS les cas testés.

Enfin, dans le BDD, le problème devient autre... BDD voulant dire Behaviour-Driver-Development ce qui signifie Développement-Dirigé-par-le-Comportement (ou plutôt dirigé par le haut comportement fonctionnelle) : là, ce ne sont plus des tests unitaires mais des tests dits "fonctionnelles", on y spécifie donc les résultats finaux que l'on veut obtenir.
Le BDD est donc au logiciel ce que le TDD est à la fonction, des tests du logiciel au niveau le plus haut (utilisateur) du logiciel lui-même, de l'application. Trop long à expliquer, c'est à ce niveau de tests que la gestion devient très compliqué à cause du nombre potentiel de tests, de l'explosion combinatoire qui oblige une stratégie de choix des tests, de leur maintien etc. Et c'est à ce niveau aussi que les tests, très mal écrits, deviennent instables et donc très difficile à gérer.

Re: Test unitaire: quelle utilité ?

par devlop78 » 12 juil. 2011, 03:54

Oh la (V|R)ache !

:arrow:

Re: Test unitaire: quelle utilité ?

par AoSiX » 11 juil. 2011, 13:27

http://www.la-rache.com/

d'autres questions ?

Re: Test unitaire: quelle utilité ?

par Nagol » 11 juil. 2011, 12:24

T'es hors sujet Aosix, on parle des paradoxes et des théories socio-mathematico-philosophiques

Re: Test unitaire: quelle utilité ?

par AoSiX » 11 juil. 2011, 10:10

J'ai tout lu *fin du mode courage*

Et après y avoir réfléchi et parlé un peu avec mon supérieur hiérarchique ( qui n'est pas développeur mais qui connais les compétences de mon binôme ), ça passe aux oubliettes, car il(=mon binôme) n'a pas la rigueur nécessaire pour suivre ce genre de plans ( déjà qu'il ne comprend pas que les requêtes SQL se font dans les modèles malgré tout le mal que je me suis donné à expliquer ça ... ).

Cependant, si vous avez des ressources ( Tutos, vidéos ... je sais que les livres c'est le top, mais je suis en période de forte économie :( ), en anglais ou en français, je prendrai sur mon temps libre pour m'y mettre doucement !

Merci beaucoup pour vos explications, et pour vos super théorie, paradoxe, dilemne, et autres trucs :lol:

Re: Test unitaire: quelle utilité ?

par Berzemus » 11 juil. 2011, 10:03

de paradoxes à la logique fallacieuse..
Hum, le paradoxe du barbier fonde quand même la théorie des ensembles ...
:roll:

Re: Test unitaire: quelle utilité ?

par Nagol » 09 juil. 2011, 13:36

[...]il me semble qu'il faut plus de fautes de français que moi.
:langue:

Bon, je suis pas super bien placé pour faire ça, mais comme tu m'as piqué mon idée plus tôt, eh bien je me venge |(X
spa une faute de français, c'est une faute de frappe :)

Re: Test unitaire: quelle utilité ?

par epommate2 » 09 juil. 2011, 12:11

je précise que malgré les apparences, epommate2 et moi sommes bien deux personnes différentes :)

PS: pour s'en convaincre, il me semble qu'il faut plus de fautes de français que moi.
Oui, je sais, c'est une catastrophe ... :oops: Dommage qu'il n'y ai pas de compilateur de français ...

Re: Test unitaire: quelle utilité ?

par zeus » 09 juil. 2011, 11:49

[...]il me semble qu'il faut plus de fautes de français que moi.
:langue:

Bon, je suis pas super bien placé pour faire ça, mais comme tu m'as piqué mon idée plus tôt, eh bien je me venge |(X

Re: Test unitaire: quelle utilité ?

par Nagol » 09 juil. 2011, 11:02

je précise que malgré les apparences, epommate2 et moi sommes bien deux personnes différentes :)

PS: pour s'en convaincre, il me semble qu'il fait plus de fautes de français que moi.

Re: Test unitaire: quelle utilité ?

par epommate2 » 09 juil. 2011, 08:07

parmi ceux qui ont répondus, qui a utilisé les tests sur des mois, et qui en est revenu ?
Oui, moi, j'en utilise d'ailleurs encore comme je le signale un peu plus haut. Mais complétement cantonné à des algorithmes complexes avec beaucoup de cas limites. Je pense que j'en utilise depuis deux ans, notamment au début de manière assez intensives sur un projet Java (quasiment autant de code de test que d'appli...). Bon, après c'est clair que je prétend pas être le super champion du test et que je peux probablement m'améliorer dans ce domaine, mais cela a cessé d'être la panacée comme je le croyais au départ (j'ai même fait de la promotion pour le TDD).

Pour mon environnement, je ne travaille plus que sur des projets de une ou deux personnes (ce que je préfère largement au travail d'équipes [ je suis un ours ?]), je suis le client de ces projets pour 75% d'entre eux [et en plus je vis dans une cave ?].

En ce qui concerne l'argument de dire que le test est plus intéressant quand on est plusieurs, cela me conforte alors dans l'idée que plus on est nombreux et plus le temps de développement totale va augmenter. J'ai pour habitude de penser que s'il faut un jour pour un développeur pour faire un truc, alors il faut N jour pour N développeur pour faire le même truc ... dans le meilleur cas :-)
de paradoxes à la logique fallacieuse..
Hum, le paradoxe du barbier fonde quand même la théorie des ensembles ...

Re: Test unitaire: quelle utilité ?

par Berzemus » 09 juil. 2011, 00:16

Dites, on a un débat intéressant la, inutile de l'aggrémenter de paradoxes à la logique fallacieuse..

...

oh, bon d'accord, le lien wikipedia qui fait autorité: http://fr.wikipedia.org/wiki/Sophisme

Re: Test unitaire: quelle utilité ?

par Nagol » 08 juil. 2011, 21:51

Oui ...
Voilà, j'ai retrouvé ce à quoi ça me faisait penser : http://fr.wikipedia.org/wiki/Paradoxe_du_menteur
Dans une moindre mesure ca emmène vers :

http://fr.wikipedia.org/wiki/Dilemme_du_prisonnier

qui n'a pas d'interêt en programmation mais en sociologie et dans la vie de tous les jours (genre dans la politique d'une entreprise) ça en a :)

Re: Test unitaire: quelle utilité ?

par zeus » 08 juil. 2011, 21:31

ok, quand je me un smiley, c'est qu'il ne faut pas forcément prendre au pied de la lettre ce qui est avant :-)
Ok mais la tu mets un smiley donc doit on ne pas prendre au pied de la lettre quand tu dis que faut pas forcément prendre au pied de la lettre?
...
ou pas?
Nan mais zut quoi ! Quand j'ai lu le fil, je voulais la faire :cry:

Bon, sinon, ma question concernant l'environnement de travail de epommate2 (et qui aurait pu être pour develop78) est que le test manuel est encore fiable quand on est tout seul, sur des projets moyen.
Quand on travaille à 5 sur un projet, que l'on produit des dizaines d'interfaces, c'est utopique de penser que toute personne va tester tout les écrans. Et, immanquablement, il y aura des regressions. Comme vous semblez friands d'explication théorique, je vous donne le principe qui régit mon travail : la loi de Murphy.

Pour moi, les tests sont nécessaires pour s'assurer que la fonctionnalité pour laquelle un développeur a travaillé fonctionne tout le temps, sans passer des heures et des heures à tout retester à la main.

Maintenant, pour rebondir sur ce qui a été dit plus tôt, il ne faut pas croire que les tests unitaires testent tout et garantissent que tout marche tout le temps.
Les tests unitaires testent ce que le développeur a pensé à tester. Si un code se retrouve face à un cas de figure non prévu par le développeur, et qu'il n'aura donc pas prévu, aucun test unitaire ne pourrait détecter ça.

En fait, j'ai une question simple, et qu'il ne faut surtout pas prendre comme une insulte ou quelque chose du genre :
parmi ceux qui ont répondus, qui a utilisé les tests sur des mois, et qui en est revenu ? De tête, il me semble qu'il n'y a que Berzemus, mais il travaille seul.

Cette question n'est pas innocente, je voudrais juste savoir si ceux qui se positionnent contre les ont réellement utiliser, sur des mois, avec plusieurs personnes. ;)

Re: Test unitaire: quelle utilité ?

par devlop78 » 08 juil. 2011, 21:05

Oui ...

Voilà, j'ai retrouvé ce à quoi ça me faisait penser : http://fr.wikipedia.org/wiki/Paradoxe_du_menteur

Un petit dernier pour la route
Plus il y a de fromage, plus il y a de trous ;
or plus il y a de trous, moins il y a de fromage ;
donc plus il y a de fromage, moins il y a de fromage.