Plan JUnit Lionel Seinturier Université des Sciences et Technologies de Lille Lionel.Seinturier@lifl.fr 1. Introduction 2. Classes de test 28/11/06 JUnit 1 Lionel Seinturier JUnit 2 Lionel Seinturier JUnit 1. Introduction Règles d'écriture Framework de test pour des programmes Java ensemble de librairies pour exécuter des méthodes de test fournit méthodes assert pour vérifier le résultat de code à tester public class Largest { http://www.junit.org hérite de junit.framework.testcase contient méthodes de test méthodes publiques avec un nom commençant par test public class TestLargest extends TestCase { public void testorder() { assertequals(9, Largest.largest(new int[]{7,8,9); public static int largest(int[] list) { int index, max=0; for (index = 0; index < list.length; index++) { if (list[index] > max) max = list[index]; return max; Lancement du test ligne de commande GUI Swing plug-in Eclipse, : java junit.textui.testrunner TestLargest : java junit.swingui.testrunner JUnit 3 Lionel Seinturier JUnit 4 Lionel Seinturier
Que teste-t-on? ne dépend pas de l'ordre des éléments ok en cas de répétition ok en cas de liste avec un seul élément ok en cas de liste vide ok en cas de valeur négative public class TestLargest extends TestCase { public void testorder(){ assertequals(9,largest.largest(new int[]{7,8,9); p v testorder2(){assertequals(9,largest.largest(new int[]{6,9,7,8); p v testdup() { assertequals(9,largest.largest(new int[]{9,7,8,9); p v testone() { assertequals(7,largest.largest(new int[]{7); p v testempty() { assertequals(0,largest.largest(new int[]{); p v void testnegativevalue() { assertequals(-8, Largest.largest(new int[]{-6,-7,-8); Remarque testempty : est-ce que c'est bien ce que l'on veut? amène un questionnement/précision sur les spécifications testnegative There was 1 failure: 1) testnegative(testlargest)junit.framework.assertionfailederror: expected:<-8> but was:<0> at TestLargest.testNegative(TestLargest.java:13) bug!! max = Integer.MIN_VALUE testempty? JUnit 5 Lionel Seinturier JUnit 6 Lionel Seinturier Méthodes fournies par JUnit Remarque si list est null? NullPointerException static int largest(int[] list) throws IllegalArgumentException { if( list == null ) throw new IllegalArgumentException("list shouldn't be null);... void testnull() { try { Largest.largest(null); fail("illegalargumentexception should have been thrown"); catch( IllegalArgumentException iae ) { JUnit 7 Lionel Seinturier assertequals( [ String message, ] expected, actual ) expected, actual int, float, double, boolean, Object : la méthode equals appelée pour tester l'égalité message : facultatif (si absent message par défaut de JUnit) assertnull( [ String message, ] Object object ) assertsame( [ String message, ] expected, actual ) asserttrue( [ String message, ] boolean condition ) assertfalse( [ String message, ] boolean condition ) fail( [ String message ] ) conduit à l'échec du test JUnit 8 Lionel Seinturier
Méthodes fournies par JUnit assertequals( [ String message, ] expected, actual, delta ) pour les types float et double retourne vrai si actual [expected-delta, expected+delta ] exemple : assertequals( 3.33, 10.0/3.0, 0.01 ); Tests exécutés par JUnit Par défaut JUnit exécute dans une classe de test toutes les méthodes public dont le nom commence par test Possibilité de restreintre la liste des tests Tableaux : assertequals égalité de référence (pas de contenu) public void assertarrayequals( Object[] a1, Object[] a2 ) { assertequals(a1.length, a2.length); for( int i=0 ; i<a1.length ; i++ ) assertequals(a1[i], a2[i]); assertarrayequals(new Object[]{4,5, new Object[]{4,7); import ju.f.test; import ju.f.testcase; import ju.f.testsuite; public class TestSimple extends TestCase { public void test1() { asserttrue(true); public void test2() { asserttrue(true); public static Test suite() { TestSuite suite = new TestSuite(); suite.addtest( new Simple("test1") ); return suite; public Simple( String methodname ) { super(methodname); JUnit 9 Lionel Seinturier JUnit 10 Lionel Seinturier Tests exécutés par JUnit Notion de suite de tests (TestSuite) ensemble de tests exécutés en séquence ajout d'un test : addtest(test) ajout des tests d'une autre suite : addtestsuite(class) public class TestComposite extends TestCase { public static Test suite() { TestSuite suite = new TestSuite(); suite.addtest( new Simple("test2") ); suite.addtestsuite( TestSimple.class ); suite.addtest( TestSimple.suite() ); return suite; Initialisation des tests chaque méthode de test est exécutée indépendamment des autres besoin : initialisation avant d'exécuter le test méthode setup() exécutée avant chaque méthode de test méthode teardown() exécutée après chaque méthode de test public class TestDB extends TestCase { private Connection cx; protected void setup() { cx = new Connection( "mysql", "localhost", "9001", "bob, ""); cx.connect(); protected void teardown() { cx.disconnect(); cx = null; public void test1() {... /*utilise cx*/... public void test2() {... /*utilise cx*/... JUnit 11 Lionel Seinturier JUnit 12 Lionel Seinturier
Initialisation des tests JUnit 4 initialisation globale pour toutes les méthodes de tests méthode static void onetimesetup() onetimesetup() setup() test1() teardown() setup() test2() teardown() onetimeteardown() mise à jour pour Java 5 modèle d'écriture de tests à l'aide d'annotations fonctionnalités identiques nouvelles fonctionnalités test paramétré test à délai d'exécution borné package org.junit (à la place de junit.framework) pas nécessaire étendre TestCase pas nécessaire de préfixer les méthodes de test par test annotation méthodes static assert... définies dans la classe org.junit.assert méthode static fail définie dans la classe org.junit.assert JUnit 13 Lionel Seinturier JUnit 14 Lionel Seinturier Initialisations import org.junit.test; import static org.junit.assert.assertequals; public class TestLargest { public void order(){ assertequals(9,largest.largest(new int[]{7,8,9); p v order2(){assertequals(9,largest.largest(new int[]{6,9,7,8); p v dup() { assertequals(9,largest.largest(new int[]{9,7,8,9); p v one() { assertequals(7,largest.largest(new int[]{7); p v empty() { assertequals(0,largest.largest(new int[]{); méthode setup() méthode annoté avec @Before méthode teardown() méthode annoté avec @After méthode onetimesetup() méthode annoté avec @BeforeClass méthode onetimeteardown() méthode annoté avec @AfterClass Lancement des tests java org.junit.runner.junitcore TestLargest JUnit 15 Lionel Seinturier JUnit 16 Lionel Seinturier
Test paramétré Test paramétré Pouvoir réutiliser une méthode de test avec des jeux de données @Parameters annote une méthode qui retourne une Collection de tableaux à 2 éléments 1er élément : une donnée 2ème élément : le résultat attendu du test avec la donnée précédente @RunWith(Parameterized.class) annote une classe qui contient des méthodes de test devant être exécutées avec le jeu de données Principe pour chaque couple ( donnée, résultat attendu ) la classe est instanciée les méthodes de test exécutées import static org.junit.assert.assertequals; import java.util.arrays; import java.util.collection; import org.junit.before; import org.junit.test; import org.junit.runner.runwith; import org.junit.runners.parameterized; import org.junit.runners.parameterized.parameters; @RunWith(Parameterized.class) public class Simple { private int value; private int expected; private Calc c = new Calc(); public class Calc { public int square( int x ) { return x*x; JUnit 17 Lionel Seinturier JUnit 18 Lionel Seinturier Test paramétré Autres nouvelles fonctionnalités @Parameters public static Collection<Object[]> data() { return Arrays.asList( new Object[][]{ {1,1, {2,4, {3,8 ); public Simple( int value, int expected) { this.value = value; this.expected = expected; public void t1() { int result = c.square(value); assertequals(expected,result); JUnit 19 Lionel Seinturier Test à délai d'exécution borné pouvoir définir un temps max pour l'exécution d'un test (timeout=5000) long (délai en ms) Test devant se terminer par une exception (expected=une_classe_d_exception.class) (expexted=myexcept.class) public t() {... public t() { try {...; fail(); catch( MyExcept e ) JUnit 20 Lionel Seinturier