You are on page 1of 43

Prsentation

Un premier exemple
Lcriture des cas de tests
Linitialisation des cas de tests
Lexcution 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
Claude.Duvallet@gmail.com
http://litis.univ-lehavre.fr/duvallet/
Claude Duvallet 1/43 Framework
Prsentation
Un premier exemple
Lcriture des cas de tests
Linitialisation des cas de tests
Lexcution des tests
JUnit 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
Prsentation
Un premier exemple
Lcriture des cas de tests
Linitialisation des cas de tests
Lexcution des tests
JUnit 4
Prsentation (1/4)

JUnit est une bibliothque de tests unitaires pour Java.

Cr par Kent Beck et Erich Gamma, JUnit est certainement le


projet de la srie des xUnit connaissant le plus de succs.

JUnit dnit deux types de chiers de tests :


Les TestCase sont des classes contenant un certain nombre de
mthodes de tests. Un TestCase sert gnralement tester le
bon fonctionnement dune classe.
Une TestSuite permet dexcuter un certain nombre de
TestCase dj dnis.

Junit est intgr par dfaut dans les environnements de


dveloppement Java tels quEclipse et Netbeans.

Le principal intrt de JUnit est de sassurer que le code rpond


toujours aux besoins mme aprs dventuelles modications.

Plus gnralement, ce type de tests est appel tests unitaires de


non rgression.
Claude Duvallet 3/43 Framework
Prsentation
Un premier exemple
Lcriture des cas de tests
Linitialisation des cas de tests
Lexcution des tests
JUnit 4
Prsentation (2/4)

JUnit propose :
Un framework pour le dveloppement des tests unitaires reposant
sur des assertions qui testent les rsultats attendus.
Des applications pour permettre lexcution des tests et afcher
les rsultats.

Le but est dautomatiser les tests qui sont exprims dans des
classes sous la forme de cas de tests avec leurs rsultats
attendus.

JUnit excute ces tests et les comparent avec ces rsultats.

Cela permet de sparer le code de la classe, du code qui permet


de la tester.

Souvent pour tester une classe, il est facile de crer une mthode
main() qui va contenir les traitements de tests.

Linconvnient est que ce code "superu" aux traitements


proprement dit est quil soit inclus dans la classe.
Claude Duvallet 4/43 Framework
Prsentation
Un premier exemple
Lcriture des cas de tests
Linitialisation des cas de tests
Lexcution des tests
JUnit 4
Prsentation (3/4)

De plus, son excution doit se faire manuellement.

La rdaction de cas de tests peut avoir un effet immdiat pour


dtecter des bugs mais surtout elle a un effet long terme qui
facilite la dtection deffets de bords lors de modications.

Les cas de tests sont regroups dans des classes Java qui
contiennent une ou plusieurs mthodes de tests.

Ces cas de tests peuvent tre regroups sous la forme de suites


de tests.

Les cas de tests peuvent tre excuts individuellement ou sous


la forme de suites de tests.

JUnit permet le dveloppement incrmental dune suite de tests.

Avec JUnit, lunit de test est une classe ddie qui regroupe des
cas de tests.
Claude Duvallet 5/43 Framework
Prsentation
Un premier exemple
Lcriture des cas de tests
Linitialisation des cas de tests
Lexcution des tests
JUnit 4
Prsentation (4/4)

Ces cas de tests excutent les tches suivantes :


cration dune instance de la classe et de tout autre objet
ncessaire aux tests
appel de la mthode tester avec les paramtres du cas de test
comparaison du rsultat attendu avec le rsultat obtenu : en cas
dchec, une exception est leve

JUnit est particulirement adapt pour tre utilis avec la


mthode eXtreme Programming (XP) puisque cette mthode
prconise entre autre lautomatisation des tches de tests
unitaires qui ont t dnis avant lcriture du code.

La page ofcielle est lurl : http://junit.org.

La dernire version de JUnit peut tre tlcharge sur le site


www.junit.org.

Pour pouvoir utiliser JUnit, il faut ajouter le chier junit.jar au


classpath.
Claude Duvallet 6/43 Framework
Prsentation
Un premier exemple
Lcriture des cas de tests
Linitialisation des cas de tests
Lexcution des tests
JUnit 4
Un premier exemple (1/3)

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.java
Il faut ensuite crire une classe qui va contenir les diffrents tests
raliser par JUnit.
Claude Duvallet 7/43 Framework
Prsentation
Un premier exemple
Lcriture des cas de tests
Linitialisation des cas de tests
Lexcution des tests
JUnit 4
Un premier exemple (2/3)

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 chier junit.jar qui doit tre
dans le classpath.
Enn, il suft dappeler JUnit pour quil excute la squence de
tests.

Voici le rsultat de lexcution :


javac -cp junit.jar;. MaClasseTest.java
java -cp junit.jar;. junit.textui.TestRunner MaClasseTest
.
Time: 0.005
OK (1 test)
Claude Duvallet 8/43 Framework
Prsentation
Un premier exemple
Lcriture des cas de tests
Linitialisation des cas de tests
Lexcution des tests
JUnit 4
Un premier exemple (3/3)

Attention : le respect de la case dans le nommage des mthodes


de tests est trs important.
Les mthodes de tests doivent obligatoirement commencer par
test en minuscule car JUnit utilise lintrospection pour dterminer
les 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
.F
Time: 0.001
There 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
Prsentation
Un premier exemple
Lcriture des cas de tests
Linitialisation des cas de tests
Lexcution des tests
JUnit 4
Lcriture des cas de tests (1/2)

JUnit propose un framework pour crire les classes de tests.

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

Par convention le nom de la classe de test est compos du nom


de la classe suivi de Test.

Chaque cas de tests fait lobjet dune mthode dans la classe de


tests.

Le nom de ces mthodes doit obligatoirement commencer par le


sufxe test.
Claude Duvallet 10/43 Framework
Prsentation
Un premier exemple
Lcriture des cas de tests
Linitialisation des cas de tests
Lexcution des tests
JUnit 4
Lcriture des cas de tests (2/2)

Chacune de ces mthodes contient gnralement des


traitements en trois tapes :
Instanciation des objets requis
Invocation des traitements sur les objets
Vrication des rsultats des traitements

Il est important de se souvenir lors de lcriture de cas de tests


que ceux-ci doivent tre indpendants les uns des autres.

JUnit ne garantit pas lordre dexcution des cas de tests puisque


ceux-ci sont obtenus par introspection.

Toutes les classes de tests avec JUnit hritent de la classe


Assert.
Claude Duvallet 11/43 Framework
Prsentation
Un premier exemple
Lcriture des cas de tests
Linitialisation des cas de tests
Lexcution des tests
JUnit 4
La dnition de la classe de tests (1/3)

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

Le nom de cette classe est le nom de la classe tester suivi par


"Test".

Une classe de tests doit obligatoirement possder un


constructeur qui attend un objet de type String en paramtre.

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
Prsentation
Un premier exemple
Lcriture des cas de tests
Linitialisation des cas de tests
Lexcution des tests
JUnit 4
La dnition de la classe de tests (2/3)

Dans la classe prcdente, il faut crire une mthode dont le


nom commence par "test" en minuscule suivi du nom du cas de
test (gnralement le nom de la mthode tester).

Chacune de ces mthodes doit avoir les caractristiques


suivantes :
elle doit tre dclare public
elle ne doit renvoyer aucune valeur
elle ne doit pas possder de paramtres.

Par introspection, JUnit va automatiquement rechercher toutes


les mthodes qui respectent cette convention.

Le respect de ces rgles est donc important pour une bonne


excution des tests par JUnit.
Claude Duvallet 13/43 Framework
Prsentation
Un premier exemple
Lcriture des cas de tests
Linitialisation des cas de tests
Lexcution des tests
JUnit 4
La dnition de la classe de tests (3/3)

Exemple : la mthode commence par T et non t


import junit.framework.*;
public class MaClasseTest extends TestCase{
public void TestCalculer() throws Exception {
// assertEquals(2,MaClasse.calculer(1,1));
fail("Cas de test a ecrire");
}
}

Rsultat :
java -cp junit.jar;. junit.textui.TestRunner MaClasseTest
.F
Time: 0,01
There 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 14/43 Framework
Prsentation
Un premier exemple
Lcriture des cas de tests
Linitialisation des cas de tests
Lexcution des tests
JUnit 4
La dnition des cas de tests (1/6)

Chaque classe de tests doit avoir obligatoirement au moins une


mthode de test sinon une erreur est remonte par JUnit.

La dcouverte des mthodes de tests par Junit repose sur


lintrospection :
JUnit recherche les mthodes qui dbutent par test, nont aucun
paramtre et ne retourne aucune valeur.
Ces mthodes peuvent lever des exceptions qui sont
automatiquement captures par JUnit qui remonte alors une
erreur et donc un chec du cas de tests.

Ds quun test choue, lexcution de la mthode correspondante


est interrompue et JUnit passe mthode suivante.

Avec JUnit, la plus petite unit de tests est lassertion dont le


rsultat de lexpression boolenne indique un succs ou une
erreur.
Claude Duvallet 15/43 Framework
Prsentation
Un premier exemple
Lcriture des cas de tests
Linitialisation des cas de tests
Lexcution des tests
JUnit 4
La dnition des cas de tests (2/6)

Les cas de tests utilisent des afrmations (assertion en anglais)


sous la forme de mthodes nommes assertXXX().

Il existe de nombreuses mthodes de ce type qui sont hrites


de la classe junit.framework.Assert :
Mthode Rle
assertEquals()
Vrier lgalit de deux valeurs de type primitif ou objet (en utilisant la mth-
ode equals()). Il existe de nombreuses surcharges de cette mthode pour
chaque type primitif, pour un objet de type Object et pour un objet de type
String.
assertFalse() Vrier que la valeur fournie en paramtre est fausse.
assertNull() Vrier que lobjet fourni en paramtre soit null.
assertNotNull() Vrier que lobjet fourni en paramtre ne soit pas null.
assertSame()
Vrier que les deux objets fournis en paramtre font rfrence la mme
entit.
Exemples identiques :
assertSame("Les deux objets sont identiques", obj1, obj2) ;
assertTrue("Les deux objets sont identiques ", obj1 == obj2) ;
assertNotSame()
Vrier que les deux objets fournis en paramtre ne font pas rfrence la
mme entit.
assertTrue() Vrier que la valeur fournie en paramtre est vraie.
Claude Duvallet 16/43 Framework
Prsentation
Un premier exemple
Lcriture des cas de tests
Linitialisation des cas de tests
Lexcution des tests
JUnit 4
La dnition des cas de tests (3/6)

Bien quil serait possible de nutiliser que la mthode


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

Chacune de ces mthodes possde une version surcharge qui


accepte un paramtre supplmentaire sous la forme dune
chane de caractres indiquant un message qui sera afch en
cas dchec du cas de test.

Le message doit dcrire le cas de test valu "true".

Lutilisation de cette version surcharge est recommande car


elle facilite lexploitation des rsultats des cas de tests.

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
Prsentation
Un premier exemple
Lcriture des cas de tests
Linitialisation des cas de tests
Lexcution des tests
JUnit 4
La dnition des cas de tests (4/6)

Lordre des paramtres contenant la valeur attendue et la valeur


obtenue est important pour obtenir un message derreur able en
cas dchec du cas de test.

Quelque soit la surcharge utilise lordre des deux valeurs


tester est toujours la mme : cest toujours la valeur attendue qui
prcde la valeur courante.

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

Une version surcharge permet de prciser un message qui doit


tre afcher.

Il est aussi souvent utile lors de la dnition des cas de tests de


devoir tester si une exception est leve lors de lexcution.
Claude Duvallet 18/43 Framework
Prsentation
Un premier exemple
Lcriture des cas de tests
Linitialisation des cas de tests
Lexcution des tests
JUnit 4
La dnition des cas de tests (5/6)

Exemple :
import junit.framework.*;
public class MaClasse2Test extends TestCase{
public void testSommer() throws Exception {
MaClasse2 mc = new MaClasse2(0,0);
mc.sommer();
}
}

Rsultat :
java -cp junit.jar;. junit.textui.TestRunner MaClasse2Test
.E
Time: 0,01
There was 1 error:
1) testSommer(MaClasse2Test)java.lang.IllegalStateException:
Les deux valeurs sont nulles
at 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
Prsentation
Un premier exemple
Lcriture des cas de tests
Linitialisation des cas de tests
Lexcution des tests
JUnit 4
La dnition des cas de tests (6/6)

Avec JUnit, pour raliser de tels cas de tests, il suft dappeler la


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

Exemple :
import junit.framework.*;
public class MaClasse2Test extends TestCase{
public void testSommer() throws Exception {
MaClasse2 mc = new MaClasse2(1,1);
// cas de test 1
assertEquals(2,mc.sommer());
// cas de test 2
try {
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
Prsentation
Un premier exemple
Lcriture des cas de tests
Linitialisation des cas de tests
Lexcution des tests
JUnit 4
Linitialisation des cas de tests

Il est frquent que les cas de tests utilisent plusieurs instances


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

Pour raliser ces oprations de cration et de destruction


dobjets, la classe TestCase propose les mthodes setUp() et
tearDown() qui sont respectivement appeles avant et aprs
lappel de chaque mthode contenant un cas de test.

Il suft simplement de les rednir en fonction des besoins.

Le plus simple est de dnir un membre priv du type dont on a


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

Il est important de se souvenir que setUp() est invoque


systmatiquement avant lappel de chaque mthode de tests.
Claude Duvallet 21/43 Framework
Prsentation
Un premier exemple
Lcriture des cas de tests
Linitialisation des cas de tests
Lexcution des tests
JUnit 4
Linitialisation des cas de tests

Sa mise en uvre nest donc requise que si toutes les mthodes


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

Ceci vite de crer linstance dans chaque mthode de tests et


simplie donc lcriture des cas de tests.

La mthode tearDown() peut avoir un grand intrt pour par


exemple librer des ressources comme une connexion une
base de donnes initie dans la mthode setUp().

Pour des besoins particuliers, il peut tre ncessaire dexcuter


du code une seule fois avant lexcution des cas de tests et/ou
excuter du code une fois tous les cas des tests excuts.

JUnit propose pour cela la classe


junit.Extensions.TestSetup qui propose la mise en uvre
du design pattern dcorateur.
Claude Duvallet 22/43 Framework
Prsentation
Un premier exemple
Lcriture des cas de tests
Linitialisation des cas de tests
Lexcution des tests
JUnit 4
Le test de la leve dexceptions

Il est frquent quune mthode puisse lever une ou plusieurs


exceptions durant son excution.

Il faut prvoir des cas de tests pour vrier que dans les
conditions adquates une exception attendue est bien leve.

Pour effectuer la vrication de la leve dune exception, il faut


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

Attention : une erreur courante lorsque lon code ces premiers


tests unitaires est dinclure les invocations de mthodes dans des
blocs try/catch.

Leur utilisation doit tre uniquement rserve.

Dans tous les autres cas, il faut laisser lexception se propager :


JUnit va automatiquement reporter un chec du test.

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
Prsentation
Un premier exemple
Lcriture des cas de tests
Linitialisation des cas de tests
Lexcution des tests
JUnit 4
Lhritage dune classe de base

Il est possible de dnir une classe de base qui servira de classe


mre dautres classes de tests notamment en leur fournissant
des fonctionnalits communes.

JUnit nimpose pas quune classe de tests drive directement de


la classe TestCase.

Ceci est particulirement pratique lorsque lon souhaite que


certaines initialisations ou certains traitements soit
systmatiquement excuts (exemple chargement dun chier de
conguration, ...).

Il est par exemple possible de faire des initialisations dans le


constructeur de la classe mre et invoquer ce constructeur dans
les constructeurs des classe lles.
Claude Duvallet 24/43 Framework
Prsentation
Un premier exemple
Lcriture des cas de tests
Linitialisation des cas de tests
Lexcution des tests
JUnit 4
Lexcution des tests (1/2)

JUnit propose trois applications diffrentes nommes


TestRunner pour excuter les tests en mode ligne de
commande ou application graphique :
une application console : junit.textui.TestRunner qui est
trs rapide et adapte une intgration dans un processus de
gnrations automatiques.
une application graphique avec une interface Swing :
junit.swingui.TestRunner.
une application graphique avec une interface AWT :
junit.awtui.TestRunner.

Quelque soit lapplication utilise, les entits suivantes doivent


tre incluses dans le classpath :
le chier 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
Prsentation
Un premier exemple
Lcriture des cas de tests
Linitialisation des cas de tests
Lexcution des tests
JUnit 4
Lexcution des tests (2/2)

Suite lexcution dun cas de test, celui ci peut avoir un des trois
tats suivants :
chou : une exception de type AssertionFailedError est
leve.
en erreur : une exception non mise par le framework et non
capture a t leve dans les traitements.
pass avec succs.

Lchec dun seul cas de test entrane lchec du test complet.

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 dni.
une combinaison des cas prcdents simultanment.
Claude Duvallet 26/43 Framework
Prsentation
Un premier exemple
Lcriture des cas de tests
Linitialisation des cas de tests
Lexcution des tests
JUnit 4
Lexcution des tests dans la console (1/2)

Lutilisation de lapplication console ncessite quelques


paramtres lors de son utilisation :
java -cp junit.jar;. junit.textui.TestRunner MaClasseTest

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

Celle ci doit obligatoirement tre sous la forme pleinement


qualie si elle appartient un package.

Il est possible de faire appel au TestRunner dans une application


en utilisant sa mthode run() et en lui passant en paramtre un
objet de type Class qui encapsule la classe de tests excuter.

Le TestRunner afche le rsultat de lexcution des tests dans la


console.

La premire ligne contient un caractre point pour chaque test


excut.
Claude Duvallet 27/43 Framework
Prsentation
Un premier exemple
Lcriture des cas de tests
Linitialisation des cas de tests
Lexcution des tests
JUnit 4
Lexcution des tests dans la console (2/2)

Lorsque de nombreux tests sont excuts cela permet de suivre


la progression.

Le temps total dexcution en seconde est ensuite afch sur la


ligne "Time :"

En cas derreur, la premire ligne contient un F la suite du


caractre point correspondant au cas de test en chec.

Le rsum de lexcution afche le dtail de chaque cas de tests


qui a chou.

Les cas en chec (failures) correspondent une vrication faite


par une mthode assertXXX() qui a chou.

Les cas en erreur (errors) correspondent la leve inattendue


dune exception lors de lexcution du cas de test.
Claude Duvallet 28/43 Framework
Prsentation
Un premier exemple
Lcriture des cas de tests
Linitialisation des cas de tests
Lexcution des tests
JUnit 4
Lexcution des tests dans une application graphique (1/2)

Pour utiliser des classes de tests avec ces applications


graphiques, il faut obligatoirement que les classes de tests et
toutes celles dont elles dpendent soient incluses dans le
CLASSPATH.

Elles doivent obligatoirement tre sous la forme de chier .class


non incluses dans un chier jar.
java -cp junit.jar;. junit.swingui.TestRunner MaClasseTest

Il suft de cliquer sur le bouton "Run" pour lancer lexcution des


tests.

La case cocher "Reload classes every run" indique JUnit de


recharger les classes chaque excution.

Ceci est trs pratique car cela permet de modier les classes et
de laisser lapplication de tests ouverte.
Claude Duvallet 29/43 Framework
Prsentation
Un premier exemple
Lcriture des cas de tests
Linitialisation des cas de tests
Lexcution des tests
JUnit 4
Lexcution des tests dans une application graphique (2/2)

Si un ou plusieurs tests chouent la barre de rsultats nest plus


verte mais rouge.

Dans ce cas, le nombre derreurs et dchecs est afch ainsi


que leur liste complte.

Il suft den slectionner un pour obtenir le dtail de la raison du


problme.

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


Claude Duvallet 30/43 Framework
Prsentation
Un premier exemple
Lcriture des cas de tests
Linitialisation des cas de tests
Lexcution des tests
JUnit 4
Lexcution rpte dun cas de test

JUnit propose la classe junit.extensions.RepeatedTest qui


permet dexcuter plusieurs fois la mme suite de tests.

Le constructeur de cette classe attend en paramtre une


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

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
Prsentation
Un premier exemple
Lcriture des cas de tests
Linitialisation des cas de tests
Lexcution des tests
JUnit 4
Lexcution concurrente de tests

JUnit propose la classe junit.extensions.ActiveTestSuite


qui permet dexcuter plusieurs suites de tests chacune dans un
thread ddi.

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

Lensemble de la suite de tests ne se termine que lorsque tous


les threads sont termins.

Mme si cela nest pas recommand, la classe


ActiveTestSuite peut tre utilise comme un outil de charge
rudimentaire.

Il est possible de combiner lutilisation des classes


ActiveTestsuite et RepeatedTest.
Claude Duvallet 32/43 Framework
Prsentation
Un premier exemple
Lcriture des cas de tests
Linitialisation des cas de tests
Lexcution des tests
JUnit 4
Les suites de tests (1/2)

Les suites de tests permettent de regrouper plusieurs tests dans


une mme classe.

Ceci permet lautomatisation de lensemble des tests inclus dans


la suite et de prciser leur ordre dexcution.

Pour crer une suite, il suft de crer une classe de type


TestSuite et dappeler la mthode addTest() pour chaque
classe de tests ajouter.

Celle ci attend en paramtre une instance de la classe de tests


qui sera ajoute la suite.

Lobjet de type TestSuite ainsi cr doit tre renvoy par une


mthode dont la signature doit obligatoirement tre public
static Test suite().
Claude Duvallet 33/43 Framework
Prsentation
Un premier exemple
Lcriture des cas de tests
Linitialisation des cas de tests
Lexcution des tests
JUnit 4
Les suites de tests (2/2)

Celle ci sera appele par introspection par le TestRunner.

Il peut tre pratique de dnir une mthode main() dans la


classe qui encapsule la suite de tests pour pouvoir excuter le
TestRunner de la console en excutant directement la mthode
statique Run().

Ceci vite de lancer JUnit sur la ligne de commandes.

Deux versions surcharges des constructeurs permettent de


donner un nom la suite de tests.

Un constructeur de la classe TestSuite permet de crer


automatiquement par introspection une suite de tests contenant
tous les tests de la classe fournie en paramtre.

La mthode addTestSuite() permet dajouter une suite une


autre suite.
Claude Duvallet 34/43 Framework
Prsentation
Un premier exemple
Lcriture des cas de tests
Linitialisation des cas de tests
Lexcution des tests
JUnit 4
JUnit 4

JUnit version 4 est une volution majeure depuis les quelques


annes dutilisation de la version 3.8.

Un des grands bnces de cette version est lutilisation des


annotations introduites dans Java 5.

La dnition des cas de tests et des tests ne se fait donc plus sur
des conventions de nommage et sur lintrospection mais sur
lutilisation dannotations ce qui facilite la rdaction des cas de
tests.

Une compatibilit descendante est assure avec les suites de


tests de JUnit 3.8.

Le nom du package des classes de JUnit est diffrent entre la


version 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
Prsentation
Un premier exemple
Lcriture des cas de tests
Linitialisation des cas de tests
Lexcution des tests
JUnit 4
La dnition dune classe de tests

Une classe de tests na plus lobligation dtendre la classe


TestCase sous rserve dutiliser les annotations dnies par
JUnit et dutiliser des imports static sur les mthodes de la classe
org.junit.Assert.

Exemple :
import org.junit.*;
import static org.junit.Assert.*;
public class MaClasse {
}
Claude Duvallet 36/43 Framework
Prsentation
Un premier exemple
Lcriture des cas de tests
Linitialisation des cas de tests
Lexcution des tests
JUnit 4
La dnition des cas de tests (1/2)

Les mthodes contenant les cas de tests nont plus dobligation


utiliser la convention de nommage qui imposait de prxer le nom
des mthodes par test.

Avec JUnit 4, il suft dannoter la mthode avec lannotation


@Test.

Il est ainsi possible dutiliser nimporte quelle mthode comme


cas de test simplement en utilisant lannotation @Test.

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

Ceci permet dutiliser le nom de mthode que lon souhaite.

Il est cependant conseill de dnir et dutiliser une convention


de nommage qui facilitera lidentication des classes de tests et
des cas de tests.
Claude Duvallet 37/43 Framework
Prsentation
Un premier exemple
Lcriture des cas de tests
Linitialisation des cas de tests
Lexcution des tests
JUnit 4
La dnition des cas de tests (2/2)

Il est par exemple possible de maintenir les conventions de


nommage de JUnit 3.

Lannotation @Ignore permet de demander au framework


dignorer un cas de tests.

Les cas de tests dans ce cas sont marqus avec la lettre I lors de
leur excution en mode console.

Son utilisation ne doit pas devenir une solution certains


problmes.

JUnit 4 inclut deux nouvelles surcharges de la mthode


assertEquals() qui permettent de comparer deux tableaux
dobjets.

La comparaison se fait sur le nombre doccurrences dans les


tableaux et sur lgalit de chaque objet dun tableau dans lautre
tableau.
Claude Duvallet 38/43 Framework
Prsentation
Un premier exemple
Lcriture des cas de tests
Linitialisation des cas de tests
Lexcution des tests
JUnit 4
Linitialisation des cas des tests (1/3)

JUnit 3 imposait une rednition des mthodes setUp() et


tearDown() pour dnir des traitements excuts
systmatiquement avant et aprs chaque cas de test.

JUnit 4 propose simplement dannoter la mthode excute avant


avec lannotation @Before et la mthode excute aprs avec
lannotation @After.

Exemple :
@Before
public void initialiser() throws Exception {
personne = new Personne("nom1","prenom1");
}
@After
public void nettoyer() throws Exception {
personne = null;
}
Claude Duvallet 39/43 Framework
Prsentation
Un premier exemple
Lcriture des cas de tests
Linitialisation des cas de tests
Lexcution des tests
JUnit 4
Linitialisation des cas des tests (2/3)

Il est possible dannoter une ou plusieurs mthodes avec


@Before ou @After.

Dans ce cas, toutes les mthodes seront invoques au moment


correspondant leur annotation.

Il nest pas ncessaire dinvoquer explicitement les mthodes


annotes avec @Before et @After dune classe mre.

Tant que ces mthodes ne sont pas rednies, elles seront


automatiquement invoques lors de lexcution des tests :
les mthodes annotes avec @Before de la classe mre seront
invoques avant celles de la classe lle.
les mthodes annotes avec @After de la classe lle seront
invoques avant celles de la classe mre.
Claude Duvallet 40/43 Framework
Prsentation
Un premier exemple
Lcriture des cas de tests
Linitialisation des cas de tests
Lexcution des tests
JUnit 4
Linitialisation des cas des tests (3/3)

JUnit 4 propose simplement dannoter une ou plusieurs


mthodes excutes avant lexcution du premier cas de tests
avec lannotation @BeforeClass et une ou plusieurs mthodes
excutes aprs lexcution de tous les cas de test de la classe
avec lannotation @AfterClass.

Ces initialisations peuvent tre trs utiles notamment pour des


connexions coteuses des ressources quil est prfrable de ne
raliser quune seule fois plutt qu chaque cas de tests.

Ceci peut contribuer amliorer les performances lors de


lexcution des tests.
Claude Duvallet 41/43 Framework
Prsentation
Un premier exemple
Lcriture des cas de tests
Linitialisation des cas de tests
Lexcution des tests
JUnit 4
Le test de la leve dexceptions (1/2)

Avec JUnit 3, pour vrier la leve dune exception dans un cas


de test, il faut entourer lappel du traitement dans un bloc
try/catch et invoquer la mthode fail() la n du bloc try.

JUnit 4 propose une annotation pour faciliter la vrication de la


lever dune exception.

Lattribut expected de lannotation @Test attend comme valeur la


classe de lexception qui devrait tre leve.

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
Prsentation
Un premier exemple
Lcriture des cas de tests
Linitialisation des cas de tests
Lexcution des tests
JUnit 4
Le test de la leve dexceptions (2/2)

Si lors de lexcution du test lexception du type prcise nest


pas leve (aucune exception leve ou une autre exception est
leve) alors le test choue.

Attention : lutilisation de lannotation ne permet que de vrier


que lexception est leve.

Pour vrier des proprits de lexception, il est ncessaire


dutiliser le mcanisme utilis avec JUnit 3 pour capturer
lexception et ainsi avoir accs aux membres de son instance.
Claude Duvallet 43/43 Framework