====== Tests unitaires avec Junit ====== Il existe énormément de tutoriaux sur l'usage de JUnit sur le Web. Nous vous proposons ici d'apprendre JUnit en utilisant certaines parties de ces tutoriaux. Pour les étudiants qui pensent réaliser leur projet ou une partie de leur projet en php, voici [[2014_2015:lp:idse:gl:td_phpunit|quelques tutoriaux avec PHP UNit]], mais que nous n'avons pas testé. ===== Premier test JUnit dans eclipse ===== * Suivez le tutoriel suivant : http://www.junit.fr/2011/11/20/tutoriel-eclipse-junit-mon-premier-test-automatique/ Pour en savoir plus sur l'environnement JUnit sous eclipse (sur la fin) : http://www.jmdoudoux.fr/java/dejae/chap011.htm ===== Compléter les tests par la gestion des exceptions ===== Reprenez l'exemple ci-après pour tester la gestion des exceptions : - compléter la classe précédente pour lui ajouter la division (vous pouvez/devez renommer la classe); - créer une autre classe de tests pour tester uniquement la division. Voir ici : http://rpouiller.developpez.com/tutoriels/java/tests-unitaires-junit4/#LIII-B ===== Comprendre les annotations ===== http://www.vogella.com/articles/JUnit/article.html#usingjunit_annotations ===== Méthodes ===== * //assertEquals// Vérifie que deux objets sont égaux * //assertFalse// Vérifie que l'expression est fausse * //assertNotNull// Vérifie que l'objet n'est pas nul * //assertNotSame// Vérifie que deux références ne sont pas les mêmes * //assertNull// Vérifie qu'un objet est nul * //assertSame// Vérifie que deux références sont les mêmes * //assertTrue// Vérifie que l'expression est vrai * //fail// Provoque l'échec du test ===== Fixture : la mise en place des tests avec setUp et tearDown ===== **D'après [[http://www-igm.univ-mlv.fr/~dr/XPOSE2003/JUnit_tour/#5.3.Fixture : la mise en place des tests|Ce tutoriel]]** Une grande partie du code d'un test unitaire sert établir les conditions d'exécution du dit test. Au sein d'un même TestCase, il peut arriver que toutes les méthodes de test aient besoin d'un minimum de chose (une connexion à une base de données par exemple). La mise en place de ces conditions est prévue par le framework JUnit. Plutôt que chacun de vos tests appelle une méthode de mise en place, puis une méthode de nettoyage, le framework JUnit lance automatiquement avant un test la méthode setUp, et la méthode tearDown à son issue. Libre à vous d'implémenter ces méthodes si vos tests ont tous besoin des mêmes choses pour fonctionner. ===== Créer une suite de tests JUnit ===== Vous allez à présent créer une suite de tests : {{ :2013_2014:lp:idse:gl:td:testsuite.png?nolink&300 |Eclipse}} Vous pouvez comparer le code généré avec le code que voici : [[http://rpouiller.developpez.com/tutoriels/java/tests-unitaires-junit4/#LVII]] http://www.vogella.com/articles/JUnit/article.html#juniteclipse_testsuite ===== Tests paramétrés ===== [[http://rpouiller.developpez.com/tutoriels/java/tests-unitaires-junit4/#LVI|Basé sur cet exemple.]] //Les tests paramétrés permettent d'exécuter plusieurs fois un cas de tests avec des valeurs différentes. Le cas de test doit être annoté avec @RunWith avec pour valeur Parameterized. Les paramètres sont indiqués par une méthode annotée avec @Parameters retournant une Collection. Le cas de tests paramétrés doit comporter un constructeur correspondant aux paramètres.// Voici ci-après un exemple de tests paramétrés. Adaptez le à votre exemple. package math; import static org.junit.Assert.*; import java.util.Arrays; import java.util.List; import org.junit.After; 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 ParametreTests { Calculator op; @Parameters public static List getParametres() { return Arrays.asList(new Object[][] { { 0, 0, 0 }, { 1, 3, 4 }, { 200, 800, 1000 } } ); } int first; int second; int result ; public ParametreTests(int premier, int second, int res) { first = premier; this.second = second; result = res; } @Before public void setUp() throws Exception { op = new Calculator(); } @After public void tearDown() throws Exception { } @Test public void testCalculer() throws Exception { System.out.println(first + "+ " + second +"="+ result); assertEquals(first, second, result); } } ===== Exécuter les tests JUnit en dehors d'Eclipse ===== http://www.vogella.com/articles/JUnit/article.html#juniteclipse_code ===== A vous !! ===== * Créer une première classe relative au projet tutoré par exemple la classe //Information//. Pensez à utiliser sous Eclipe la génération des accesseurs. * Associer à votre classe plusieurs méthodes dont par exemple //isFrom(String name)// * Définir les tests unitaires qui vont bien. * Continuez! N'oubliez pas de commiter vos codes et les tests !! ===== A la fin de cette séance ===== * A quoi servent les tests? Quels types de tests existent-ils ? * Avancé sur le développement du bus et j'ai créé les tests unitaires associés à mes codes; * Utilisé le gestionnaire de version pour sauvegarder mes codes; ===== Références ===== http://www.junit.fr/2011/11/20/tutoriel-eclipse-junit-mon-premier-test-automatique/ http://www.jmdoudoux.fr/java/dejae/chap011.htm http://gfx.developpez.com/tutoriel/java/junit/ [[http://www-igm.univ-mlv.fr/~dr/XPOSE2003/JUnit_tour/#3.L'écriture d'un test unitaire simple pour une classe simple|Exemple ayant servi de base à ce TD]] http://junit.sourceforge.net/doc/cookbook/cookbook.htm