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