« LeSS - Tests unitaires » : différence entre les versions
De Wiki Agile
m Ajout encadré |
|||
| (14 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 87 : | Ligne 88 : | ||
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 | '''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. | ||
=== 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)'''. | |||
Un bon schéma à suivre en ce qui concerne les tests unitaires est | |||
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. | 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. | ||
<pre>import unittest class TestGroupForTextWrapping(unittest.TestCase): | <pre>import unittest class TestGroupForTextWrapping(unittest.TestCase): | ||
| Ligne 149 : | 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. | ||