Ich fand die richtige Verwendung (oder zumindest die Dokumentation) von JUnit sehr verwirrend. Diese Frage dient sowohl als zukünftige Referenz als auch als echte Frage.
Wenn ich richtig verstanden habe, gibt es zwei Hauptansätze zum Erstellen und Ausführen eines JUnit-Tests:
Ansatz A (JUnit 3-Stil): Erstellen Sie eine Klasse, die TestCase erweitert, und starten Sie die Testmethoden mit dem Wort test
. Wenn Sie die Klasse als JUnit-Test (in Eclipse) test
ausführen , werden alle Methoden, die mit dem Wort beginnen, automatisch ausgeführt.
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);
}
}
Ansatz B (JUnit 4-Stil): Erstellen Sie eine 'normale' Klasse und stellen Sie @Test
der Methode eine Anmerkung voran . Beachten Sie, dass Sie die Methode NICHT mit dem Wort starten müssen 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);
}
}
Das Mischen der beiden scheint keine gute Idee zu sein, siehe z. B. diese Frage zum Stapelüberlauf :
Nun meine Fragen:
- Was ist der bevorzugte Ansatz oder wann würden Sie einen anstelle des anderen verwenden?
- Ansatz B ermöglicht das Testen auf Ausnahmen, indem die Annotation @Test wie in erweitert wird
@Test(expected = ArithmeticException.class)
. Aber wie testen Sie bei Verwendung von Ansatz A auf Ausnahmen? Bei Verwendung von Ansatz A können Sie eine Reihe von Testklassen in einer Testsuite wie folgt gruppieren:
TestSuite suite = new TestSuite("All tests");
suite.addTestSuite(DummyTestA.class);
suite.addTestSuite(DummyTestAbis.class);
Dies kann jedoch nicht mit Ansatz B verwendet werden (da jede Testklasse TestCase unterklassifizieren sollte). Was ist der richtige Weg, um Tests für Ansatz B zu gruppieren?
Bearbeiten: Ich habe die JUnit-Versionen zu beiden Ansätzen hinzugefügt
quelle
extends TestCase
und dann jeden Test auch kommentiert,@Test
nur um die Dinge zu verwirren. :)Antworten:
Die Unterscheidung ist ziemlich einfach:
TestCase
ist die Art und Weise, wie Unit-Tests in JUnit 3 geschrieben wurden (natürlich wird es in JUnit 4 weiterhin unterstützt).@Test
Annotation wird von JUnit 4 eingeführtIm Allgemeinen sollten Sie den Anmerkungspfad auswählen, es sei denn, Kompatibilität mit JUnit 3 (und / oder einer früheren Java-Version als Java 5) ist erforderlich. Der neue Weg hat mehrere Vorteile:
@Test
Anmerkung ist expliziter und in Tools einfacher zu unterstützen (zum Beispiel ist es einfach, auf diese Weise nach allen Tests zu suchen).@Before
/@BeforeClass
und können mehrere Methoden mit Anmerkungen versehen werden@After
/ versehen werden@AfterClass
, um mehr Flexibilität zu bieten@Rule
Anmerkungen zu Dingen wieExpectedException
@Ignored
Anmerkung@RunWith
Um in einer JUnit 3 auf erwartete Ausnahmen zu testen, müssen
TestCase
Sie den Text explizit angeben.JUnit 5 führte eine weitere API-Änderung ein, verwendet jedoch weiterhin Anmerkungen. Die neue
@Test
Annotation istorg.junit.jupiter.api.Test
(die "alte" war JUnit 4org.junit.Test
), funktioniert aber fast genauso wie die JUnit 4.quelle
assertTrue(e.getMessage().contains("foo"))
nützlich sein.expected
Methode prüft nur den Typ.Ich bevorzuge JUnit 4 (Annotation-Ansatz), weil ich es flexibler finde.
Wenn Sie eine Testsuite in JUnit 4 erstellen möchten, müssen Sie eine Klasse erstellen, die alle Tests wie folgt gruppiert:
quelle
Ihre Frage enthält einen unbeantworteten Teil: "Wie lassen sich Tests für Ansatz B richtig gruppieren?"
Die offizielle Antwort lautet, dass Sie eine Klasse mit einem @ RunWith (Suite.class) kommentieren und dann die Annotation @ Suite.SuiteClasses verwenden, um die Klassen aufzulisten. So machen es die JUnit-Entwickler (manuelle Auflistung jeder Klasse in einer Suite). In vielerlei Hinsicht ist dieser Ansatz insofern eine Verbesserung, als es trivial und intuitiv ist, Verhaltensweisen vor und nach der Suite hinzuzufügen (fügen Sie der mit @RunWith annotierten Klasse einfach eine @ BeforeClass- und eine @ AfterClass-Methode hinzu - viel besser als das alte TestFixture ).
Es gibt jedoch einen Rückschritt, da Sie mit Anmerkungen die Liste der Klassen nicht dynamisch erstellen können und das Umgehen dieses Problems etwas hässlich wird. Sie müssen die Suite-Klasse in Unterklassen unterteilen und das Array von Klassen in der Unterklasse dynamisch erstellen und an den Suite-Konstruktor übergeben. Dies ist jedoch eine unvollständige Lösung, da andere Unterklassen von Suite (z. B. Kategorien) nicht damit funktionieren und im Wesentlichen unterstützt keine dynamische Testklassensammlung.
quelle
Sie sollten JUnit 4 verwenden. Es ist besser.
Viele Frameworks haben begonnen, die Unterstützung von JUnit 3.8 zu verwerfen.
Dies ist aus der Spring 3.0-Referenzdokumentation:
Im Allgemeinen sollten Sie immer versuchen, die neueste stabile Version eines Frameworks zu verwenden, wenn Sie etwas Neues starten.
quelle
Der "bevorzugte" Ansatz wäre die Verwendung von Anmerkungen, die seit dem 4. Juni eingeführt wurden. Sie erleichtern viele Dinge (siehe Ihre zweite Frage).
Sie können dafür einen einfachen Try / Catch-Block verwenden:
quelle