190 likes | 322 Views
JUnit. Plan. Généralités sur le test Présentation de Junit Présentation du framework Codage TestRunner Situation de JUnit. Le test. Problématique Types d’erreurs Place du test dans le cycle de développement Techniques de test Outils de test. Présentation. Origine
E N D
Plan • Généralités sur le test • Présentation de Junit • Présentation du framework • Codage • TestRunner • Situation de JUnit
Le test • Problématique • Types d’erreurs • Place du test dans le cycle de développement • Techniques de test • Outils de test
Présentation • Origine • framework de test écrit en Java par E. Gamma et K. Beck • open source: www.junit.org • version 3.5 • Objectifs • test des applications Java • faciliter la création des tests • tests de non régression
Junit:Framework Un framework est un ensemble de classes et de collaborations entre les instances de ces classes. http://st-www.cs.uiuc.edu/users/johnson/frameworks.html
Junit:Framework • Le source d’un framework est disponible • Ne s’utilise pas directement: il se spécialise Ex: pour créer un cas de test on hérite de la classe TestCase Un framework peut être vu comme un programme à « trous » qui offre la partie commune des traitements et chaque utilisateur le spécialise pour son cas particulier.
composite template Junit:Framework
Codage (1/6) • Organisation du code des tests • cas de Test: TestCase • setUp() et tearDown() • les méthodes de test • suite de Test: TestSuite • Méthodes de test • Cas de test • Suite de Test • Lancement des tests • le TestRunner • non régression
Exemple:une classe Money public class Money implements IMoney { private int fAmount; private String fCurrency; public Money(int amount, String currency) { fAmount= amount; fCurrency= currency; } /* Adds a money to this money. Forwards the request to the addMoney helper.*/ public IMoney add(IMoney m) { return m.addMoney(this); } … }
Codage (2/6) • Codage d’un « TestCase »: • déclaration de la classe: public class MoneyTest extends TestCase { //délaration des instances private Money f14CHF; private MoneyBag fMB1; ... //contructeur public TestedClassTest(String name){ super(Name); } //setUp() et tearDown() //méthodes de test //création d’une suite de test //méthode main() }
Codage (3/6) • la méthode setUp: • la méthode tearDown: protected void setUp() { //appellée avant chaque méthode de test f12CHF= new Money(12, "CHF"); fMB1= new MoneyBag(f12CHF, f7USD); …} protected void tearDown { //appellée après chaque méthode de test f12CHF = null; ... ... }
Codage (4/6) • les méthodes de test: • caractéristiques: • nom préfixé par « test » • contient une assertion public void testBagSimpleAdd() { // {[12 CHF][7 USD]} + [14 CHF] == {[26 CHF][7 USD]} Money bag[]= {new Money(26, "CHF"), new Money(7, "USD")}; MoneyBag expected= new MoneyBag(bag); assertEquals(expected, fMB1.add(f14CHF)); } …
Codage (5/6) • regroupement des méthodes de test: • la fonction main: public static Test suite() { TestSuite suite = new TestSuite(MoneyTest.class); return suite; } public static void main() { junit.awtui.TestRunner.run(MoneyTest.class); }
Codage (6/6) • Codage d’une « TestSuite »: • déclaration de la suite: • création d’une suite de test: • fonction main() identique à celle d’un TestCase public class MaTestSuite extends TestCase { //... } public static Test suite { TestSuite suite = new TestSuite(); suite.addTest(newTestedClass(“testBagSimpleAdd”); suite.addTest(MoneyTest.suite()); suite.addTestSuite(MoneyTest.class) }
Détail d’implémentation • Pour exécuter une suite de tests, Junit peut utiliser l’introspection public TestSuite (final Class theClass){ … Method[] = theClass.getDeclaredMethods … } private boolean isTestMethod(Method m) { String name= m.getName(); Class[] parameters= m.getParameterTypes(); Class returnType= m.getReturnType(); return parameters.length == 0 && name.startsWith("test") && returnType.equals(Void.TYPE); }
TestRunner • L’interface du TestRunner
Situation • www.junit.org • Rq pratique: ajouter la localisation l’archive .jar dans CLASSPATH • Avantages • gratuit • simple • intégré à plusieurs IDE(Kawa, VisualAge…) • Inconvénients • documentation • exploitation des résultats
Evolution • Version 3.5 • Généralisation des concepts (JXUnit…) • Philosophie Xprogramming (xprogramming.com): • importance des test • outils de tests indispensables
import junit.framework.TestCase; import junit.framework.TestSuite; publicclass ExempleTest extends TestCase { public ExempleTest(String name) { super(name); } protectedvoid setUp() { exemple = new Exemple(); } protectedvoid tearDown() { exemple = null; } publicvoid testExemple() { assert(exemple.getLastResult() == 0); } publicvoid testFactoriel() { exemple.factoriel(4); assert(exemple.getLastResult() == 24);} private Exemple exemple; …} class Exemple { protectedint lastResult; publicint getLastResult() { return lastResult;} publicvoid factoriel(int n) { int Result; Result = 1; for (int i=1;i<=n;i++) Result = Result * i; lastResult = Result;} publicvoid min(int a, int b) { if (a>b) lastResult = b; else lastResult = a;} …}