đ» TP â Approche structurelle
1. Introduction
L’objectif de ce TP de vous apprendre Ă dĂ©finir des scĂ©narios de test unitaires Ă l’aide d’une approche structurelle, et surtout Ă vĂ©rifier le taux de couverture de code atteint Ă l’aide de vos tests. Le TP est l’occasion de consolider des notions vues en TD (modĂ©lisation en graphe de flot de contrĂŽle notamment), et d’aller jusqu’Ă vĂ©rifier quel taux de couverture vous arrivez Ă atteindre avec l’aide de l’outil JaCoCo.
2. Exercice 1 : BasicSortedList
Ce premier exercice s’intĂ©resse Ă la classe BasicSortedList dĂ©jĂ Ă©tudiĂ©e dans le đ» TP â DĂ©velopper des tests automatisĂ©s (dĂ©couverte), disponible dans un projet Gitlab dĂ©diĂ©.
Plus prĂ©cisĂ©ment, l’objectif est de tester la mĂ©thode equals Ă l’aide de l’approche structurelle.
-
Récupérez le projet
sortedlistavec git. -
Dans le
pom.xml, ajoutez le plugin JaCoCo pour le calcul du taux de couverture de code. -
Exécutez les tests et générez le rapport JaCoCo avec la commande :
mvn test site -
Ouvrir le fichier dans
target/site/jacoco/index.htmlet explorez le rapport produit par JaCoCo : couverture des packages, des classes, des méthodes. -
Observez plus en détail la couverture ligne par ligne des méthodes
addAll: elles ne sont que partiellement couvertes ! Soyez attentifs au rapport JaCoCo et distinguez bien les diffĂ©rents types de couverture d’instructions (surlignage vert, jaune, rouge) et les diffĂ©rents types de couvertures de branches (diamants verts, jaunes, rouges). Pour les couvertures de branches, mettez votre curseur sur le diamant associĂ© pour lire le tooltip vous indiquant le nombre de branches non couvertes par les tests Ă cet endroit. -
Appliquez l’approche structurelle sur
addetaddAllavec le critĂšre de couverture "tous les 1-chemins", et implĂ©mentez avec JUnit les scripts de tests correspondants. Ă chaque nouveau script de test ajoutĂ©, relancez l’exĂ©cution des tests avec JaCoCo, et constatez l’amĂ©lioration de la couverture. Vous devez pouvoir couvrir 100% des instructions et 100% des branches de ces mĂ©thodes avec seulement quelques scĂ©narios.Les deux mĂ©thodes addAllont pour diffĂ©rence la forme de leurs arguments. L’une des mĂ©thodes s’appelle en passant un objet de typeListen argument (addAll(maListe)avecmaListe=List.of(1,2,3)), l’autre en passant "en vrac" un lot de valeurs (addAll(1,2,3)). -
Appliquez de la mĂȘme maniĂšre l’approche structurelle sur la mĂ©thode
equalsavec le critĂšre de couverture "tous les 1-chemins" LĂ encore, exĂ©cutez JaCoCo Ă chaque nouveau test que vous implĂ©mentez, et constatez l’amĂ©lioration de la couverture. -
Poursuivez l’Ă©laboration de scĂ©narios de tests pour toutes les mĂ©thodes jusqu’Ă atteindre une couverture de branches de 100% dans JaCoCo.
-
Une fois les couvertures maximales atteintes, regardez attentivement vos tests. Pensez-vous que votre suite de test est suffisante ? Faudrait-il ajouter des tests supplémentaires ?
| MĂȘme si on est focalisĂ© ici sur le taux de couverture, n’oubliez pas de dĂ©finir et d’implĂ©menter soigneusement les oracles des vos tests ! Sans oracle, un test n’a aucune valeur, mĂȘme s’il est capable de couvrir beaucoup de code. |
3. Exercice 2 : TicketReservationSystemImpl
Ce second exercice s’intĂ©resse Ă la classe TicketReservationSystemImpl dĂ©jĂ Ă©tudiĂ©e dans le đ» TP â DĂ©velopper des tests automatisĂ©s (avancĂ©), disponible dans un projet Gitlab dĂ©diĂ©.
Préparation :
-
RĂ©cupĂ©rez le projet de test que vous avez dĂ©jĂ Ă©laborĂ© lors du đ» TP â DĂ©velopper des tests automatisĂ©s (avancĂ©).
-
Dans le
pom.xml, ajoutez le plugin JaCoCo pour le calcul du taux de couverture de code. -
Exécutez les tests et générez le rapport JaCoCo avec la commande :
mvn test site -
Ouvrir le fichier dans
target/site/jacoco/index.htmlet explorez le rapport produit par JaCoCo : couverture des packages, des classes, des méthodes.
Ensuite, pour chacune des méthodes suivantes de la classe TicketReservationSystemImpl:
-
delayTripArrival -
findPossibleExchanges -
createTrip -
findNextTripOfTrain -
findPreviousTripOfTrain -
findOrderedTripsOfTrain
suivez les étapes suivantes :
-
Ajoutez suffisament de scripts de tests pour obtenir une couverture de 100% des instructions (selon JaCoCo),
-
Ajoutez suffisament de scripts de tests pour obtenir une couverture de 100% des branches (selon JaCoCo),
-
Si vous n’arrivez pas Ă couvrir toutes les branches, faites un graphe de flot de contrĂŽle (CFG) de la mĂ©thode, et dĂ©duisez en les scĂ©narios permettant de satisfaire le critĂšre "tous les arcs". Puis, implĂ©mentez ces scĂ©narios avec JUnit et relancez JaCoCo.
| LĂ aussi, n’oubliez pas de dĂ©finir et d’implĂ©menter les oracles des vos tests. |