Gibt es eine Möglichkeit, JUnit anzuweisen, einen bestimmten Testfall mehrmals mit unterschiedlichen Daten fortlaufend auszuführen, bevor mit dem nächsten Testfall fortgefahren wird?
Gibt es eine Möglichkeit, JUnit anzuweisen, einen bestimmten Testfall mehrmals mit unterschiedlichen Daten fortlaufend auszuführen, bevor mit dem nächsten Testfall fortgefahren wird?
Antworten:
Werfen Sie einen Blick auf 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};
}
Es klingt so, als wäre dies ein perfekter Kandidat für parametrisierte Tests.
Grundsätzlich können Sie mit parametrisierten Tests denselben Testsatz für verschiedene Daten ausführen.
Hier sind einige gute Blog-Beiträge dazu:
Kürzlich habe ich ein Zohhak- Projekt gestartet . Damit können Sie schreiben:
@TestWith({
"25 USD, 7",
"38 GBP, 2",
"null, 0"
})
public void testMethod(Money money, int anotherParameter) {
...
}
,
- wenn dies nicht gegen die Testdaten Sie den Separator durch Angabe explizit ändern kann, das heißt@TestWith({"25 USD# 0"}, separator = "#")
Ein viel besserer Weg (ermöglicht es Ihnen, mehr als eine Testmethode zu haben) 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)
);
}
}
Das junitparams-Projekt erhalten Sie hier .
Hier ist ein Beitrag, den ich geschrieben habe und der verschiedene Möglichkeiten zum wiederholten Ausführen der Tests anhand von Codebeispielen zeigt:
Führen Sie wiederholt einen JUnit-Test durch
Sie können den @ Parametrized-Läufer oder den im Beitrag enthaltenen speziellen Läufer verwenden
Wenn Sie bereits eine Verwendung @RunWith
in der Testklasse müssen Sie wahrscheinlich einen Blick auf nehmen diese .
Ich erstelle immer nur eine Hilfsmethode, die den Test basierend auf den Parametern ausführt, und rufe diese Methode dann über die JUnit-Testmethode auf. Normalerweise würde dies bedeuten, dass eine einzelne JUnit-Testmethode tatsächlich viele Tests ausführen würde, aber das war für mich kein Problem. Wenn Sie mehrere Testmethoden wünschen, eine für jeden einzelnen Aufruf, würde ich empfehlen, die Testklasse zu generieren.
Wenn Sie keinen benutzerdefinierten Läufer verwenden möchten oder können (z. B. wenn Sie bereits einen anderen Läufer wie den Robolectric-Läufer verwenden), können Sie diese DataSet-Regel ausprobieren .