J'ai trouvé l'utilisation correcte (ou au moins la documentation) de JUnit très confuse. Cette question sert à la fois de référence future et de véritable question.JUnit confusion: utilisez 'extends TestCase' ou '@Test'?
Si je comprends bien, il existe deux approches principales pour créer et exécuter un test JUnit:
Approche A (JUnit 3 style): créer une classe qui étend TestCase, et commencer les méthodes d'essai 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 exécutées automatiquement.
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);
}
}
Méthode B (JUnit 4-style): créer une classe 'normale' et préfixer une annotation @Test
à la méthode. Notez que vous n'avez pas besoin de 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);
}
}
Le mélange des deux ne semble pas être une bonne idée, voir par ex. this stackoverflow question:
Maintenant, mes questions (s):
- Quelle est l'approche préférée, ou quand voulez-vous utiliser une place de l'autre?
- L'approche B permet de tester les exceptions en étendant l'annotation @Test comme dans
@Test(expected = ArithmeticException.class)
. Mais comment testez-vous 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 test comme celui-ci:
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 testclass devrait sous-classer TestCase). Quelle est la bonne façon de grouper les tests pour l'approche B?
Edit: J'ai ajouté les versions de JUnit à la fois des approches
Réponse utile et approfondie, mais je ne comprends pas complètement "vérifier le message d'exception". Vérification contre une chaîne codée en dur va être un cauchemar de maintenance. Vous devez avoir voulu dire "vérifiez les propriétés de votre type d'exception spécifique". – thSoft
@thSoft: ce n'est pas souvent que c'est utilisé, mais parfois je veux m'assurer que la méthode d'exception mentionne le champ offensant, par exemple. Puis un simple 'assertTrue (e.getMessage(). Contains (" foo "))' pourrait être utile. –
Même dans JUnit4, il s'agit d'un idiome important lorsque vous devez vérifier le message ou une autre propriété de l'exception (telle que la cause). La méthode 'expected' vérifie uniquement le type. – Yishai