BUT1-R2.03 - année 2022/23
Sébastien HOUZÉ
20 ans d'XP, de développeur à CTO en passant par responsable qualité logicielle.
🤯 À chaque fois que vous écrivez du code - pour le tester - vous passez votre temps à le sauvegarder et à l'exécuter manuellement. C'est fastidieux.
🤕 Au bout d'un moment vous ne vous souvenez plus de la liste des points à vérifier pour valider votre code.
🤭 Vous testez souvent quelques cas particuliers, mais vous n'êtes pas sûr de couvrir tous les cas.
😖 Vous vous retrouvrez avec des nouveaux bugs quand vous pensez avoir corrigé tous les bugs.
🤔 Rien ne documente comment votre code fonctionne (à part au mieux des specs non branchées sur le code).
N'aurons plus de secrets pour vous !
Vous maîtriserez les tests unitaires dans plusieurs langages de programmation ainsi que leur automatisation...
Un test unitaire ou T.U. (U.T. en anglais) est un test qui vérifie le bon fonctionnement d'une unité de code.
Un test unitaire doit couvrir un cas de test d'une portion de code.
est composé de :
Étant donné que...
L'état de départ ou pré-condition.
On verra que l'on peut assi réaliser des prophéties dans des cas plus avancés, mais pour l'instant, on va se contenter de ça.
Quand
L'action testée, la fameuse portion de code sous test (qu'on appelle SUT ou System Under Test).
Exemple : on souhaite tester une fonction d'addition de 2 entiers
add(1, 2)
L'état d'arrivée ou post-condition.
On dit qu'on réalise des assertions.
Effet de bord / Side effect.
Cas limite / Edge case.
Isolation.
Boîte Blanche, Grise, Noire.
Ou même mieux... guider la conception par les tests (TDD ou Test Driven Development).
🤫 disclaimer: on verra pendant le TP qu'il est plus difficile de mettre en place des tests sur du code écrit que d'écrire les tests puis de coder.
Lorsqu'on modifie un programme, les tests permettent de détecter les éventuelles régressions.
Il est très utile de lire les tests pour comprendre comment fonctionne le code.
Des tests bien écrits couvrent et illustrent les cas d'usage.
Les T.U. dès le départ c'est la victoire 🎉
TDD c'est plus que les tests, c'est un outil de conception 👨🎨.
Merci de me communiquer votre nom complet handle github pour que je vous invite sur le dépôt du TP.
Se familiariser concrètement avec les outils, sur un test bidon.
Découverte du TDD sur des cas de tests déjà écrits.
Je me sers des TU pour corriger un bug.
Sur un algorithme totalement inconnu, y compris une fois que j'ai corrigé ce bug.
Il a suffit de :
Je sais faire évoluer une fonctionnalité.
Elle était converte par les tests, mais il fallait désormais que l'application aie le comportement contraire de celui implémenté et testé.
Les outils de test unitaire peuvent générer des rapports.
Ceux qui expliquent quelles portions de code sont couvertes ou non par les tests s'appellent la couverture de code ou code coverage.
TP2 - Exercice 1 : en Java 11 Junit 5 avec le plugin JaCoCo
Parfois vous avez du code répétitif dans vos suites de test
Les outils de test unitaire fournissent des "hooks" permettant de s'accrocher au cycle de vie d'une suite de test ET d'un cas de test.
Hook | Exécution | Utilisation |
---|---|---|
BeforeAll | Une seule fois, avant le premier test | Initialisation du contexte |
BeforeEach | Au début de chaque test | Initialisation du contexte |
AfterEach | A la fin de chaque test | Nettoyage du contexte |
AfterAll | Une seule fois, après le dernier test | Nettoyage du contexte |
TP2 - Exercice 2 : en Java 11 Junit 5
Il existe avec junit tout un tas d'autres annotations autour du contexte (@Nested, @Disabled, ...).
👉 Les seuls éléments de contexte véritablement universels entre les moteurs de tests unitaires de tous les langages sont ceux que nous avons vu. Les autres sont spécifiques et relèvent de votre montée en expertise sur un moteur donné.
Vous avons vu comment tester des classes simples.
Maintenant, imaginez devoir tester une classe A qui a besoin pour exister d'être instanciée avec une classe B.
👉 Vous avez déjà testé la classe B à part.
Si vous utilisez une implémentation concrète de B dans A, lorsque vous changerez B les tests de A casseront très souvent pour rien 🤯.
💡 Vous pouvez "mocker" B dans A.
Afin de tester A, vous allez créer une classe MockB qui implémente (ce dont vous avez besoin uniquement) de l'interface de B.
TP2 - Exercice 3 : en Java 11 Junit 5
Un mock permet de simuler le comportement d'une dépendance :
Les tests unitaires et plus particulièrement le TDD nous guident dans la conception d'un code propre qui correspond au juste besoin en nous poussant très tôt à valider ce besoin auprès des interlocuteurs métier.
Tester c'est donner du sens lorsqu'on conçoit.
Tester c'est avoir confiance lorsqu'on déploie.
Tester c'est se donner la liberté de remanier notre code avec des garanties.