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.