J'ai trouvé l'utilisation correcte (ou du moins la documentation) de JUnit très déroutante. Cette question sert à la fois de référence future et de vraie question.
Si j'ai bien compris, il existe deux approches principales pour créer et exécuter un test JUnit:
Approche A (style JUnit 3): créez une classe qui étend TestCase et démarrez les méthodes de test avec le mot test
. Lors de l'exécution de la classe en tant que test JUnit (dans Eclipse), toutes les méthodes commençant par le mot test
sont automatiquement exécutées.
import junit.framework.TestCase;
public class DummyTestA extends TestCase {
public void testSum() {
int a = 5;
int b = 10;
int result = a + b;
assertEquals(15, result);
}
}
Approche B (style JUnit 4): créez une classe «normale» et ajoutez une @Test
annotation à la méthode. Notez que vous ne devez PAS démarrer la méthode avec le mot test
.
import org.junit.*;
import static org.junit.Assert.*;
public class DummyTestB {
@Test
public void Sum() {
int a = 5;
int b = 10;
int result = a + b;
assertEquals(15, result);
}
}
Mélanger les deux ne semble pas être une bonne idée, voir par exemple cette question de stackoverflow :
Maintenant, mes questions:
- Quelle est l'approche préférée ou quand utiliseriez-vous l'une au lieu de l'autre?
- L'approche B permet de tester les exceptions en étendant l'annotation @Test comme dans
@Test(expected = ArithmeticException.class)
. Mais comment tester les exceptions lors de l'utilisation de l'approche A? Lorsque vous utilisez l'approche A, vous pouvez regrouper un certain nombre de classes de test dans une suite de tests comme ceci:
TestSuite suite = new TestSuite("All tests");
suite.addTestSuite(DummyTestA.class);
suite.addTestSuite(DummyTestAbis.class);
Mais cela ne peut pas être utilisé avec l'approche B (puisque chaque classe de test doit sous-classe TestCase). Quelle est la bonne façon de regrouper les tests pour l'approche B?
Edit: j'ai ajouté les versions JUnit aux deux approches
extends TestCase
et ensuite chaque test annoté avec@Test
juste pour confondre les choses. :)