Ausführen desselben JUnit-Testfalls mehrmals mit unterschiedlichen Daten

Lesezeit: 3 Minuten

Benutzer-Avatar
Giridhar

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?

  • 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


Benutzer-Avatar
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

Benutzer-Avatar
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:

Benutzer-Avatar
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


Benutzer-Avatar
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.

Benutzer-Avatar
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

Benutzer-Avatar
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.
    }
}

Benutzer-Avatar
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.

1215670cookie-checkAusführen desselben JUnit-Testfalls mehrmals mit unterschiedlichen Daten

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy