Vous êtes sur la page 1sur 69

Les tests unitaires avec JUnit 5

Achref El Mouelhi

Docteur de l’université d’Aix-Marseille


Chercheur en programmation par contrainte (IA)
Ingénieur en génie logiciel

elmouelhi.achref@gmail.com

H & H: Research and Training 1 / 48


Plan

1 Introduction

2 Premier exemple

3 Avec les assertions

4 Pre/Post test

5 Mockito

6 JUnit et Maven

7 Autres annotations

8 Recouvrement du code

H & H: Research and Training 2 / 48


Introduction

JUnit
JUnit ?
Framework open source pour Java créé par Kent Beck et Erich
Gamma

I c

H
Permettant d’automatiser les tests et de s’assurer que le
EL
programme répond toujours aux besoins
U
Basé sur les assertions qui vL MOsi les résultats de tests
érifient
r e f E attendus
correspondent aux résultats
h
Membrecde A
c
la famille XUnit (CPPUnit pour C++, CUnit pour C,
PHPUnit pour PHP...)

Objectif
Trouver un maximum de bugs pour les corriger

H & H: Research and Training 3 / 48


Introduction

JUnit

TestCase (cas de test)


Classe Java
I c
LH
Contenant quelques méthodes de test (annotées par @Test)
Ed’une
O U
Permettant de tester le bon fonctionnement classe (en
L M
testant ses méthodes)
re f E
c h
c A
Remarque

Si le test ne détecte pas d’erreur ; il n’y en a pas.

H & H: Research and Training 4 / 48


Premier exemple

JUnit

Étape

Création d’un Java Project


I c

H
EL et
U
Création de deux Package : org.eclipse.main
org.eclipse.test
L MO
e
Pour chaque classercr
E
éfée dans org.eclipse.main, on lui
associe uneA h
c de test (dans org.eclipse.test)
classe
c
On prépare le test et ensuite on le lance : s’il y a une erreur, on la
corrige et on relance le test.

H & H: Research and Training 5 / 48


Premier exemple

JUnit

Création d’une première classe Calcul


package org.eclipse.main;

I c

public class Calcul {
public int somme(int x, int y) { ELH
U
return x + y;
L MO
}
f E
hre
public int division(int x, int y) {
c
if (y == 0)
c A

throw new ArithmeticException();
return x / y;
}
}

H & H: Research and Training 6 / 48


Premier exemple

JUnit
Pour créer une classe de test

Faire un clic droit sur le package org.eclipse.test

Aller dans New > JUnit Test Case

I c
Saisir le nom CalculTest dans Name
EL H
Cocher les 4 cases de Which method stubsU
MO
would you like to
create ?
L
fdeEClass under test
Cliquer sur Browse en r
c h e
face

Chercherc
A
calcul, sélectionner Calcul - org.eclipse.main et valider

Cliquer sur Next puis cocher les cases correspondantes de somme et


division dans Calcul

Cliquer sur Finish puis sur ok (pour valider Add JUnit 5 library to the
build path dans Perform the following action:)

H & H: Research and Training 7 / 48


Premier exemple

Le code généré :
package org.eclipse.test;

import static org.junit.jupiter.api.Assertions.*;

import org.junit.jupiter.api.Test;

class CalculTest {
@BeforeAll
I c

static void setUpBeforeClass() throws Exception { }
ELH
@AfterAll
U
MO
static void tearDownAfterClass() throws Exception { }
@BeforeEach
void setUp() throws Exception {
f E L}
@AfterEach
chre
c A
void tearDown() throws Exception { }
@Test

void testSomme() {
fail("Not yet implemented");
}
@Test
void testDivision() {
fail("Not yet implemented");
}
}

H & H: Research and Training 8 / 48


Premier exemple

JUnit
Nous parlerons de ces quatre méthodes dans une autre section
@BeforeAll
static void setUpBeforeClass() throws Exception {
}
I c

@AfterAll H
EL Exception {
U
}
L MO
static void tearDownAfterClass() throws

@BeforeEach chr
ef E
c Athrows Exception {

void setUp()
}

@AfterEach
void tearDown() throws Exception {
}

H & H: Research and Training 9 / 48


Premier exemple

JUnit

Pour tester

I c

Faire un clic droit sur le la classe de test
Aller dans Run As > JUnit Test UE
LH
L MO
h r e fE
A c
c

H & H: Research and Training 10 / 48


Premier exemple

JUnit

Pour tester

I c

Faire un clic droit sur le la classe de test
Aller dans Run As > JUnit Test UE
LH
L MO
h r e fE
A c
Résultat
c
2 Exécutions : 2 Échecs : car les deux méthodes de test sont vides

H & H: Research and Training 10 / 48


Premier exemple

JUnit
Implémentons testSomme() en ciblant chaque fois les cas particuliers
void testSomme() {
Calcul calcul = new Calcul();
if (calcul.somme(2, 3) != 5)
fail("faux pour deux entiers positifs");
I c

if (calcul.somme(-2, -3) != -5)
ELH
fail("faux pour deux entiers négatifs");
U
if (calcul.somme(-2, 3) != 1)
L MO
E
fail("faux pour deux entiers de signe différent");
f
if (calcul.somme(0, 3) != 3)
chre
c A
fail("faux pour x nul");

if (calcul.somme(2, 0) != 2)
fail("faux pour y nul");
if (calcul.somme(0, 0) != 0)
fail("faux pour x et y nuls");
}

H & H: Research and Training 11 / 48


Premier exemple

JUnit
Implémentons testSomme() en ciblant chaque fois les cas particuliers
void testSomme() {
Calcul calcul = new Calcul();
if (calcul.somme(2, 3) != 5)
fail("faux pour deux entiers positifs");
I c

if (calcul.somme(-2, -3) != -5)
ELH
fail("faux pour deux entiers négatifs");
U
if (calcul.somme(-2, 3) != 1)
L MO
E
fail("faux pour deux entiers de signe différent");
f
if (calcul.somme(0, 3) != 3)
chre
c A
fail("faux pour x nul");

if (calcul.somme(2, 0) != 2)
fail("faux pour y nul");
if (calcul.somme(0, 0) != 0)
fail("faux pour x et y nuls");
}

En testant, plus d’échec pour somme.


H & H: Research and Training 11 / 48
Avec les assertions

JUnit

Nous pouvons réaliser des tests en utilisant les assertions

assertTrue(condition, message) : permet de vérifier que


la condition fournie en paramètre est vraie
I c

ELH
assertFalse(condition, message) : permet de vérifier que
la condition fournie en paramètre est fausse U
L MO
E
assertEquals(valeur attendue, appel de méthode,
f
A c
assertNotEquals)
hre
message) : permet de vérifier l’égalité (sa réciproque est

c

assertNotNull(message, object) permet de vérifier, pour
les paramètres utilisés, qu’une méthode ne retourne pas la valeur
null (sa réciproque est assertNull)
...

H & H: Research and Training 12 / 48


Avec les assertions

JUnit

Remarques
I c
H
EL d’erreur par
En l’absence d’un message explicite, un message
U
défaut sera affiché.
L MO
Les méthodes assertX()
h r e f Epeuvent aussi avoir la signature

A c
suivante : assertX(message, valeurAttendue,
c
appelDeMéthodeATester)

H & H: Research and Training 13 / 48


Avec les assertions

Implémentons la méthode testDivision()

void testDivision() {
Calcul calcul = new Calcul();
assertFalse(calcul.division(6, 3) == 0, "2 entiers positifs");
assertEquals(2, calcul.division(-6, -3), "2 entiers négatifs");
assertNotNull(calcul.division(-6, 3), "2 entiers de signe diff");
assertTrue(calcul.division(0, 3) == 0, "entier x nul");
Throwable e = null;
I c

try {
calcul.division(2,0);
ELH
}
U
catch (Throwable ex) {
L MO
e = ex;
f E
hre
}

c
assertTrue(e instanceof ArithmeticException);

c A
e = null;
try {

calcul.division(0,0);
}
catch (Throwable ex) {
e = ex;
}
assertTrue(e instanceof ArithmeticException);
}

H & H: Research and Training 14 / 48


Avec les assertions

JUnit

Ajouter des valeurs erronées pour avoir un échec


I c
Le message qui a été saisi sera affiché dansL H
El’icleônepanneau
Failure Trace (vous pouvez cliquer O Usur d’écran, Show
M
L View, en face Failure Trace
Stack Trace in Console
f E
e l’erreur dans la console)
pour visualiser les drétails de
c h

Dans ceccas,Ail faut localiser l’erreur, la corriger et relancer

H & H: Research and Training 15 / 48


Pre/Post test

JUnit

Dans certains cas


Avant de démarrer un test, il faut faire certains traitements :
instancier un objet de la classe,
I c

se connecter à une base de données,
ELH
U
MO
ouvrir un fichier...

f E L
Après le test, il faut aussi fermer certaines ressources : connexion
chre
à une base de données, socket...
c A

H & H: Research and Training 16 / 48


Pre/Post test

JUnit

Dans certains cas


Avant de démarrer un test, il faut faire certains traitements :
instancier un objet de la classe,
I c

se connecter à une base de données,
ELH
U
MO
ouvrir un fichier...

f E L
Après le test, il faut aussi fermer certaines ressources : connexion
chre
à une base de données, socket...

c A
Pour ces cas
On peut utiliser les méthodes setUp() et tearDown() qui sont
respectivement exécutées avant et après l’appel de chaque
méthode de test.

H & H: Research and Training 16 / 48


Pre/Post test

Reprenons les quatre méthodes précédentes et modifions le code

@BeforeAll
static void setUpBeforeClass() throws Exception {
System.out.println("BeforeAll");
}

@AfterAll
I c

static void tearDownAfterClass() throws Exception {
ELH
System.out.println("AfterAll");
U
}
L MO
f E
hre
@BeforeEach
c
void setUp() throws Exception {

} c A

System.out.println("BeforeEach");

@AfterEach
void tearDown() throws Exception {
System.out.println("AfterEach");
}

H & H: Research and Training 17 / 48


Pre/Post test

JUnit

Comprenons les annotations de méthodes précédentes

I c
@BeforeAll : la méthode annotée sera exécutée seulement
avant le premier test H
EécutLée seulement après
U
L MO
@AfterAll : la méthode annotée sera ex

ef E
le dernier test
@BeforeEachc: h la r
méthode annotée sera exécutée avant chaque
test
c A
@AfterEach : la méthode annotée sera exécutée après chaque
test

H & H: Research and Training 18 / 48


Pre/Post test

JUnit

Pour mieux comprendre


Lancer le test JUnit

I c

ELH
U
L MO
f E
chre
c A

H & H: Research and Training 19 / 48


Pre/Post test

JUnit

Pour mieux comprendre


Lancer le test JUnit

I c

ELH
U
Le résultat L MO
f E
BeforeAll
chre
BeforeEach
AfterEach
c A

BeforeEach
AfterEach
AfterAll

H & H: Research and Training 19 / 48


Pre/Post test

Utilisons ces méthodes pour restructurer la classe CalculTest


class CalculTest {
Calcul calcul;
@BeforeAll
static void setUpBeforeClass() throws Exception { }
@AfterAll
static void tearDownAfterClass() throws Exception { }
@BeforeEach
void setUp() throws Exception {
I c

calcul = new Calcul();
ELH
}
U
@AfterEach
void tearDown() throws Exception {
L MO
f E
hre
calcul = null;
}
c
c A
@Test


void testSomme() {
// le code précédent sans l’instanciation de calcul
}
@Test
void testDivision() {
// le code précédent sans l’instanciation de calcul
}
}

H & H: Research and Training 20 / 48


Mockito

JUnit

Mock ?
Objet factice (fake object)

I c

permettant de reproduire le comportement d’un objet réel non
implémenté
ELH
U
L MO
f E
chre
c A

H & H: Research and Training 21 / 48


Mockito

JUnit

Mock ?
Objet factice (fake object)

I c

permettant de reproduire le comportement d’un objet réel non
implémenté
ELH
U
L MO
f E
Mockito ? A c hre
c
Framework open source pour Java
Générateur automatique de doublures
Un seul type de Mock possible et une seule façon de le créer

H & H: Research and Training 21 / 48


Mockito

JUnit

I c

Exemple, supposant qu’on
EL H
a une interface CalculService ayantU
M O une méthode carre()

f L
E sommeCarre() dans Calcul qui
veut développer une méthode
r e
utilise la méthodehcarre() de cette interface CalculService
c
c A

H & H: Research and Training 22 / 48


Mockito

JUnit

L’interface CalculService

I c

package org.eclipse.main;
E LH
U
MO{
public interface CalculService
L
h r e
public int carre(intf Ex);
A c
} c

H & H: Research and Training 23 / 48


Mockito

JUnit
La classe Calcul
package org.eclipse.main;

public class Calcul {


I c

CalculService calculService;
EL {H
U
L MO
public Calcul(CalculService calculService)
this.calculService = calculService;
}
h r e fE
A c
c
somme(calculService.carre(x),
public int
return
sommeCarre(int x, int y) {
calculService.
carre(y));
}

// + le code précédent

H & H: Research and Training 24 / 48


Mockito

JUnit
Pour tester la classe Calcul dans TestCalcul, il faut commencer par
instancier CalculService
class CalculTest {
Calcul calcul;
CalculService calculService;
I c

EL H
@BeforeEach
O U
L M
void setUp() throws Exception {

}
h r fE
calcul = new Calcul(calculService);
e
A c
@Test c
void testSommeCarre() {
assertTrue(calcul.sommeCarre(2, 3) == 13, "calcul
exact");
}
// + le code precedent

H & H: Research and Training 25 / 48


Mockito

JUnit
En testant, on aura l’erreur suivante

java.lang.NullPointerException
at org.eclipse.main.Calcul.sommeCarre(Calcul.java:6)
at org.eclipse.test.CalculTest.testSommeCarre(CalculTest.
java:26)
I c

ELH
U
L MO
f E
chre
c A

H & H: Research and Training 26 / 48


Mockito

JUnit
En testant, on aura l’erreur suivante

java.lang.NullPointerException
at org.eclipse.main.Calcul.sommeCarre(Calcul.java:6)
at org.eclipse.test.CalculTest.testSommeCarre(CalculTest.
java:26)
I c

ELH
U
L MO
Explication
f E
chre
c A
La source de l’erreur est l’appel de la méthode carre(x) qui n’est pas

implémenté.

Pour corriger cette erreur, on peut utiliser les STUB

STUB (les bouchons en français) : classes qui renvoient en dur une valeur pour
une méthode invoquée

H & H: Research and Training 26 / 48


Mockito

JUnit
Pour tester la classe Calcul dans TestCalcul, il faut
commencer par instancier CalculService
class CalculTest {
Calcul calcul;
I c

H
ELCalculService()
U
CalculService calculService = new
{
L MO
h r e fE
@Override
A ccarre(int x) {
//
c
public int
TODO Auto-generated method stub
return x * x;
}
};
// + le code précédent

H & H: Research and Training 27 / 48


Mockito

JUnit

En testant
I c

tout se passe bien et le test est passé.
ELH
U
L MO
f E
chre
c A

H & H: Research and Training 28 / 48


Mockito

JUnit

En testant
I c

tout se passe bien et le test est passé.
ELH
U
L MO
f E
c
On peut utiliser les mocks
A hre
c
pour cr
éer un objet factice de CalculService

H & H: Research and Training 28 / 48


Mockito

JUnit

Démarche
Aller dans
I c

ELH
https://jar-download.com/artifacts/org.mockito et
U
MO
télécharger mockito-core

f E L
Créer un répertoire lib à la racine du projet

chre
c A
Décompresser l’archive mockito-core et copier les 4 .jar
dans lib
Ajouter les .jar de lib au path du projet

H & H: Research and Training 29 / 48


Mockito

JUnit
Commençons par importer mockito dans la classe CalculTest
import static org.mockito.Mockito.*;

I c

ELH
U
L MO
f E
chre
c A

H & H: Research and Training 30 / 48


Mockito

JUnit
Commençons par importer mockito dans la classe CalculTest
import static org.mockito.Mockito.*;

I c
Remplaçons l’instanciation de CalculService par un mock

EL H
U
CalculService calculService = mock(CalculService.class);

L MO
h r e fE
A c
c

H & H: Research and Training 30 / 48


Mockito

JUnit
Commençons par importer mockito dans la classe CalculTest
import static org.mockito.Mockito.*;

I c
Remplaçons l’instanciation de CalculService par un mock

ELH
U
CalculService calculService = mock(CalculService.class);

L MO
r e E
f devient
c h
La méthode testSommeCarre() ainsi
@Test
c A
void testSommeCarre() {
when(calculService.carre(2)).thenReturn(4);
when(calculService.carre(3)).thenReturn(9);
assertTrue(calcul.sommeCarre(2, 3) == 13, "calcul exact");

H & H: Research and Training 30 / 48


Mockito

JUnit
En testant

tout se passe bien et le test est passé.

I c

ELH
U
L MO
f E
chre
c A

H & H: Research and Training 31 / 48


Mockito

JUnit
En testant

tout se passe bien et le test est passé.

I c

Pour vérifier que notre mock a bien été appelé
ELH
U
MO
on peut utiliser la méthode verify

f E L
chre
c A

H & H: Research and Training 31 / 48


Mockito

JUnit
En testant

tout se passe bien et le test est passé.

I c

Pour vérifier que notre mock a bien été appelé
ELH
U
MO
on peut utiliser la méthode verify

f E L
c h reà testSommeCarre()
c A
Ajoutons la méthode verify
@Test
void testSommeCarre() {
when(calculService.carre(2)).thenReturn(4);
when(calculService.carre(3)).thenReturn(9);
assertTrue(calcul.sommeCarre(2, 3) == 13, "calcul exact");
verify(calculService).carre(2);
}

H & H: Research and Training 31 / 48


Mockito

JUnit

Et si on n’appelle plus la méthode carre() de CalculService dans Calcul

public int sommeCarre(int x, int y) {


return somme(x * x, y * y);
}
I c

ELH
U
L MO
f E
chre
c A

H & H: Research and Training 32 / 48


Mockito

JUnit

Et si on n’appelle plus la méthode carre() de CalculService dans Calcul

public int sommeCarre(int x, int y) {


return somme(x * x, y * y);
}
I c

EL H
OU
Testons de nouveau testSommeCarre()M
fE L
@Test
h
c { r e
c A
void testSommeCarre()
when(calculService.carre(2)).thenReturn(4);
when(calculService.carre(3)).thenReturn(9);
assertTrue(calcul.sommeCarre(2, 3) == 13, "calcul exact");
verify(calculService).carre(2);
}

H & H: Research and Training 32 / 48


Mockito

JUnit

Le résultat est
Wanted but not invoked:
calculService.carre(2);
I c

-> at org.eclipse.test.CalculTest.testSommeCarre(
ELH
CalculTest.java:39)
U
MO
Actually, there were zero interactions with this mock.
L
f E
chre
c A

H & H: Research and Training 33 / 48


Mockito

JUnit

Le résultat est
Wanted but not invoked:
calculService.carre(2);
I c

-> at org.eclipse.test.CalculTest.testSommeCarre(
ELH
CalculTest.java:39)
U
MO
Actually, there were zero interactions with this mock.
L
f E
chre
c A
Explication

tout mock créé doit être invoqué.

H & H: Research and Training 33 / 48


Mockito

JUnit
On peut aussi utiliser les annotations
class CalculTest {
Calcul calcul;
@Mock
CalculService calculService;

I c

@Rule
MockitoRule rule = MockitoJUnit.rule();
ELH
U
@BeforeEach
L MO
void setUp() throws Exception {
f E
hre
MockitoAnnotations.initMocks(this);

c
calcul = new Calcul(calculService);
}
@Test c A

void testSommeCarre() {
when(calculService.carre(2)).thenReturn(4);
when(calculService.carre(3)).thenReturn(9);
assertTrue(calcul.sommeCarre(2, 3) == 13, "calcul exact");
verify(calculService).carre(2);
}
// + les autres tests

H & H: Research and Training 34 / 48


JUnit et Maven

JUnit

Commençons par créer un Java Project avec Maven


Aller dans File > New > Other
I c

Chercher puis sélectionner Maven Project
ELH
U
Cliquer sur Next
L MO
f E
Choisir maven-archetype-quickstart

A c
Remplir les champs hre
c
Group Id avec org.eclipse
Artifact Id avec first-junit-maven
Package avec org.eclipse.main

H & H: Research and Training 35 / 48


JUnit et Maven

JUnit
Vérifier l’existence des deux répertoires
/src/main/java : code source

/src/test/java : code source de test

... I c

ELH
U
L MO
S’il n’y a pas de src/main/java ou src/test/java

Faire clic droit sur le h r e fE


A c projet

Aller dansc
Path > Configure Build Path...
Build

Cliquer sur Order and Export

Cocher les cases Maven Dependencies et JRE System Library

Cliquer sur Apply and Close

H & H: Research and Training 36 / 48


JUnit et Maven

JUnit
Ajouter les dépendances suivantes dans pom.xml
<dependency>
<groupId>org.junit.platform</groupId>
<artifactId>junit-platform-runner</artifactId>
<version>1.2.0</version>
I c

<scope>test</scope>
</dependency>
ELH
U
MO
<dependency>

f E L
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-engine</artifactId>
<version>5.3.1</version>
chre
c A
<scope>test</scope>
</dependency>
<dependency>

<groupId>org.mockito</groupId>
<artifactId>mockito-junit-jupiter</artifactId>
<version>2.23.0</version>
<scope>test</scope>
</dependency>

H & H: Research and Training 37 / 48


JUnit et Maven

JUnit
Pour tester

Supprimer les packages générés src/main/java et src/test/java

Copier les deux packages org.eclipse.main et org.eclipse.test dans


src/main/java et src/test/java

I c

ELH
Annoter les classes de test par @RunWith(JUnitPlatform.class)

U
L MO
f E
chre
c A

H & H: Research and Training 38 / 48


JUnit et Maven

JUnit
Pour tester

Supprimer les packages générés src/main/java et src/test/java

Copier les deux packages org.eclipse.main et org.eclipse.test dans


src/main/java et src/test/java

I c

ELH
Annoter les classes de test par @RunWith(JUnitPlatform.class)

U
L MO
La classe CalculTest
f E
package org.eclipse.main;
chre
c A

import org.junit.platform.runner.JUnitPlatform;
import org.junit.runner.RunWith;

// + les imports précédents

@DisplayName("Test de la classe Calcul")


@RunWith(JUnitPlatform.class)
class CalculTest {
// + tout le code précédent

H & H: Research and Training 38 / 48


Autres annotations

JUnit

Pour désactiver un test, on utilise la notation @Disabled : le test


faux même s’il échoue
I c

@Disabled ELH
U
@Test
L MO
void testSomme() {
f E
if(calcul.somme(2, 3) != 6)
chre
} c A
fail("faux pour deux entiers positifs");

H & H: Research and Training 39 / 48


Autres annotations

JUnit
Utiliser @RepeatedTest pour répéter un test plusieurs fois
@RepeatedTest(3)
void testSomme(RepetitionInfo repetitionInfo) {
assertNotEquals(7, calcul.somme(repetitionInfo.
I c

getCurrentRepetition(),3));
ELH
} U
L MO
f E
chre
c A

H & H: Research and Training 40 / 48


Autres annotations

JUnit
Utiliser @RepeatedTest pour répéter un test plusieurs fois
@RepeatedTest(3)
void testSomme(RepetitionInfo repetitionInfo) {
assertNotEquals(7, calcul.somme(repetitionInfo.
I c

getCurrentRepetition(),3));
ELH
} U
L MO
f E
chre
Explication c A

Il faut remplacer @Test par @RepeatedTest
Pour récupérer l’index de l’itération courante, on déclare un objet
de type RepetitionInfo

H & H: Research and Training 40 / 48


Autres annotations

JUnit

Utiliser @DispllayName pour utiliser un nom d’affichage


personnalisé pour la classe de test ou la méthode de test (peut
I c

donc contenir des espaces et des caractères spéciaux).
EL H
U
@DisplayName("Test de la classe Calcul")
O
class CalculTest {
L M
...
h r e fE
c
@RepeatedTest(3)
A
c
@DisplayName("Trois tests de la méthode somme")
void testSomme(RepetitionInfo repetitionInfo) {
...

H & H: Research and Training 41 / 48


Autres annotations

JUnit
Utiliser @ParameterizedTest pour paramétrer un test
@DisplayName("Test de la methode somme")
@ParameterizedTest
@ValueSource(ints = {2, 3})
void testSomme(int t) {
I c

}
assertNotEquals(5, calcul.somme(t, 1));
ELH
U
L MO
f E
chre
c A

H & H: Research and Training 42 / 48


Autres annotations

JUnit
Utiliser @ParameterizedTest pour paramétrer un test
@DisplayName("Test de la methode somme")
@ParameterizedTest
@ValueSource(ints = {2, 3})
void testSomme(int t) {
I c

}
assertNotEquals(5, calcul.somme(t, 1));
ELH
U
L MO
f E
hre
Explication

A c
Il faut remplacer @Test par @ParameterizedTest
c
Cette méthode sera testée deux fois, une fois pour la valeur 2 et une fois pour la
valeur 3

@ValueSource indique les valeurs à injecter dans t lors de chaque appel

Il existe aussi strings, longs et doubles

H & H: Research and Training 42 / 48


Autres annotations

JUnit

Pour utiliser l’annotation @ParameterizedTest, il faut ajouter la


dépendance suivante :
I c

<dependency> E L H
U
MO
<groupId>org.junit.jupiter</groupId>
L
h r fE
<artifactId>junit-jupiter-params</artifactId>
e
<version>5.3.1</version>
A c
<scope>test</scope>
c
</dependency>

H & H: Research and Training 43 / 48


Autres annotations

JUnit
Pour activer ou désactiver un test selon le système d’exploitation, on utilise soit
@DisabledOnOs soit @EnabledOnOs
@Test
@DisabledOnOs(MAC)
void testSommeCarre() {
I c

when(calculService.Carre(2)).thenReturn(4);
when(calculService.Carre(3)).thenReturn(9);
ELH
U
MO
assertTrue(calcul.sommeCarre(2, 3) == 13, "calcul exact");
verify(calculService).Carre(2);
f E L
hre
}

c
c A

H & H: Research and Training 44 / 48


Autres annotations

JUnit
Pour activer ou désactiver un test selon le système d’exploitation, on utilise soit
@DisabledOnOs soit @EnabledOnOs
@Test
@DisabledOnOs(MAC)
void testSommeCarre() {
I c

when(calculService.Carre(2)).thenReturn(4);
when(calculService.Carre(3)).thenReturn(9);
ELH
U
MO
assertTrue(calcul.sommeCarre(2, 3) == 13, "calcul exact");
verify(calculService).Carre(2);
f E L
hre
}

A c
c
Il faut importer la constante MAC
import static org.junit.jupiter.api.condition.OS.MAC;

H & H: Research and Training 44 / 48


Autres annotations

JUnit
Pour activer ou désactiver un test selon le système d’exploitation, on utilise soit
@DisabledOnOs soit @EnabledOnOs
@Test
@DisabledOnOs(MAC)
void testSommeCarre() {
I c

when(calculService.Carre(2)).thenReturn(4);
when(calculService.Carre(3)).thenReturn(9);
ELH
U
MO
assertTrue(calcul.sommeCarre(2, 3) == 13, "calcul exact");
verify(calculService).Carre(2);
f E L
hre
}

A c
c
Il faut importer la constante MAC
import static org.junit.jupiter.api.condition.OS.MAC;

Autres constantes possibles : LINUX, WINDOWS


H & H: Research and Training 44 / 48
Autres annotations

JUnit
Pour activer ou désactiver un test selon la version de JRE, on utilise soit
@DisabledOnJre soit @EnabledOnJre

@Test
@DisabledOnOs(MAC)
@EnabledOnJre(JAVA_10)
I c

void testSommeCarre() {
ELH
when(calculService.Carre(2)).thenReturn(4);
U
when(calculService.Carre(3)).thenReturn(9);
L MO
E
assertTrue(calcul.sommeCarre(2, 3) == 13, "calcul exact");
f
hre
verify(calculService).Carre(2);
c
c A
}

H & H: Research and Training 45 / 48


Autres annotations

JUnit
Pour activer ou désactiver un test selon la version de JRE, on utilise soit
@DisabledOnJre soit @EnabledOnJre

@Test
@DisabledOnOs(MAC)
@EnabledOnJre(JAVA_10)
I c

void testSommeCarre() {
ELH
when(calculService.Carre(2)).thenReturn(4);
U
when(calculService.Carre(3)).thenReturn(9);
L MO
E
assertTrue(calcul.sommeCarre(2, 3) == 13, "calcul exact");
f
hre
verify(calculService).Carre(2);
c
c A
}


Il faut importer la constante JAVA 10

import static org.junit.jupiter.api.condition.JRE.JAVA_10;

H & H: Research and Training 45 / 48


Autres annotations

JUnit
Pour activer ou désactiver un test selon la version de JRE, on utilise soit
@DisabledOnJre soit @EnabledOnJre

@Test
@DisabledOnOs(MAC)
@EnabledOnJre(JAVA_10)
I c

void testSommeCarre() {
ELH
when(calculService.Carre(2)).thenReturn(4);
U
when(calculService.Carre(3)).thenReturn(9);
L MO
E
assertTrue(calcul.sommeCarre(2, 3) == 13, "calcul exact");
f
hre
verify(calculService).Carre(2);
c
c A
}


Il faut importer la constante JAVA 10

import static org.junit.jupiter.api.condition.JRE.JAVA_10;

Autres constantes possibles : JAVA 8, JAVA 9

H & H: Research and Training 45 / 48


Autres annotations

JUnit

Pour activer ou désactiver un test selon la valeur d’un test logique (on peut
même utiliser une expression régulière), on utilise soit @DisabledIf soit
@EnabledIf
I c

@Test
ELH
U
MO
@DisabledOnOs(MAC)
@DisabledIf("2 * 3 > 4")
void testSommeCarre() {
f E L
hre
when(calculService.Carre(2)).thenReturn(4);
c
c A
when(calculService.Carre(3)).thenReturn(9);

assertTrue(calcul.sommeCarre(2, 3) == 13, "calcul exact");
verify(calculService).Carre(2);
}

H & H: Research and Training 46 / 48


Recouvrement du code

JUnit

Objectif

On veut vérifier si nos tests couvrent l’intégralité de notre code


Ou s’il y a des zones inaccessibles dans notre code
I c

ELH
U
L MO
f E
chre
c A

H & H: Research and Training 47 / 48


Recouvrement du code

JUnit

Objectif

On veut vérifier si nos tests couvrent l’intégralité de notre code

I c

Ou s’il y a des zones inaccessibles dans notre code
ELH
U
MO EclEmma
Pour cela, il faut installer un plugin Eclipse
L
e
Aller dans Help > rInstall
h f E New Software > Add
A cdans Name et http://update.eclemma.org/
c
Saisir EclEmma
dans Location
Cocher la case EclEmma et cliquer sur Next
Terminer l’installation et redémarrer Eclipse

H & H: Research and Training 47 / 48


Recouvrement du code

JUnit

Pour tester le recouvrement du code


I c

Aller dans Window > Show View > Other ...
ELH
U
Saisir Coverage et valider
L MO
f E
hre
Aller dans Run
c
les tests
c A
Cliquer sur Coverage et vérifier si votre code est bien couvert par

H & H: Research and Training 48 / 48

Vous aimerez peut-être aussi