Développement Web - Unit Testing

Transcription

Développement Web - Unit Testing
Développement Web - Unit Testing - JUnit
Développement Web - Unit Testing - JUnit
Jean-Michel Richer
[email protected]
http://www.info.univ-angers.fr/pub/richer
L3 Pro Informatique 2010-2011
1 / 29
Développement Web - Unit Testing - JUnit
Plan
Plan
1
Introduction
2
Les frameworks xUnit et JUnit
3
Utilisation avec Ant ou Eclipse
4
Bibliographie
2 / 29
Développement Web - Unit Testing - JUnit
Plan
Unit Testing - JUnit
Objectifs
• se familiariser avec JUnit
• appréhender les annotations JUnit
3 / 29
Développement Web - Unit Testing - JUnit
Introduction
Introduction
Introduction
4 / 29
Développement Web - Unit Testing - JUnit
Introduction
Pourquoi tester
Pourquoi tester les programmes
• identifier au plus tôt les erreurs simples
• débusquer les bugs dormants
• assurer la non-régression du code
• vérifier la cohérence de l’application
• vérifier le bon fonctionnement (correction)
5 / 29
Développement Web - Unit Testing - JUnit
Introduction
Qu’est ce que le DDT
Definition (DDT ou TDD - Test Driven Development)
• cycle de vie du logiciel traditionnel :
• écriture du code
• écriture des tests (rare ou sommaire)
• problème : les tests ne sont souvent pas écrits !
• l’application peut comporter des bugs difficiles à identifier
6 / 29
Développement Web - Unit Testing - JUnit
Introduction
Ecrire les tests
Ecrire les tests
• fait partie des best practices pour un développement
logiciel professionnel
• perte de temps : écriture des tests
• gain de temps : on ne cherche pas les erreurs pendant des
heures
• meilleure connaissance des fonctions / classes
7 / 29
Développement Web - Unit Testing - JUnit
Introduction
Mise en oeuvre
Mise en oeuvre
• utiliser un framework
• lancer les tests durant la nuit (grosse application)
• rapport de bugs et correction le matin
8 / 29
Développement Web - Unit Testing - JUnit
Les frameworks xUnit et JUnit
Les frameworks xUnit et JUnit
Les frameworks xUnit et JUnit
9 / 29
Développement Web - Unit Testing - JUnit
Les frameworks xUnit et JUnit
Les frameworks xUnit
xUnit
ensemble de packages logiciels fondés sur le même modèle et
utilisés pour mettre en place les tests unitaires
• cppUnit (C++)
• phpUnit (PHP)
• JUnit (Java) : http://junit.org/
• autres langages : Ada, Fortran, Perl, Python, Pascal, ...
10 / 29
Développement Web - Unit Testing - JUnit
Les frameworks xUnit et JUnit
Le framework JUnit
JUnit
• basé sur la notion de TestSuites (ensemble de tests pour
des classes)
• et TestCases (ensemble de tests pour une classe)
• notion qui disparait avec la version 4 de JUnit
• remplacement par les annotations
• simple à mettre en oeuvre !
11 / 29
Développement Web - Unit Testing - JUnit
Les frameworks xUnit et JUnit
Les annotations JUnit
Les annotations JUnit
dans l’ordre, à placer devant des méthodes :
• @BeforeClass
• @Before
• @Test
• @After
• @AfterClass
12 / 29
Développement Web - Unit Testing - JUnit
Les frameworks xUnit et JUnit
@BeforeClass et @AfterClass
@BeforeClass et @AfterClass
exécutées une seule fois :
• @BeforeClass : exécutée une seule fois avant toutes les
autres méthodes
• @AfterClass : exécutée une seule fois après toutes les
autres méthodes
• doivent être déclarées statiques
13 / 29
Développement Web - Unit Testing - JUnit
Les frameworks xUnit et JUnit
@Before et @After
@Before et @After
exécutées une seule fois avant / après toutes les autres
méthodes
• @Before : exécutée avant chaque méthode de test
• @After : exécutée après chaque méthode de test
14 / 29
Développement Web - Unit Testing - JUnit
Les frameworks xUnit et JUnit
@Test
l’annotation @Test
elle définit une méthode de test avec ou sans paramètres :
• @Test(timeout=100) : temps maximum d’exécution au
delà duquel le test échoue
• @Test(expected=Exception.class) : n’échoue pas
si l’exception est levée
• @Ignore devant @Test permet d’ignorer le test
15 / 29
Développement Web - Unit Testing - JUnit
Les frameworks xUnit et JUnit
les fonctions assert
fonctions assert
définies dans la classe org.junit.Assert, elle permettent de
poser des conditions dont la non validité fait échouer le test :
• assertEquals
• assertFalse, assertTrue
• assertNull, assertNotNull
• assertArrayEquals
• assertThat (cf. transparent ci-après)
16 / 29
Développement Web - Unit Testing - JUnit
Les frameworks xUnit et JUnit
Cas des doubles avec assertEquals
Cas des doubles avec assertEquals
pour comparer des valeurs réelles (double), on utilise un δ
pour la comparaison
• assertEquals(double expected, double
actual, double delta)
|(expected − actual)| ≤ δ
17 / 29
Développement Web - Unit Testing - JUnit
Les frameworks xUnit et JUnit
Les tests paramétriques
Tests paramétriques
ils permettent de lancer les méthodes de tests pour plusieurs
jeux de données
• @RunWith(Parametrized.class) devant la classe
• @Parameters devant le jeux de données
18 / 29
Développement Web - Unit Testing - JUnit
Les frameworks xUnit et JUnit
Les tests paramétriques
Exemple
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
import org.junit.runners.Parameterized;
import org.junit.runners.Parameterized.Parameters;
@RunWith(Parameterized.class)
public class AClassForTest {
@Parameters
public static Collection data() {
return Arrays.asList(new Object[][]{
/* file name, #lines */
{ "a.txt", 800 },
{ "b.txt", 211 }
});
}
protected String fileName;
protected int numberOfLines;
public AClassForTest(String fN, int nOL) {
fileName=fN;
numberOfLines=nOL;
}
}
19 / 29
Développement Web - Unit Testing - JUnit
Les frameworks xUnit et JUnit
Hamcrest assertThat
Hamcrest
framework pour déclarer de manière intuitive des conditions à
vérifier
• fonctionne avec assertThat(T actual, Matcher<T>
matcher)
• véritablement inutile donc indispensable !
voir
http://code.google.com/p/hamcrest/wiki/Tutorial
20 / 29
Développement Web - Unit Testing - JUnit
Les frameworks xUnit et JUnit
Hamcrest assertThat
Exemple Hamcrest
• assertEquals(value, 0.0)
• remplacé par assertThat(value, is(0.0))
ici is est un décorateur et ne sert à rien
21 / 29
Développement Web - Unit Testing - JUnit
Les frameworks xUnit et JUnit
Hamcrest assertThat
Autres foncteurs
• allOf
• anyOf
• not
• equalTo
• notNull
• sameInstance
22 / 29
Développement Web - Unit Testing - JUnit
Les frameworks xUnit et JUnit
Hamcrest exemples
Exemple
1
2
3
4
5
6
7
8
9
10
11
12
13
14
// inutiles
assertThat("Hello", is(anything()));
assertThat("Hello", is(any(String.class)));
assertThat("Hello", is("Hello"));
assertThat("Hello", is(is(is(notNullValue()))));
assertThat(2 + 2, is(equalTo(4)));
// utiles
assertThat("Hello", is(anyOf(nullValue(),
instanceOf(String.class),
equalTo("Goodbye"))));
assertThat("Hello", is(not(anyOf(nullValue(),
instanceOf(Integer.class),
equalTo("Goodbye")))));
23 / 29
Développement Web - Unit Testing - JUnit
Utilisation avec Ant ou Eclipse
Utilisation avec Ant ou Eclipse
Utilisation avec Ant ou Eclipse
24 / 29
Développement Web - Unit Testing - JUnit
Utilisation avec Ant ou Eclipse
JUnit et Eclipse
JUnit et Eclipse
• inclure le jar dans le build path du projet
• utiliser les annotations
• lancer avec Run as / JUnit Test
25 / 29
Développement Web - Unit Testing - JUnit
Utilisation avec Ant ou Eclipse
JUnit et Ant
JUnit et Ant
• inclure le jar dans un répertoire lib du projet
• utiliser le tag <junit>
26 / 29
Développement Web - Unit Testing - JUnit
Utilisation avec Ant ou Eclipse
JUnit et Ant
Exemple
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<!-- run simple tests -->
<property name="bin.dir" value="bin" />
<property name="tst.dir" value="bin" />
<property name="tst.report.dir" value="test report" />
<target name="execute tests">
<echo message="Execute tests" />
<mkdir dir="${tst.report.dir}" />
<echo message="see result of test in ${tst.report.dir} directory" />
<junit printsummary="yes" haltonfailure="yes">
<classpath refid="execute.classpath" />
<classpath location="${tst.dir}" />
<formatter type="plain" />
<batchtest fork="yes" todir="${tst.report.dir}">
<fileset dir="bin">
<include name="**/*Test.class" />
</fileset>
</batchtest>
</junit>
</target>
27 / 29
Développement Web - Unit Testing - JUnit
Bibliographie
Bibliographie
Bibliographie
28 / 29
Développement Web - Unit Testing - JUnit
Bibliographie
Bibliographie, sitographie
• www.junit.org
• Java Power Tools, John Ferguson Smart, O’Reilly, 2008,
ISBN 978-0-596-52793-8
29 / 29

Documents pareils