TP5 : outils de couverture de code, TDD
Transcription
TP5 : outils de couverture de code, TDD
TP5 : outils de couverture de code, TDD UFR IEEA Master1 info S2 TP SVL – 2008-2009 Le but de ce TP est : 1. d’apprendre à utiliser des outils de couverture de code ; 2. de relativiser leur utilité dans une approche TDD. Les infos sur ces outils sont sur le portail, rubrique ”documents”. Attention : pour une utilisation en ligne de commande, bien penser à compléter la variable CLASSPATH avec JUnit4, voire mockito si besoin. Selon la manière dont on lance les outils, il peut être utile de créer une suite de test (au sens JUnit4) qui lance tous les tests, et pour laquelle on calcule le taux de couverture. 1 Prise en main des outils Le but de cette prise en main est de compmrendre comment chaque outil fonctionne , en particulier quels critères de couverture sont mis en œuvre. Vous pouvez par exemple essayer de couvrir par des tests JUnit le code suivant : public int methodeAvecAnd(boolean a, public int methodeAvecIfSansElse(boolean a) { boolean b) { int x = 0; if (a && b) if (a) return 3; x = 5; else return 4; return x; } } Il vous est aussi demandé de regarder le taux de couverture obtenu par vos tests dans un projet réalisé en TDD (jeu de dé par exemple). Les outils fonctionnent en instrumentant le bytecode chargé au lancement de la JVM (possibilité de n’instrumenter que les sources, cad pas les librairies type JUnit et mockito, ni les tests). 1.1 Pluggin Eclipse EclEmma Le pluggin n’est pas installé au M5, c’est à vous de le faire. Il faut commencer par modifier le proxy de Eclipse : – dans les ”preferences”, choisir ”general” puis ”network connections” ; – cocher ”manual proxy configuration” ; – renseigner pour le proxy cache-etu.univ-lille1.fr, cocher ”use this proxy server for SSL” ; – même proxy pour ”socks proxy” ; – pour les ports : 3128. Ensuite pour installer le pluggin (à adapter plus ou moins à la version courante d’Eclipse) : – Dans le menu ”Help”, sélectionner ”Software Updates” ; – Dans l’écran ”Sopftware Update. . .”, sélectionner l’onglet ”available software”, puis cliquer sur ”add site” ; – Dans l’écran ”add site”, indiquer http://update.eclemma.org/, puis ”OK” ; – Dans l’onglet ”available software”, sélectionner l’URL pour EclEmma, puis cocher ”eclemma”, terminer par ”install” et attendre ; – Dans l’écran ”Install”, cliquer sur ”Next” puis accepter les termes de la licence, puis terminer par ”Finish”. – Enfin demander qu’Eclipse soit relancé. L’installation d’EclEmma se traduit par une icône supplémentaire (”coverage”) et des entrées supplémentaires dans les menus contextuels. Pour demander un rapport de couverture en même temps qu’on lance JUnit, depuis la classe de test faire ”coverage as” et choisir ”JUnit test”, puis aller voir les rapports de test qui s’affichent dans une vue, et le code source coloré en vert (couvert), rouge (non couvert) et orange (partiellement couvert). Emma en ligne de commande Pour les inconditionnels de la ligne de commande, il est possible d’utiliser Emma (à installer). On pourra par exemple essayer : java emmarun -cp $CLASSPATH -r html TP SVL -sp src/ org.junit.runner.JUnitCore jeuDe.TestAllJeuDe 2008-2009 TP SVL TP5 : outils de couverture de code, TDD qui crée dans le répertoire courant un répertoire coverage et écrit dedans des rapports de couverture au format html. Cette utilisation de la ligne de commande vérifie la couverture de beaucoup trop de classes, à vous de chercher comment faire mieux, éventuellement en utilisant ant. Questions – quel est le critère de couverture appliqué par Emma ? (expliquer le code couleur vert / rouge / orange) ; – quelle couverture obtenez-vous pour votre projet réalisé en TDD ? 1.2 Cobertura Cobertura propose un pluggin Maven, mais pas de pluggin Eclipse. On utilisera donc la version ligne de commande, ce qui permet de comprendre tout ce qui se cache derrière un pluggin Eclipse. On lancera Cobertura via un fichier de configuration build.xml pour l’outil ant. Un exemple vous est donné. Fonctionnement de Cobertura en ligne de commande étapes : La couverture s’obtient en plusieurs 1. instrumentation du bytecode : écriture du bytecode instrumenté dans un répertoire à choisir ; 2. lancement des tests avec JUnit, sur le bytecode instrumenté ; sérialisation du résultat dans un fichier cobertura.ser écrit dans le répertoire courant ; 3. écriture des rapports à partir de cobertura.ser, dans un répertoire à choisir, au format xml ou html ; coloration des sources ; 4. éventuellement fusion de différentes sessions Cobertura pour produire un unique rapport. Fichier de configuration build.xml La première chose à faire est de créer des répertoires pour stocker tout ce qui est généré par Cobertura. Pour ce TP on vous propose de tout stocker dans un répertoire coverage à placer dans le répertoire test de votre projet : – test/coverage/instrumentedClasses : bytecode instrumenté ; – test/coverage/testReports : rapports de test JUnit (à regarder pour voir à quoi ça ressemble) ; – test/coverage/coverageReports : rapports de couverture au format html. Ces répertoires sont à créér. Le fichier build.xml est à placer dans le répertoire de votre projet, au même niveau que les répertoires src, classes, etc. La commande ant lance une cascade de commandes : – suppression des sorties Cobertura, JUnit et des .class applicatifs (un peu violent, peut être adapté) ; – compilation des contenus des répertoires src et test ; – instrumentation des sources applicatifs uniquement (src) ; – lancement de JUnit soit sur une suite de test donnée, soit sur l’ensemble des classes *Test* du répertoire de test (à configurer en tête de build.xml) ; – génération des rapports de couverture. Le fichier build.xml est configurable, à vous de le modifier pour coller à votre projet. Questions – quels sont les critères de couverture proposé par Cobertura ? – quelle couverture obtenez-vous pour votre projet réalisé en TDD ? Par la suite on utilisera Cobertura. 2 Gestionnaire de login Un exercice récapitulatif qui couvre tous les aspects vus en cours : TDD, test en isolation, test aux limites, couverture de code. À réaliser strictement en TDD, en surveillant régulièrement la couverture de code avec Cobertura pour vérifier qu’elle se maintient à 100%. 2008-2009 2 Master1 info S2 TP SVL TP5 : outils de couverture de code, TDD On souhaite réaliser un gestionnaire de login pour les utilisateurs d’un organisme. Un utilisateur possède un nom, un prénom (des chaı̂nes de lettres), un login (au plus 8 lettres), une adresse mèl canonique (forme Prenom.Nom uniquement). Le gestionnaire de login doit être capable de calculer, étant donnés un nom et un prénom : – l’adresse mèl canonique : prénom en minuscules commençant par une majuscule suivi d’un point suivi du nom en minuscules commençant par une majuscule ; – le login : par défaut les 8 premières lettres du nom en minuscules ; si ce login existe déjà dans la base alors les 7 premières lettres du nom concaténées à l’initiale du prénom en minuscules, sinon levée d’exception si ce login appartient aussi à la base. L’interrogation de la base de données est ramenée au minimum vital : la méthode get retourne null si le login passé en paramètre n’est pas dans la base, l’utilisateur correspondant sinon. public User get(String login); Question 2008-2009 : Écrire / tester en isolation le gestionnaire de login, pas plus, pas moins. 3 Master1 info S2