43
Présentation Un premier exemple L’écriture des cas de tests L’initialisation des cas de tests L’exécution des tests JUnit 4 Les Framework Java JUnit Claude Duvallet Université du Havre UFR Sciences et Techniques 25 rue Philippe Lebon - BP 540 76058 LE HAVRE CEDEX [email protected] http://litis.univ-lehavre.fr/duvallet/ Claude Duvallet — 1/43 Framework

Cours Junit

Embed Size (px)

Citation preview

  • PrsentationUn premier exemple

    Lcriture des cas de testsLinitialisation des cas de tests

    Lexcution des testsJUnit 4

    Les Framework JavaJUnit

    Claude Duvallet

    Universit du HavreUFR Sciences et Techniques

    25 rue Philippe Lebon - BP 54076058 LE HAVRE CEDEX

    [email protected]://litis.univ-lehavre.fr/duvallet/

    Claude Duvallet 1/43 Framework

  • PrsentationUn premier exemple

    Lcriture des cas de testsLinitialisation des cas de tests

    Lexcution des testsJUnit 4

    JUnit

    1 Prsentation

    2 Un premier exemple

    3 Lcriture des cas de tests

    4 Linitialisation des cas de tests

    5 Lexcution des tests

    6 JUnit 4

    Claude Duvallet 2/43 Framework

  • PrsentationUn premier exemple

    Lcriture des cas de testsLinitialisation des cas de tests

    Lexcution des testsJUnit 4

    Prsentation (1/4)I JUnit est une bibliothque de tests unitaires pour Java.I Cr par Kent Beck et Erich Gamma, JUnit est certainement le

    projet de la srie des xUnit connaissant le plus de succs.I JUnit dfinit deux types de fichiers de tests :

    Les TestCase sont des classes contenant un certain nombre demthodes de tests. Un TestCase sert gnralement tester lebon fonctionnement dune classe.Une TestSuite permet dexcuter un certain nombre deTestCase dj dfinis.

    I Junit est intgr par dfaut dans les environnements dedveloppement Java tels quEclipse et Netbeans.

    I Le principal intrt de JUnit est de sassurer que le code rpondtoujours aux besoins mme aprs dventuelles modifications.

    I Plus gnralement, ce type de tests est appel tests unitaires denon rgression.

    Claude Duvallet 3/43 Framework

  • PrsentationUn premier exemple

    Lcriture des cas de testsLinitialisation des cas de tests

    Lexcution des testsJUnit 4

    Prsentation (2/4)I JUnit propose :

    Un framework pour le dveloppement des tests unitaires reposantsur des assertions qui testent les rsultats attendus.Des applications pour permettre lexcution des tests et afficherles rsultats.

    I Le but est dautomatiser les tests qui sont exprims dans desclasses sous la forme de cas de tests avec leurs rsultatsattendus.

    I JUnit excute ces tests et les comparent avec ces rsultats.I Cela permet de sparer le code de la classe, du code qui permet

    de la tester.I Souvent pour tester une classe, il est facile de crer une mthode

    main() qui va contenir les traitements de tests.I Linconvnient est que ce code "superflu" aux traitements

    proprement dit est quil soit inclus dans la classe.

    Claude Duvallet 4/43 Framework

  • PrsentationUn premier exemple

    Lcriture des cas de testsLinitialisation des cas de tests

    Lexcution des testsJUnit 4

    Prsentation (3/4)

    I De plus, son excution doit se faire manuellement.I La rdaction de cas de tests peut avoir un effet immdiat pour

    dtecter des bugs mais surtout elle a un effet long terme quifacilite la dtection deffets de bords lors de modifications.

    I Les cas de tests sont regroups dans des classes Java quicontiennent une ou plusieurs mthodes de tests.

    I Ces cas de tests peuvent tre regroups sous la forme de suitesde tests.

    I Les cas de tests peuvent tre excuts individuellement ou sousla forme de suites de tests.

    I JUnit permet le dveloppement incrmental dune suite de tests.I Avec JUnit, lunit de test est une classe ddie qui regroupe des

    cas de tests.

    Claude Duvallet 5/43 Framework

  • PrsentationUn premier exemple

    Lcriture des cas de testsLinitialisation des cas de tests

    Lexcution des testsJUnit 4

    Prsentation (4/4)I Ces cas de tests excutent les tches suivantes :

    cration dune instance de la classe et de tout autre objetncessaire aux testsappel de la mthode tester avec les paramtres du cas de testcomparaison du rsultat attendu avec le rsultat obtenu : en casdchec, une exception est leve

    I JUnit est particulirement adapt pour tre utilis avec lamthode eXtreme Programming (XP) puisque cette mthodeprconise entre autre lautomatisation des tches de testsunitaires qui ont t dfinis avant lcriture du code.

    I La page officielle est lurl : http://junit.org.I La dernire version de JUnit peut tre tlcharge sur le site

    www.junit.org.I Pour pouvoir utiliser JUnit, il faut ajouter le fichier junit.jar au

    classpath.

    Claude Duvallet 6/43 Framework

  • PrsentationUn premier exemple

    Lcriture des cas de testsLinitialisation des cas de tests

    Lexcution des testsJUnit 4

    Un premier exemple (1/3)

    I Soit la classe suivante :public class MaClasse{

    public static int calculer(int a, int b) {int res = a + b;if (a == 0){

    res = b * 2;}

    if (b == 0) {res = a * a;

    }return res;

    }}

    Il faut compiler cette classe : javac MaClasse.javaIl faut ensuite crire une classe qui va contenir les diffrents tests raliser par JUnit.

    Claude Duvallet 7/43 Framework

  • PrsentationUn premier exemple

    Lcriture des cas de testsLinitialisation des cas de tests

    Lexcution des testsJUnit 4

    Un premier exemple (2/3)I Voici la classe de test :

    import junit.framework.*;

    public class MaClasseTest extends TestCase{

    public void testCalculer() throws Exception {assertEquals(2,MaClasse.calculer(1,1));

    }}

    Il faut compiler cette classe avec le fichier junit.jar qui doit tredans le classpath.Enfin, il suffit dappeler JUnit pour quil excute la squence detests.

    I Voici le rsultat de lexcution :javac -cp junit.jar;. MaClasseTest.javajava -cp junit.jar;. junit.textui.TestRunner MaClasseTest.Time: 0.005

    OK (1 test)

    Claude Duvallet 8/43 Framework

  • PrsentationUn premier exemple

    Lcriture des cas de testsLinitialisation des cas de tests

    Lexcution des testsJUnit 4

    Un premier exemple (3/3)I Attention : le respect de la case dans le nommage des mthodes

    de tests est trs important.Les mthodes de tests doivent obligatoirement commencer partest en minuscule car JUnit utilise lintrospection pour dterminerles mthodes excuter.Exemple :import junit.framework.*;

    public class MaClasseTest extends TestCase{

    public void TestCalculer() throws Exception {assertEquals(2,MaClasse.calculer(1,1));

    }}

    Lutilisation de cette classe avec JUnit produit le rsultat suivant :java -cp junit.jar;. junit.textui.TestRunner MaClasseTest.FTime: 0.001There was 1 failure:1) warning(junit.framework.TestSuite$1)junit.framework.AssertionFailedError:

    No tests found in MaClasseTest

    FAILURES!!!Tests run: 1, Failures: 1, Errors: 0

    Claude Duvallet 9/43 Framework

  • PrsentationUn premier exemple

    Lcriture des cas de testsLinitialisation des cas de tests

    Lexcution des testsJUnit 4

    Lcriture des cas de tests (1/2)

    I JUnit propose un framework pour crire les classes de tests.

    I Un test est une classe qui hrite de la classe TestCase.

    I Par convention le nom de la classe de test est compos du nomde la classe suivi de Test.

    I Chaque cas de tests fait lobjet dune mthode dans la classe detests.

    I Le nom de ces mthodes doit obligatoirement commencer par lesuffixe test.

    Claude Duvallet 10/43 Framework

  • PrsentationUn premier exemple

    Lcriture des cas de testsLinitialisation des cas de tests

    Lexcution des testsJUnit 4

    Lcriture des cas de tests (2/2)

    I Chacune de ces mthodes contient gnralement destraitements en trois tapes :

    Instanciation des objets requisInvocation des traitements sur les objetsVrification des rsultats des traitements

    I Il est important de se souvenir lors de lcriture de cas de testsque ceux-ci doivent tre indpendants les uns des autres.

    I JUnit ne garantit pas lordre dexcution des cas de tests puisqueceux-ci sont obtenus par introspection.

    I Toutes les classes de tests avec JUnit hritent de la classeAssert.

    Claude Duvallet 11/43 Framework

  • PrsentationUn premier exemple

    Lcriture des cas de testsLinitialisation des cas de tests

    Lexcution des testsJUnit 4

    La dfinition de la classe de tests (1/3)

    I Pour crire les cas de tests, il faut crire une classe qui tende laclasse junit.framework.TestCase.

    I Le nom de cette classe est le nom de la classe tester suivi par"Test".

    I Une classe de tests doit obligatoirement possder unconstructeur qui attend un objet de type String en paramtre.

    I Exemple :import junit.framework.*;

    public class MaClasseTest extends TestCase{public MaClasseTest(String testMethodName) {

    super(testMethodName);}

    public void testCalculer() throws Exception {fail("Cas de test a ecrire");

    }}

    Claude Duvallet 12/43 Framework

  • PrsentationUn premier exemple

    Lcriture des cas de testsLinitialisation des cas de tests

    Lexcution des testsJUnit 4

    La dfinition de la classe de tests (2/3)

    I Dans la classe prcdente, il faut crire une mthode dont lenom commence par "test" en minuscule suivi du nom du cas detest (gnralement le nom de la mthode tester).

    I Chacune de ces mthodes doit avoir les caractristiquessuivantes :

    elle doit tre dclare publicelle ne doit renvoyer aucune valeurelle ne doit pas possder de paramtres.

    I Par introspection, JUnit va automatiquement rechercher toutesles mthodes qui respectent cette convention.

    I Le respect de ces rgles est donc important pour une bonneexcution des tests par JUnit.

    Claude Duvallet 13/43 Framework

  • PrsentationUn premier exemple

    Lcriture des cas de testsLinitialisation des cas de tests

    Lexcution des testsJUnit 4

    La dfinition de la classe de tests (3/3)

    I Exemple : la mthode commence par T et non timport junit.framework.*;

    public class MaClasseTest extends TestCase{

    public void TestCalculer() throws Exception {// assertEquals(2,MaClasse.calculer(1,1));fail("Cas de test a ecrire");

    }}

    I Rsultat :

    java -cp junit.jar;. junit.textui.TestRunner MaClasseTest.FTime: 0,01There was 1 failure:1) warning(junit.framework.TestSuite$1)junit.framework.AssertionFailedError: Notests found in MaClasseTest

    FAILURES!!!Tests run: 1, Failures: 1, Errors: 0

    Claude Duvallet 14/43 Framework

  • PrsentationUn premier exemple

    Lcriture des cas de testsLinitialisation des cas de tests

    Lexcution des testsJUnit 4

    La dfinition des cas de tests (1/6)

    I Chaque classe de tests doit avoir obligatoirement au moins unemthode de test sinon une erreur est remonte par JUnit.

    I La dcouverte des mthodes de tests par Junit repose surlintrospection :

    JUnit recherche les mthodes qui dbutent par test, nont aucunparamtre et ne retourne aucune valeur.Ces mthodes peuvent lever des exceptions qui sontautomatiquement captures par JUnit qui remonte alors uneerreur et donc un chec du cas de tests.

    I Ds quun test choue, lexcution de la mthode correspondanteest interrompue et JUnit passe mthode suivante.

    I Avec JUnit, la plus petite unit de tests est lassertion dont lersultat de lexpression boolenne indique un succs ou uneerreur.

    Claude Duvallet 15/43 Framework

  • PrsentationUn premier exemple

    Lcriture des cas de testsLinitialisation des cas de tests

    Lexcution des testsJUnit 4

    La dfinition des cas de tests (2/6)I Les cas de tests utilisent des affirmations (assertion en anglais)

    sous la forme de mthodes nommes assertXXX().I Il existe de nombreuses mthodes de ce type qui sont hrites

    de la classe junit.framework.Assert :Mthode Rle

    assertEquals()

    Vrifier lgalit de deux valeurs de type primitif ou objet (en utilisant la mth-ode equals()). Il existe de nombreuses surcharges de cette mthode pourchaque type primitif, pour un objet de type Object et pour un objet de typeString.

    assertFalse() Vrifier que la valeur fournie en paramtre est fausse.assertNull() Vrifier que lobjet fourni en paramtre soit null.assertNotNull() Vrifier que lobjet fourni en paramtre ne soit pas null.

    assertSame()

    Vrifier que les deux objets fournis en paramtre font rfrence la mmeentit.Exemples identiques :assertSame("Les deux objets sont identiques", obj1, obj2) ;assertTrue("Les deux objets sont identiques ", obj1 == obj2) ;

    assertNotSame() Vrifier que les deux objets fournis en paramtre ne font pas rfrence lamme entit.

    assertTrue() Vrifier que la valeur fournie en paramtre est vraie.Claude Duvallet 16/43 Framework

  • PrsentationUn premier exemple

    Lcriture des cas de testsLinitialisation des cas de tests

    Lexcution des testsJUnit 4

    La dfinition des cas de tests (3/6)I Bien quil serait possible de nutiliser que la mthode

    assertTrue(), les autres mthodes assertXXX() facilitelexpression des conditions de tests.

    I Chacune de ces mthodes possde une version surcharge quiaccepte un paramtre supplmentaire sous la forme dunechane de caractres indiquant un message qui sera affich encas dchec du cas de test.

    I Le message doit dcrire le cas de test valu "true".I Lutilisation de cette version surcharge est recommande car

    elle facilite lexploitation des rsultats des cas de tests.I Exemple :

    import junit.framework.*;

    public class MaClasse2Test extends TestCase{

    public void testCalculer() throws Exception {MaClasse2 mc = new MaClasse2(1,1);assertEquals(2,mc.calculer());

    }}

    Claude Duvallet 17/43 Framework

  • PrsentationUn premier exemple

    Lcriture des cas de testsLinitialisation des cas de tests

    Lexcution des testsJUnit 4

    La dfinition des cas de tests (4/6)

    I Lordre des paramtres contenant la valeur attendue et la valeurobtenue est important pour obtenir un message derreur fiable encas dchec du cas de test.

    I Quelque soit la surcharge utilise lordre des deux valeurs tester est toujours la mme : cest toujours la valeur attendue quiprcde la valeur courante.

    I La mthode fail() permet de forcer le cas de test chouer.

    I Une version surcharge permet de prciser un message qui doittre afficher.

    I Il est aussi souvent utile lors de la dfinition des cas de tests dedevoir tester si une exception est leve lors de lexcution.

    Claude Duvallet 18/43 Framework

  • PrsentationUn premier exemple

    Lcriture des cas de testsLinitialisation des cas de tests

    Lexcution des testsJUnit 4

    La dfinition des cas de tests (5/6)I Exemple :

    import junit.framework.*;

    public class MaClasse2Test extends TestCase{public void testSommer() throws Exception {

    MaClasse2 mc = new MaClasse2(0,0);mc.sommer();

    }}

    I Rsultat :java -cp junit.jar;. junit.textui.TestRunner MaClasse2Test.ETime: 0,01There was 1 error:1) testSommer(MaClasse2Test)java.lang.IllegalStateException:

    Les deux valeurs sont nullesat MaClasse2.sommer(MaClasse2.java:42)at MaClasse2Test.testSommer(MaClasse2Test.java:31)at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)at sun.reflect.NativeMethodAccessorImpl.invoke(

    NativeMethodAccessorImpl.java:39)at sun.reflect.DelegatingMethodAccessorImpl.invoke(

    DelegatingMethodAcces.sorImpl.java:25)

    FAILURES!!!Tests run: 2, Failures: 0, Errors: 1

    Claude Duvallet 19/43 Framework

  • PrsentationUn premier exemple

    Lcriture des cas de testsLinitialisation des cas de tests

    Lexcution des testsJUnit 4

    La dfinition des cas de tests (6/6)I Avec JUnit, pour raliser de tels cas de tests, il suffit dappeler la

    mthode avec les conditions qui doivent lever une exception,dencapsuler cet appel dans un bloc try/catch et dappeler lamthode fail() si lexception dsire nest pas leve.

    I Exemple :import junit.framework.*;

    public class MaClasse2Test extends TestCase{

    public void testSommer() throws Exception {MaClasse2 mc = new MaClasse2(1,1);

    // cas de test 1assertEquals(2,mc.sommer());

    // cas de test 2try {

    mc.setA(0);mc.setB(0);mc.sommer();fail("Une exception de type IllegalStateException aurait

    du etre levee");} catch (IllegalStateException ise) {}

    }}

    Claude Duvallet 20/43 Framework

  • PrsentationUn premier exemple

    Lcriture des cas de testsLinitialisation des cas de tests

    Lexcution des testsJUnit 4

    Linitialisation des cas de testsI Il est frquent que les cas de tests utilisent plusieurs instances

    dun mme objet ou ncessitent lusage de ressourcesparticulires telles quune instance dune classe pour laccs une base de donnes par exemple.

    I Pour raliser ces oprations de cration et de destructiondobjets, la classe TestCase propose les mthodes setUp() ettearDown() qui sont respectivement appeles avant et aprslappel de chaque mthode contenant un cas de test.

    I Il suffit simplement de les redfinir en fonction des besoins.I Le plus simple est de dfinir un membre priv du type dont on a

    besoin et de crer une instance de ce type dans la mthodesetUp().

    I Il est important de se souvenir que setUp() est invoquesystmatiquement avant lappel de chaque mthode de tests.

    Claude Duvallet 21/43 Framework

  • PrsentationUn premier exemple

    Lcriture des cas de testsLinitialisation des cas de tests

    Lexcution des testsJUnit 4

    Linitialisation des cas de testsI Sa mise en uvre nest donc requise que si toutes les mthodes

    de tests ont besoin de crer une instance dun mme type oudexcuter un mme traitement.

    I Ceci vite de crer linstance dans chaque mthode de tests etsimplifie donc lcriture des cas de tests.

    I La mthode tearDown() peut avoir un grand intrt pour parexemple librer des ressources comme une connexion unebase de donnes initie dans la mthode setUp().

    I Pour des besoins particuliers, il peut tre ncessaire dexcuterdu code une seule fois avant lexcution des cas de tests et/ouexcuter du code une fois tous les cas des tests excuts.

    I JUnit propose pour cela la classejunit.Extensions.TestSetup qui propose la mise en uvredu design pattern dcorateur.

    Claude Duvallet 22/43 Framework

  • PrsentationUn premier exemple

    Lcriture des cas de testsLinitialisation des cas de tests

    Lexcution des testsJUnit 4

    Le test de la leve dexceptionsI Il est frquent quune mthode puisse lever une ou plusieurs

    exceptions durant son excution.I Il faut prvoir des cas de tests pour vrifier que dans les

    conditions adquates une exception attendue est bien leve.I Pour effectuer la vrification de la leve dune exception, il faut

    inclure linvocation de la mthode dans un bloc try/catch etfaire appel la mthode fail() si lexception nest pas leve.

    I Attention : une erreur courante lorsque lon code ces premierstests unitaires est dinclure les invocations de mthodes dans desblocs try/catch.

    I Leur utilisation doit tre uniquement rserve.I Dans tous les autres cas, il faut laisser lexception se propager :

    JUnit va automatiquement reporter un chec du test.I Il est en particulier inutile dutiliser un bloc try/catch et de faire

    appel fail() dans le catch puisque JUnit le fait dj.Claude Duvallet 23/43 Framework

  • PrsentationUn premier exemple

    Lcriture des cas de testsLinitialisation des cas de tests

    Lexcution des testsJUnit 4

    Lhritage dune classe de base

    I Il est possible de dfinir une classe de base qui servira de classemre dautres classes de tests notamment en leur fournissantdes fonctionnalits communes.

    I JUnit nimpose pas quune classe de tests drive directement dela classe TestCase.

    I Ceci est particulirement pratique lorsque lon souhaite quecertaines initialisations ou certains traitements soitsystmatiquement excuts (exemple chargement dun fichier deconfiguration, ...).

    I Il est par exemple possible de faire des initialisations dans leconstructeur de la classe mre et invoquer ce constructeur dansles constructeurs des classe filles.

    Claude Duvallet 24/43 Framework

  • PrsentationUn premier exemple

    Lcriture des cas de testsLinitialisation des cas de tests

    Lexcution des testsJUnit 4

    Lexcution des tests (1/2)

    I JUnit propose trois applications diffrentes nommesTestRunner pour excuter les tests en mode ligne decommande ou application graphique :

    une application console : junit.textui.TestRunner qui esttrs rapide et adapte une intgration dans un processus degnrations automatiques.une application graphique avec une interface Swing :junit.swingui.TestRunner.une application graphique avec une interface AWT :junit.awtui.TestRunner.

    I Quelque soit lapplication utilise, les entits suivantes doiventtre incluses dans le classpath :

    le fichier junit.jar.les classes tester et les classes des cas de tests.les classes et bibliothques dont toutes ces classes dpendent.

    Claude Duvallet 25/43 Framework

  • PrsentationUn premier exemple

    Lcriture des cas de testsLinitialisation des cas de tests

    Lexcution des testsJUnit 4

    Lexcution des tests (2/2)

    I Suite lexcution dun cas de test, celui ci peut avoir un des troistats suivants :

    chou : une exception de type AssertionFailedError estleve.en erreur : une exception non mise par le framework et noncapture a t leve dans les traitements.pass avec succs.

    I Lchec dun seul cas de test entrane lchec du test complet.I Lchec dun cas de test peut avoir plusieurs origines :

    le cas de test contient un ou plusieurs bugs.le code tester contient un ou plusieurs bugs.le cas de test est mal dfini.une combinaison des cas prcdents simultanment.

    Claude Duvallet 26/43 Framework

  • PrsentationUn premier exemple

    Lcriture des cas de testsLinitialisation des cas de tests

    Lexcution des testsJUnit 4

    Lexcution des tests dans la console (1/2)

    I Lutilisation de lapplication console ncessite quelquesparamtres lors de son utilisation :java -cp junit.jar;. junit.textui.TestRunner MaClasseTest

    I Le seul paramtre obligatoire est le nom de la classe de tests.

    I Celle ci doit obligatoirement tre sous la forme pleinementqualifie si elle appartient un package.

    I Il est possible de faire appel au TestRunner dans une applicationen utilisant sa mthode run() et en lui passant en paramtre unobjet de type Class qui encapsule la classe de tests excuter.

    I Le TestRunner affiche le rsultat de lexcution des tests dans laconsole.

    I La premire ligne contient un caractre point pour chaque testexcut.

    Claude Duvallet 27/43 Framework

  • PrsentationUn premier exemple

    Lcriture des cas de testsLinitialisation des cas de tests

    Lexcution des testsJUnit 4

    Lexcution des tests dans la console (2/2)

    I Lorsque de nombreux tests sont excuts cela permet de suivrela progression.

    I Le temps total dexcution en seconde est ensuite affich sur laligne "Time :"

    I En cas derreur, la premire ligne contient un F la suite ducaractre point correspondant au cas de test en chec.

    I Le rsum de lexcution affiche le dtail de chaque cas de testsqui a chou.

    I Les cas en chec (failures) correspondent une vrification faitepar une mthode assertXXX() qui a chou.

    I Les cas en erreur (errors) correspondent la leve inattenduedune exception lors de lexcution du cas de test.

    Claude Duvallet 28/43 Framework

  • PrsentationUn premier exemple

    Lcriture des cas de testsLinitialisation des cas de tests

    Lexcution des testsJUnit 4

    Lexcution des tests dans une application graphique (1/2)

    I Pour utiliser des classes de tests avec ces applicationsgraphiques, il faut obligatoirement que les classes de tests ettoutes celles dont elles dpendent soient incluses dans leCLASSPATH.

    I Elles doivent obligatoirement tre sous la forme de fichier .classnon incluses dans un fichier jar.java -cp junit.jar;. junit.swingui.TestRunner MaClasseTest

    I Il suffit de cliquer sur le bouton "Run" pour lancer lexcution destests.

    I La case cocher "Reload classes every run" indique JUnit derecharger les classes chaque excution.

    I Ceci est trs pratique car cela permet de modifier les classes etde laisser lapplication de tests ouverte.

    Claude Duvallet 29/43 Framework

  • PrsentationUn premier exemple

    Lcriture des cas de testsLinitialisation des cas de tests

    Lexcution des testsJUnit 4

    Lexcution des tests dans une application graphique (2/2)

    I Si un ou plusieurs tests chouent la barre de rsultats nest plusverte mais rouge.

    I Dans ce cas, le nombre derreurs et dchecs est affich ainsique leur liste complte.

    I Il suffit den slectionner un pour obtenir le dtail de la raison duproblme.

    I Il est aussi possible de ne rexcuter que le cas slectionn.

    Claude Duvallet 30/43 Framework

  • PrsentationUn premier exemple

    Lcriture des cas de testsLinitialisation des cas de tests

    Lexcution des testsJUnit 4

    Lexcution rpte dun cas de testI JUnit propose la classe junit.extensions.RepeatedTest qui

    permet dexcuter plusieurs fois la mme suite de tests.I Le constructeur de cette classe attend en paramtre une

    instance de la suite de tests et le nombre de rptitions delexcution de la suite de tests.

    I Exemple :import junit.extensions.RepeatedTest;import junit.framework.*;

    public class PersonneTest extends TestCase {

    private Personne personne;

    public PersonneTest(String name) {super(name);

    }

    public static Test suite() {return new RepeatedTest(new TestSuite(PersonneTest.class), 5);

    }

    public static void main(String[] args) {junit.textui.TestRunner.run(suite());

    }}

    Claude Duvallet 31/43 Framework

  • PrsentationUn premier exemple

    Lcriture des cas de testsLinitialisation des cas de tests

    Lexcution des testsJUnit 4

    Lexcution concurrente de tests

    I JUnit propose la classe junit.extensions.ActiveTestSuitequi permet dexcuter plusieurs suites de tests chacune dans unthread ddi.

    I Ainsi lexcution des suites de tests se fait de faon concurrente.

    I Lensemble de la suite de tests ne se termine que lorsque tousles threads sont termins.

    I Mme si cela nest pas recommand, la classeActiveTestSuite peut tre utilise comme un outil de chargerudimentaire.

    I Il est possible de combiner lutilisation des classesActiveTestsuite et RepeatedTest.

    Claude Duvallet 32/43 Framework

  • PrsentationUn premier exemple

    Lcriture des cas de testsLinitialisation des cas de tests

    Lexcution des testsJUnit 4

    Les suites de tests (1/2)

    I Les suites de tests permettent de regrouper plusieurs tests dansune mme classe.

    I Ceci permet lautomatisation de lensemble des tests inclus dansla suite et de prciser leur ordre dexcution.

    I Pour crer une suite, il suffit de crer une classe de typeTestSuite et dappeler la mthode addTest() pour chaqueclasse de tests ajouter.

    I Celle ci attend en paramtre une instance de la classe de testsqui sera ajoute la suite.

    I Lobjet de type TestSuite ainsi cr doit tre renvoy par unemthode dont la signature doit obligatoirement tre publicstatic Test suite().

    Claude Duvallet 33/43 Framework

  • PrsentationUn premier exemple

    Lcriture des cas de testsLinitialisation des cas de tests

    Lexcution des testsJUnit 4

    Les suites de tests (2/2)

    I Celle ci sera appele par introspection par le TestRunner.

    I Il peut tre pratique de dfinir une mthode main() dans laclasse qui encapsule la suite de tests pour pouvoir excuter leTestRunner de la console en excutant directement la mthodestatique Run().

    I Ceci vite de lancer JUnit sur la ligne de commandes.

    I Deux versions surcharges des constructeurs permettent dedonner un nom la suite de tests.

    I Un constructeur de la classe TestSuite permet de crerautomatiquement par introspection une suite de tests contenanttous les tests de la classe fournie en paramtre.

    I La mthode addTestSuite() permet dajouter une suite uneautre suite.

    Claude Duvallet 34/43 Framework

  • PrsentationUn premier exemple

    Lcriture des cas de testsLinitialisation des cas de tests

    Lexcution des testsJUnit 4

    JUnit 4I JUnit version 4 est une volution majeure depuis les quelques

    annes dutilisation de la version 3.8.I Un des grands bnfices de cette version est lutilisation des

    annotations introduites dans Java 5.I La dfinition des cas de tests et des tests ne se fait donc plus sur

    des conventions de nommage et sur lintrospection mais surlutilisation dannotations ce qui facilite la rdaction des cas detests.

    I Une compatibilit descendante est assure avec les suites detests de JUnit 3.8.

    I Le nom du package des classes de JUnit est diffrent entre laversion 3 et 4 :

    les classes de Junit 3 sont dans le package junit.framework.les classes de Junit 4 sont dans le package org.junit.

    Claude Duvallet 35/43 Framework

  • PrsentationUn premier exemple

    Lcriture des cas de testsLinitialisation des cas de tests

    Lexcution des testsJUnit 4

    La dfinition dune classe de tests

    I Une classe de tests na plus lobligation dtendre la classeTestCase sous rserve dutiliser les annotations dfinies parJUnit et dutiliser des imports static sur les mthodes de la classeorg.junit.Assert.

    I Exemple :import org.junit.*;import static org.junit.Assert.*;

    public class MaClasse {

    }

    Claude Duvallet 36/43 Framework

  • PrsentationUn premier exemple

    Lcriture des cas de testsLinitialisation des cas de tests

    Lexcution des testsJUnit 4

    La dfinition des cas de tests (1/2)I Les mthodes contenant les cas de tests nont plus dobligation

    utiliser la convention de nommage qui imposait de prfixer le nomdes mthodes par test.

    I Avec JUnit 4, il suffit dannoter la mthode avec lannotation@Test.

    I Il est ainsi possible dutiliser nimporte quelle mthode commecas de test simplement en utilisant lannotation @Test.

    I Exemple :@Testpublic void getNom() {assertEquals("est ce que nom est correct", "nom1", personne.getNom());

    }

    I Ceci permet dutiliser le nom de mthode que lon souhaite.I Il est cependant conseill de dfinir et dutiliser une convention

    de nommage qui facilitera lidentification des classes de tests etdes cas de tests.

    Claude Duvallet 37/43 Framework

  • PrsentationUn premier exemple

    Lcriture des cas de testsLinitialisation des cas de tests

    Lexcution des testsJUnit 4

    La dfinition des cas de tests (2/2)I Il est par exemple possible de maintenir les conventions de

    nommage de JUnit 3.I Lannotation @Ignore permet de demander au framework

    dignorer un cas de tests.I Les cas de tests dans ce cas sont marqus avec la lettre I lors de

    leur excution en mode console.I Son utilisation ne doit pas devenir une solution certains

    problmes.I JUnit 4 inclut deux nouvelles surcharges de la mthode

    assertEquals() qui permettent de comparer deux tableauxdobjets.

    I La comparaison se fait sur le nombre doccurrences dans lestableaux et sur lgalit de chaque objet dun tableau dans lautretableau.

    Claude Duvallet 38/43 Framework

  • PrsentationUn premier exemple

    Lcriture des cas de testsLinitialisation des cas de tests

    Lexcution des testsJUnit 4

    Linitialisation des cas des tests (1/3)

    I JUnit 3 imposait une redfinition des mthodes setUp() ettearDown() pour dfinir des traitements excutssystmatiquement avant et aprs chaque cas de test.

    I JUnit 4 propose simplement dannoter la mthode excute avantavec lannotation @Before et la mthode excute aprs aveclannotation @After.

    I Exemple :@Beforepublic void initialiser() throws Exception {personne = new Personne("nom1","prenom1");

    }

    @Afterpublic void nettoyer() throws Exception {personne = null;

    }

    Claude Duvallet 39/43 Framework

  • PrsentationUn premier exemple

    Lcriture des cas de testsLinitialisation des cas de tests

    Lexcution des testsJUnit 4

    Linitialisation des cas des tests (2/3)

    I Il est possible dannoter une ou plusieurs mthodes avec@Before ou @After.

    I Dans ce cas, toutes les mthodes seront invoques au momentcorrespondant leur annotation.

    I Il nest pas ncessaire dinvoquer explicitement les mthodesannotes avec @Before et @After dune classe mre.

    I Tant que ces mthodes ne sont pas redfinies, elles serontautomatiquement invoques lors de lexcution des tests :

    les mthodes annotes avec @Before de la classe mre serontinvoques avant celles de la classe fille.les mthodes annotes avec @After de la classe fille serontinvoques avant celles de la classe mre.

    Claude Duvallet 40/43 Framework

  • PrsentationUn premier exemple

    Lcriture des cas de testsLinitialisation des cas de tests

    Lexcution des testsJUnit 4

    Linitialisation des cas des tests (3/3)

    I JUnit 4 propose simplement dannoter une ou plusieursmthodes excutes avant lexcution du premier cas de testsavec lannotation @BeforeClass et une ou plusieurs mthodesexcutes aprs lexcution de tous les cas de test de la classeavec lannotation @AfterClass.

    I Ces initialisations peuvent tre trs utiles notamment pour desconnexions coteuses des ressources quil est prfrable de neraliser quune seule fois plutt qu chaque cas de tests.

    I Ceci peut contribuer amliorer les performances lors delexcution des tests.

    Claude Duvallet 41/43 Framework

  • PrsentationUn premier exemple

    Lcriture des cas de testsLinitialisation des cas de tests

    Lexcution des testsJUnit 4

    Le test de la leve dexceptions (1/2)

    I Avec JUnit 3, pour vrifier la leve dune exception dans un casde test, il faut entourer lappel du traitement dans un bloctry/catch et invoquer la mthode fail() la fin du bloc try.

    I JUnit 4 propose une annotation pour faciliter la vrification de lalever dune exception.

    I Lattribut expected de lannotation @Test attend comme valeur laclasse de lexception qui devrait tre leve.

    I Exemple :@Test(expected=IllegalArgumentException.class)public void setNom() {personne.setNom("nom2");assertEquals("est ce que nom est correct", "nom2", personne.getNom());personne.setNom(null);

    }

    Claude Duvallet 42/43 Framework

  • PrsentationUn premier exemple

    Lcriture des cas de testsLinitialisation des cas de tests

    Lexcution des testsJUnit 4

    Le test de la leve dexceptions (2/2)

    I Si lors de lexcution du test lexception du type prcise nestpas leve (aucune exception leve ou une autre exception estleve) alors le test choue.

    I Attention : lutilisation de lannotation ne permet que de vrifierque lexception est leve.

    I Pour vrifier des proprits de lexception, il est ncessairedutiliser le mcanisme utilis avec JUnit 3 pour capturerlexception et ainsi avoir accs aux membres de son instance.

    Claude Duvallet 43/43 Framework

    PrsentationUn premier exempleL'criture des cas de testsL'initialisation des cas de testsL'excution des tests JUnit 4