as
Architecture des Systèmes d’Information
Introduction JUnit Assertions Ex´ecution
Programmation
- Tests unitaires : JUNIT -
Nicolas Malandain
March 10, 2010
Tests Unitaires 1 / 27
as
Architecture des Systèmes d’Information
Introduction JUnit Assertions Ex´ecution
1Introduction
Pr´esentation
Framework de tests unitaires
2JUnit
TestCase
Avant / Apr`es les tests
3Assertions
M´ethodes classiques
M´ethode bas´ee sur des contrats
4Ex´ecution
Cas de Test
Suite de test
Tests Unitaires 2 / 27
Introduction JUnit Assertions Ex´ecution Pr´esentation Framework de tests unitaires
Objectif des tests unitaires
S’assurer du bon fonctionnement
d’une partie ou de la totalit´e d’un logiciel
Utilisation
v´erifier que le code r´epond aux sp´ecification fonctionnelles
permettre de tester facilement le code
lors de modification de code, v´erifier qu’il n’y a pas de r´egression
Les tests unitaires ´etaient tr`es utilis´es pour des applications critiques. La
m´ethode agile XP (eXtreme Programming) les place maintenant au
centre du processus de d´eveloppement
Tests Unitaires 3 / 27
Introduction JUnit Assertions Ex´ecution Pr´esentation Framework de tests unitaires
xUnit
Biblioth`eques xUnit disponibles pour de nombreux langages
AUnit (Ada)
JUnit (Java)
FLEXUnit (Adobe Flex)
NUnit (.NET)
JSUnit (Javascript)
CPPUnit (C++)
. . .
Tests Unitaires 4 / 27
Introduction JUnit Assertions Ex´ecution Pr´esentation Framework de tests unitaires
Le framework JUnit
Cr´e par Kent Beck et Erich Gamma
Principe
un environnement de d´eveloppement simple
un test = un objet
v´erification “`a la chaˆıne” des tests
depuis la version 4.x utilisation des annotations java
Tests Unitaires 5 / 27
Introduction JUnit Assertions Ex´ecution TestCase Avant / Apr`es les tests
Principe des annotations en Java
M´eta-donn´ees
ajout de m´eta-donn´ees (d´eclaratif) dans le code source qui seront
accessibles `a la compilation et `a l’ex´ecution (par r´eflexion).
Deux exemples :
public class A {
@Deprecated
public void laMethode() {
...
}
public void methodeA() {
...
}
}
public class Bextends A {
@Override
public void methodeA() {
...
}
}
Tests Unitaires 6 / 27
Introduction JUnit Assertions Ex´ecution TestCase Avant / Apr`es les tests
Vocabulaire JUnit
Test case (Cas de test)
classe regroupant un ensemble de tests g´en´eralement li´es `a une classe `a
tester
Test
m´ethode effectuant un test
Fixture
contenu commun aux tests d’un cas de test
Test Suite
enchaˆınement de cas de test
Tests Unitaires 7 / 27
Introduction JUnit Assertions Ex´ecution TestCase Avant / Apr`es les tests
Test des m´ethodes d’une classe
Principe
cr´eation d’une classe de test pour chaque classe `a tester
annotation des m´ethodes de test par @Test
Syntaxe (package org.junit)
import org.junit.Test
public class TestDeLaClasse {
@Test
public void testConstructeur() {
// utilisation d’assertions
}
@Test
public void testMethode1() {
// utilisation d’assertions
}
...
}
Tests Unitaires 8 / 27
Introduction JUnit Assertions Ex´ecution TestCase Avant / Apr`es les tests
Param´etrage de @Test
@Test(timeout=dur´ee )
Le test d´eclar´e avec un timeout ´echoue si la m´ethode annot´ee prend plus
de temps que la dur´ee (ms) indiqu´ee .
@Test(expected=ClasseException.class )
Le test d´eclar´e avec une classe d’exception doit lancer cette exception
sinon le test ´echoue.
@Ignore
Une annotation @Test pr´ec´ed´ee d’un @Ignore permet de ne pas passer
le test.
Tests Unitaires 9 / 27
Introduction JUnit Assertions Ex´ecution TestCase Avant / Apr`es les tests
Ex´ecution de code avant et apr`es chaque test
Objectifs
Pr´eparer un contexte avant chaque test et le nettoyer apr`es chaque test
allocation/d´esallocation de ressources, initialisation d’objets “fixes”
(fixtures)
Exemples d’utilisation
allocation de ressources avant un test (cr´eation d’un fichier) et
suppression de ces ressources apr`es le test (destruction d’un fichier)
cr´eation d’objets commun `a chaque test
Syntaxe
Utilisation des annotations @Before et @After devant les m´ethodes
correspondantes
Tests Unitaires 10 / 27
Introduction JUnit Assertions Ex´ecution TestCase Avant / Apr`es les tests
Ex´ecution de code avant et apr`es chaque cas de test
Objectif
Initialisation d’objets fixes commun aux tests : objets constant, singleton,
ou encore ayant un temps de pr´eparation tr`es long.
Syntaxe
Annotations de m´ethodes public static void avec @BeforeClass et
@AfterClass.
Tests Unitaires 11 / 27
Introduction JUnit Assertions Ex´ecution ethodes classiques ethode bas´ee sur des contrats
Pr´esentation des assertions
Assertion (linguistique/philosophique)
“Une assertion repr´esente un ´enonc´e consid´er´e ou pr´esent´e comme vrai”a
awikipedia
Assertion (math´ematique/logique)
“Une assertion est une proposition math´ematique vraie. Cette
proposition vraie s’inscrit dans le cadre d’une th´eorie pr´ecis´ee”a
awikipedia
D’un point de vue g´enie logiciel
Les assertions permettent de v´erifier des hypoth`eses de conceptiona
aJava in a Nutshell, Fifth edition (O’REILLY)
Tests Unitaires 12 / 27
Introduction JUnit Assertions Ex´ecution ethodes classiques ethode bas´ee sur des contrats
Les assertions de base de java classe org.junit.Assert
Quelques m´ethodes de classe :
assertEquals(..., ...) / assertArrayEquals(..., ...)
teste l’´egalit´e des types simples, des objets et des tableaux
assertSame(Object, Object) teste qu’il s’agit du mˆeme objet
assertTrue(boolean)/assertFalse(boolean) teste le r´esultat
d’une expression logique
. . .
Remarque : un commentaire (String) d’assertion peut ˆetre passer en 1
param`etre pour expliquer la raison de l’´echec d’une assertion
Tests Unitaires 13 / 27
Introduction JUnit Assertions Ex´ecution ethodes classiques ethode bas´ee sur des contrats
Exemple avec assertions classiques 1 / 3
TestAmpouleClassique.java
import org.junit.After;
import static org.junit.Assert.*;
import org.junit.Before;
import org.junit.Ignore;
import org.junit.Test;
import java.awt.Color;
public class TestAmpouleClassique {
public Ampoule ampoule;
@Before
public void avantTest() {
ampoule = new Ampoule();
}
@Test
public void test_construteurs() {
assertEquals(ampoule.getCouleur(), Color.WHITE);
assertFalse(ampoule.getEtat());
assertEquals((new Ampoule(Color.BLUE)).getCouleur(),Color.BLUE);
}
@Ignore
@Test
public void test_SetGetCouleur() {
ampoule.setCouleur(Color.RED);
assertEquals(ampoule.getCouleur(), Color.BLUE);
}
@Test(timeout=1000)
public void test_basculer() {
boolean etat = ampoule.getEtat();
assertFalse(etat);
assertTrue(ampoule.basculer());
assertTrue(ampoule.getEtat());
while (etat != ampoule.getEtat()) {
etat=ampoule.getEtat();
ampoule.basculer();
}
assertFalse(ampoule.getEtat());
}
}
Tests Unitaires 14 / 27
Introduction JUnit Assertions Ex´ecution ethodes classiques ethode bas´ee sur des contrats
Exemple avec assertions classiques 2 / 3
Ex´ecution OK
JUnit version 4.5
.Before
After
I.Before
After
Time: 0,017
OK (1 test)
Tests Unitaires 15 / 27
Introduction JUnit Assertions Ex´ecution ethodes classiques ethode bas´ee sur des contrats
Exemple avec assertions classiques 3 / 3
Ex´ecution ´
Echec : ( @Ignore )
JUnit version 4.5
.Before
After
.Before
After
E.Before
After
Time: 0,023
There was 1 failure:
1) test_SetGetCouleur(TestAmpouleClassique)
java.lang.AssertionError: expected:<java.awt.Color[r=255,g=0,b=0]> but was:<java.awt.Color[r=0,g=0,b=255]>
at org.junit.Assert.fail(Assert.java:91)
at org.junit.Assert.failNotEquals(Assert.java:618)
...
at org.junit.runners.ParentRunner.run(ParentRunner.java:220)
at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
at org.junit.runner.JUnitCore.run(JUnitCore.java:116)
at org.junit.runner.JUnitCore.run(JUnitCore.java:107)
at org.junit.runner.JUnitCore.runMain(JUnitCore.java:88)
at org.junit.runner.JUnitCore.runMainAndExit(JUnitCore.java:54)
at org.junit.runner.JUnitCore.main(JUnitCore.java:46)
FAILURES!!!
Tests run: 3, Failures: 1
Tests Unitaires 16 / 27
Introduction JUnit Assertions Ex´ecution ethodes classiques ethode bas´ee sur des contrats
Remarques 1 / 2
Comparaison de 2 valeurs
@Test
public void testNonExplicite1() {
int x = 5;
assertTrue(x>10);
}
@Test
public void testExpliciteAMaintenir() {
int x = 5;
assertTrue(x+" n’est pas sup´erieur `a 10",x>10);
}
Ex´ecution
1) testNonExplicite1(TestNonExplicite)
java.lang.AssertionError:
at org.junit.Assert.fail(Assert.java:91)
at org.junit.Assert.assertTrue(Assert.java:43)
...
2) testExpliciteAMaintenir(TestNonExplicite)
java.lang.AssertionError: 5 n’est pas sup´erieur `a 10
at org.junit.Assert.fail(Assert.java:91)
at org.junit.Assert.assertTrue(Assert.java:43)
Tests Unitaires 17 / 27
Introduction JUnit Assertions Ex´ecution ethodes classiques ethode bas´ee sur des contrats
Remarques 2 / 2
Constations
par d´efaut pas de message explicite de l’´echec
comment assurer la coh´erence du message avec l’assertion dans le
temps ?
rq : il y a redondance entre l’assertion et le message
pas de r´eelles combinaisons d’assertions possible
=les assertions `a base de contrat
Tests Unitaires 18 / 27
Introduction JUnit Assertions Ex´ecution ethodes classiques ethode bas´ee sur des contrats
Les assertions bas´ees sur des contrats 1 / 2
La biblioth`eque JMock
API permettant d’´enoncer des contraintes sur la valeur d’un objet et de
les combiner.
Biblioth`eque d´ecoup´ee en 7 parties :
org.hamcrest.beans
org.hamcrest.collection
org.hamcrest.core
org.hamcrest.number
org.hamcrest.object
org.hamcrest.text
org.hamcrest.xml
Tests Unitaires 19 / 27
Introduction JUnit Assertions Ex´ecution ethodes classiques ethode bas´ee sur des contrats
Les assertions bas´ees sur des contrats 2 / 2
Insertion de JMock dans JUnit 4
ajout de org.hamcrest.core dans JUnit.
Contrats disponibles :
AllOf
AnyOf
DescribedAs
Is
IsAnything
IsEqual
IsInstanceOf
IsNot
IsNull
IsSame
D´eclaration des contrats avec la classe Assert
public static <T> void assertThat(T actual, org.hamcrest.Matcher<T> matcher)
Tests Unitaires 20 / 27
1 / 7 100%
La catégorie de ce document est-elle correcte?
Merci pour votre participation!

Faire une suggestion

Avez-vous trouvé des erreurs dans linterface ou les textes ? Ou savez-vous comment améliorer linterface utilisateur de StudyLib ? Nhésitez pas à envoyer vos suggestions. Cest très important pour nous !