« LeSS - Tests unitaires » : différence entre les versions
De Wiki Agile
m Ajout encadré |
|||
| (17 versions intermédiaires par 2 utilisateurs non affichées) | |||
| Ligne 6 : | Ligne 6 : | ||
---- | ---- | ||
Traducteur : Nicolas Mereaux<br /> | Traducteur : Nicolas Mereaux<br /> | ||
Relecteur : Fabrice Aimetti<br /> | |||
Date : 29/06/2022<br /> | Date : 29/06/2022<br /> | ||
---- | ---- | ||
| Ligne 73 : | Ligne 74 : | ||
=== Le test unitaire n’est pas aussi vital que le code en production === | === Le test unitaire n’est pas aussi vital que le code en production === | ||
Il est vrai qu’en fin de compte, c’est le code en production qui donne vraiment vie au produit. Mais la plupart des produits logiciels ont des cycles de vie évolutif. Le code n’est pas statique. Il change avec le temps. Un code sans test unitaire n’est pas suffisamment protégé lorsqu’une modification est faite. Le test unitaire contient aussi des informations importantes qui ne sont pas présentes dans le code en production. | |||
Il est vrai qu’en fin de compte, c’est le code en production qui donne vraiment vie au produit. Mais la plupart des produits logiciels ont des cycles de vie évolutif. Le code n’est pas statique. Il change avec le temps. | |||
Par conséquent le test unitaire est tout aussi important que le code en production. Il devrait être stocké '''dans le même dépôt de gestion du code source'''. Le test unitaire devrait d’ailleurs suivre les mêmes conventions de codage que le code en production. | Par conséquent le test unitaire est tout aussi important que le code en production. Il devrait être stocké '''dans le même dépôt de gestion du code source'''. Le test unitaire devrait d’ailleurs suivre les mêmes conventions de codage que le code en production. | ||
=== Le test unitaire est fait par des ingénieurs tests === | === Le test unitaire est fait par des ingénieurs tests === | ||
L’objectif du test unitaire n’est pas de trouver des anomalies. Techniquement, il ''vérifie'' plutôt que ''teste'' si le code sous test a implémenté le comportement voulu par le développeur qui l’a conçu. Donc le choix logique est de simplement laisser la même personne écrire à la fois le test et le code sous test. | L’objectif du test unitaire n’est pas de trouver des anomalies. Techniquement, il ''vérifie'' plutôt que ''teste'' si le code sous test a implémenté le comportement voulu par le développeur qui l’a conçu. Donc le choix logique est de simplement laisser la même personne écrire à la fois le test et le code sous test. | ||
Il est aussi encouragé d’avoir deux ou plusieurs personnes travaillant de concert pour programmer à la fois le test et le code sous test. Il existe plusieurs manières sympa pour programmer en binôme. Vous trouverez davantage d’informations à ce sujet dans la section développement piloté par les tests. | Il est aussi encouragé d’avoir deux ou plusieurs personnes travaillant de concert pour programmer à la fois le test et le code sous test. Il existe plusieurs manières sympa pour programmer en binôme. Vous trouverez davantage d’informations à ce sujet dans la section développement piloté par les tests. | ||
=== Vous pouvez écrire des tests unitaires sans changer le code sous test. === | === Vous pouvez écrire des tests unitaires sans changer le code sous test. === | ||
Ce n’est pas toujours le cas. Si le code n’a pas une bonne testabilité, vous pourriez tout de même être capable techniquement d’écrire le test unitaire qui va avec. Mais un test unitaire qui a été écrit pour un code non-testable est généralement très difficile à maintenir et à comprendre. Par conséquent, il n’y a pas vraiment de raison d’en avoir un. | Ce n’est pas toujours le cas. Si le code n’a pas une bonne testabilité, vous pourriez tout de même être capable techniquement d’écrire le test unitaire qui va avec. Mais un test unitaire qui a été écrit pour un code non-testable est généralement très difficile à maintenir et à comprendre. Par conséquent, il n’y a pas vraiment de raison d’en avoir un. | ||
'''Le secret du test unitaire n’est pas d’écrire du test, mais d’écrire un code testable sous test.''' Nous voulons du code testable et facile à tester, ce qui s’avère une démarche gagnant-gagnant. Nous ne voulons pas de code non-testable et difficile à maintenir, ce qui serait une démarche perdant-perdant. | |||
'''Le secret du test unitaire n’est pas d’écrire du test, mais d’écrire | |||
=== Je peux ajouter les tests unitaires plus tard === | === Je peux ajouter les tests unitaires plus tard === | ||
Eh bien, essayez donc de demander à des grimpeurs de mettre leurs pitons plus tard. | Eh bien, essayez donc de demander à des grimpeurs de mettre leurs pitons plus tard. | ||
[[Image:Xunit_test_fr.png|Xunit_test_fr.png|border|link=|500px]] | [[Image:Xunit_test_fr.png|Xunit_test_fr.png|border|link=|500px]] | ||
== Schéma pour de bons tests unitaires == | == Schéma pour de bons tests unitaires == | ||
=== Pas de nouvelles, bonnes nouvelles === | === Pas de nouvelles, bonnes nouvelles === | ||
Si le test passe, il devrait afficher seulement OK (voire quelques points pour afficher son avancement). Aucune autre information n'est nécessaire. | |||
Si le test passe, il devrait afficher seulement OK (voire quelques points pour afficher son avancement). Aucune autre information nécessaire. | |||
[[Image:unit_test_success.png|unit_test_success.png|border|link=|800px]] | [[Image:unit_test_success.png|unit_test_success.png|border|link=|800px]] | ||
Règle empirique : | |||
Aucune intervention humaine ne devrait être nécessaire pour préparer l’exécution du test, exécuter les cas de tests ou en vérifier les résultats. | |||
Et lorsqu’un test unitaire échoue, il devrait nous fournir toutes les informations nécessaires. L’objectif est de limiter la durée pendant laquelle vous êtes occupé à débogguer le code concerné. | |||
[[Image:342xNxunit_test_fail.png|342xNxunit_test_fail.png|border|link=]] | [[Image:342xNxunit_test_fail.png|342xNxunit_test_fail.png|border|link=]] | ||
=== Arranger, Agir, Auditer (''Arrange'', ''Act'', ''Assert'') === | === Arranger, Agir, Auditer (''Arrange'', ''Act'', ''Assert'') === | ||
Un bon schéma à suivre en ce qui concerne les tests unitaires est "'''AAA'''" : '''Arrange (dans le sens de mettre en place)''', '''Act (dans le sens d’une action faite sur quelque chose)''' et '''Assert (dans le sens de contrôler)'''. | |||
Si vous pouvez repérer ce schéma dans chacun de vos cas de tests, vos tests devraient être facile à comprendre, et ils devraient s’avérer suffisamment spécifiques et aller droit au but. Un cas de test unitaire devrait tester une seule et unique chose. Par conséquent, il devrait y avoir un seul AAA dans un cas de test. Un cas de test ne devrait pas être très prolixe (c’est-à-dire plus de 10 lignes de code) s’il suit le schéma AAA. | |||
Si vous pouvez repérer ce schéma dans chacun de vos cas de tests, vos tests devraient facile à comprendre, et ils devraient s’avérer suffisamment spécifiques et aller droit au but. Un cas de test unitaire devrait tester une seule et unique chose. Par conséquent, il devrait y avoir un seul AAA dans un cas de test. Un cas de test ne devrait pas être très prolixe (c’est-à-dire plus de 10 lignes de code) s’il suit le schéma AAA. | |||
<pre>import unittest class TestGroupForTextWrapping(unittest.TestCase): | <pre>import unittest class TestGroupForTextWrapping(unittest.TestCase): | ||
| Ligne 161 : | Ligne 132 : | ||
=== Développement piloté par le comportement (BDD) === | === Développement piloté par le comportement (BDD) === | ||
Identique au schéma '''AAA''', le '''BDD''' utilise trois mots-clés différents pour spécifier chaque cas de test : '''Étant donné''', '''Lorsque''' et '''Alors'''. (Vous pouvez aussi utiliser '''Et''' comme mot-clé supplémentaire) | |||
<pre> | |||
Given / Étant donné que la longueur du texte pour le retour à la ligne est défini à 10 | Given / Étant donné que la longueur du texte pour le retour à la ligne est défini à 10 | ||
And / Et que le caractère '-' est utilisé comme connecteur entre deux mots | And / Et que le caractère '-' est utilisé comme connecteur entre deux mots | ||
When / Lorsque la longueur du texte est inférieure à 10 | When / Lorsque la longueur du texte est inférieure à 10 | ||
Then / Alors le texte ne devrait pas être retourné à la ligne</pre> | Then / Alors le texte ne devrait pas être retourné à la ligne</pre> | ||
Comme vous pouvez le constater, le triptyque "étant donné - lorsque - alors" s'allie plutôt bien avec le triptyque "Arrange - Act - Assert". Ils définissent tous les deux un état transition d’une machine à état finie. Vous pouvez en savoir plus en consultant cet article d’[https://sites.google.com/site/unclebobconsultingllc/the-truth-about-bdd Oncle Bob]. Voici quelques différences entre les deux : | |||
* Le BDD est davantage orienté "dehors vers dedans", cela veut dire qu’il met davantage l’accent sur le comportement externe | |||
* Le BDD est davantage | * Avec le BDD, vous devez définir un '''langage spécifique au domaine''' pour écrire vos spécifications de tests. À cause de cela, vous aurez besoin généralement d’un ''framework'' supplémentaire. Par exemple, pour Python vous pourrez utilisez [https://pypi.org/project/behave/ behave]. | ||
* Avec le BDD, vous devez définir un '''langage spécifique au domaine''' pour écrire vos spécifications de tests. À cause de cela, vous aurez besoin généralement d’un ''framework'' supplémentaire. Par exemple, pour Python vous pourrez utilisez [ | |||
=== La règle d’or du test unitaire === | === La règle d’or du test unitaire === | ||
De manière générale, une bonne règle d’or pour des tests unitaires serait : | De manière générale, une bonne règle d’or pour des tests unitaires serait : | ||
'''Chaque cas de test unitaire devrait comporter un périmètre très restreint.''' | |||
De telle manière que : | De telle manière que... : | ||
* Lorsque le test échoue, qu’il ne soit pas nécessaire de faire du déboggage pour localiser le problème. | * Lorsque le test échoue, qu’il ne soit pas nécessaire de faire du déboggage pour localiser le problème. | ||
* Les tests soient stables car les dépendances sont limitées. | * Les tests soient stables car les dépendances sont limitées. | ||
* Il y ait moins de duplications, que ce soit plus facile à maintenir | * Il y ait moins de duplications, que ce soit plus facile à maintenir. | ||
Il n’existe pas de secrets pour écrire un bon test unitaire. Afin d’écrire un bon test unitaire, vous devez créer une conception qui soit facile à tester. | Il n’existe pas de secrets pour écrire un bon test unitaire. Afin d’écrire un bon test unitaire, vous devez créer une conception qui soit facile à tester. | ||