Ausführen des gleichen JUnit-Testfalls mehrmals mit unterschiedlichen Daten

77

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?

Giridhar
quelle
6
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 klar anzeigen, welcher Test fehlgeschlagen ist.
Mindreader

Antworten:

66

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};
}
dfa
quelle
Ich habe einige Testfälle, die dem Format wie testxyz (), testpqr () folgen. Meine vorhandene Testklasse erweitert TestCase.
Giridhar
1
Zuerst müssen Sie sie in JUnit 4 konvertieren (in den meisten Fällen einfach mit @ Test-Annotation)
dfa
In diesem Fall hatten Sie mir vorgeschlagen, bestimmte Anmerkungen zu verwenden. Woher weiß ich, welche Anmerkungen vorhanden sind und was in Bezug auf junit zu verwenden ist?
Giridhar
Was wäre, wenn ich wollte, dass sich dies wie eine Reihe verschiedener Tests verhält, damit ich sehen kann, an welchem ​​Datenpunkt der Test fehlschlägt? (dh in Ihrem Beispiel hätte ich 4 bestandene Tests und 1 nicht bestandene, anstatt eines einzelnen fehlgeschlagenen Tests)
Manrico Corazzi
Ist es möglich, Datenpunkte desselben Datentyps zu haben? Zum Beispiel: zwei Datenpunkte mit int []
Sarath
12

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) {
   ...
}
Piotrek
quelle
1
Zu beachten ist, dass der Separator Komma standardmäßig ist ,- wenn dies nicht gegen die Testdaten Sie den Separator durch Angabe explizit ändern kann, das heißt@TestWith({"25 USD# 0"}, separator = "#")
Robotnik
7

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 .

DavidR
quelle
3

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

Kreich
quelle
3

Wenn Sie bereits eine Verwendung @RunWithin der Testklasse müssen Sie wahrscheinlich einen Blick auf nehmen diese .

Mike Nagetier
quelle
2018-01-19 Downvote. Bitte haben Sie die Höflichkeit, Ihr Denken zu erklären. Sie können etwas lernen.
Mike Nagetier
Das ist eine ziemlich arrogante Art, das zu fragen, was im Allgemeinen keine Antwort garantiert. Sie sollten viel besser sagen: "Einer von uns kann etwas lernen", da Sie möglicherweise selbst etwas vermissen.
TiggerToo
2

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.

Mr. Shiny und New 安 宇
quelle
1

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 .

Miklos Jakab
quelle