Gibt es eine Möglichkeit, JUnit anzuweisen, einen bestimmten Testfall mehrmals mit unterschiedlichen Daten kontinuierlich auszuführen, bevor mit dem nächsten Testfall fortgefahren wird?
Ausführen desselben JUnit-Testfalls mehrmals mit unterschiedlichen Daten
Giridhar
dfa
schau mal nach Junit 4.4 Theorien:
import org.junit.Test;
import org.junit.experimental.theories.*;
import org.junit.runner.RunWith;
@RunWith(Theories.class)
public class PrimeTest {
@Theory
public void isPrime(int candidate) {
// called with candidate=1, candidate=2, etc etc
}
public static @DataPoints int[] candidates = {1, 2, 3, 4, 5};
}
-
Ich habe einige Testfälle, die dem Format wie testxyz(), testpqr() folgen. Meine vorhandene Testklasse erweitert TestCase.
– Giridhar
15. April 2009 um 17:58 Uhr
-
Zuerst müssen Sie sie in JUnit 4 konvertieren (in den meisten Fällen einfach durch die @Test-Annotation).
– dfa
15. April 2009 um 18:27 Uhr
-
Einfach toll, dass das funktioniert. In diesem Fall hatten Sie mir vorgeschlagen, bestimmte Anmerkungen zu verwenden. Woher weiß ich, welche Anmerkungen es gibt und was ich in Bezug auf junit verwenden soll?
– Giridhar
15. April 2009 um 18:39 Uhr
-
Was wäre, wenn ich wollte, dass sich dies wie eine Reihe verschiedener Tests verhält, damit ich sehen kann, welcher Datenpunkt den Test zum Scheitern bringt? (dh in Ihrem Beispiel hätte ich 4 bestandene Tests und 1 nicht bestandenen Test, anstatt eines einzelnen nicht bestandenen Tests)
– Manrico Corazzi
18. Februar 2010 um 16:38 Uhr
-
Ist es möglich, Datenpunkte desselben Datentyps zu haben? zB: zwei Datenpunkte mit int[]
– Sarah
8. Juli 2015 um 12:14 Uhr
jjnguy
Es hört sich so an, als wäre das ein perfekter Kandidat für parametrisierte Tests.
Aber im Grunde ermöglichen Ihnen parametrisierte Tests, denselben Testsatz mit unterschiedlichen Daten auszuführen.
Hier sind einige gute Blogbeiträge dazu:
piotrek
Kürzlich habe ich angefangen Zohak Projekt. Es lässt Sie schreiben:
@TestWith({
"25 USD, 7",
"38 GBP, 2",
"null, 0"
})
public void testMethod(Money money, int anotherParameter) {
...
}
-
Beachten Sie, dass das Trennzeichen standardmäßig ein Komma ist
,
– Wenn dies mit Ihren Testdaten kollidiert, können Sie das Trennzeichen ändern, indem Sie es explizit angeben, dh@TestWith({"25 USD# 0"}, separator = "#")
– Robotik
31. Juli 2018 um 2:12 Uhr
DavidR
Ein viel besserer Weg (ermöglicht Ihnen mehr als eine Testmethode) ist die Verwendung von JUnit mit JUnitParams:
import junitparams.Parameters;
import org.junit.Test;
@RunWith(JUnitParamsRunner.class)
Public class TestClass() {
@Test
@Parameters(method = "generateTestData")
public void test1(int value, String text, MyObject myObject) {
... Test Code ...
}
.... Other @Test methods ....
Object[] generateTestData() {
MyObject objectA1 = new MyObject();
MyObject objectA2 = new MyObject();
MyObject objectA3 = new MyObject();
return $(
$(400, "First test text.", objectA1),
$(402, "Second test text.", objectA2),
$(403, "Third test text.", objectA3)
);
}
}
Sie können das junitparams-Projekt abrufen hier.
Kreich
Hier ist ein Post, den ich geschrieben habe und der mehrere Möglichkeiten zeigt, die Tests wiederholt mit Codebeispielen auszuführen:
Führen Sie wiederholt einen JUnit-Test durch
Sie können den @Parametrisierten Läufer oder den im Beitrag enthaltenen speziellen Läufer verwenden
mächler
In JUnit 5 könnten Sie verwenden @ParameterizedTest
und @ValueSource
um eine Methode zu erhalten, die mehrmals mit unterschiedlichen Eingabewerten aufgerufen wird.
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.ValueSource;
public class PrimeTest {
@ParameterizedTest
@ValueSource(ints = {1, 2, 3, 4, 5})
public void isPrime(int candidate) {
// called with candidate=1, candidate=2, etc.
}
}
Mr. Shiny und New 安宇
Ich erstelle immer nur eine Hilfsmethode, die den Test basierend auf den Parametern ausführt, und rufe diese Methode dann von der JUnit-Testmethode aus auf. Normalerweise würde dies bedeuten, dass eine einzelne JUnit-Testmethode viele Tests ausführen würde, aber das war kein Problem für mich. Wenn Sie mehrere Testmethoden wünschen, eine für jeden einzelnen Aufruf, würde ich empfehlen, die Testklasse zu generieren.
Durch die Verwendung von Theorien (wie von @dfa hervorgehoben) behandelt Junit alle Tests als einen Test und erschwert es, herauszufinden, welcher Test fehlgeschlagen ist. Während parametrisierte Tests (wie von @jjnguy hervorgehoben) sie alle als unterschiedliche Tests behandeln und deutlich angeben, welcher Test fehlgeschlagen ist.
– Gedankenleser
2. Mai 2014 um 18:12 Uhr