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?


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};
}

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) {
   ...
}

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 .


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


3

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


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.


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 .

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.