đŸ’» 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.

  1. Récupérez le projet sortedlist avec git.

  2. Dans le pom.xml, ajoutez le plugin JaCoCo pour le calcul du taux de couverture de code.

  3. Exécutez les tests et générez le rapport JaCoCo avec la commande : mvn test site

  4. Ouvrir le fichier dans target/site/jacoco/index.html et explorez le rapport produit par JaCoCo : couverture des packages, des classes, des méthodes.

  5. 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.

  6. Appliquez l’approche structurelle sur add et addAll avec 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 addAll ont pour diffĂ©rence la forme de leurs arguments. L’une des mĂ©thodes s’appelle en passant un objet de type List en argument (addAll(maListe) avec maListe=List.of(1,2,3) ), l’autre en passant "en vrac" un lot de valeurs (addAll(1,2,3)).
  7. Appliquez de la mĂȘme maniĂšre l’approche structurelle sur la mĂ©thode equals avec 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.

  8. Poursuivez l’Ă©laboration de scĂ©narios de tests pour toutes les mĂ©thodes jusqu’Ă  atteindre une couverture de branches de 100% dans JaCoCo.

  9. 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 :

  1. RĂ©cupĂ©rez le projet de test que vous avez dĂ©jĂ  Ă©laborĂ© lors du đŸ’» TP − DĂ©velopper des tests automatisĂ©s (avancĂ©).

  2. Dans le pom.xml, ajoutez le plugin JaCoCo pour le calcul du taux de couverture de code.

  3. Exécutez les tests et générez le rapport JaCoCo avec la commande : mvn test site

  4. Ouvrir le fichier dans target/site/jacoco/index.html et 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 :

  1. Ajoutez suffisament de scripts de tests pour obtenir une couverture de 100% des instructions (selon JaCoCo),

  2. Ajoutez suffisament de scripts de tests pour obtenir une couverture de 100% des branches (selon JaCoCo),

  3. 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.