wake-up-neo.com

JUnit 5 - Leere Testsuite in IntelliJ IDEA bei Verwendung der JUnit-Jupiter-Engine

Wie führt man All Suite-Tests mit JUnit 5 in IntelliJ IDEA v2016.2.2 durch?

Ich bekomme Leere Testsuite führe diesen Code aus:

import org.junit.platform.runner.IncludeEngines;
import org.junit.platform.runner.JUnitPlatform;
import org.junit.platform.runner.SelectPackages;
import org.junit.runner.RunWith;

@RunWith(JUnitPlatform.class)
@IncludeEngines("junit-jupiter")
@SelectPackages("<eu...package>") //I confirm that <eu...package> is ok.
public class AllTests {
}

Ich erhalte:

INFORMAZIONI: Discovered TestEngines with IDs: [junit-jupiter, junit-vintage]
Empty test suite.
Empty test suite.

[root]
JUnit Jupiter
JUnit Vintage

ODER

import eu.....services.ServiceTest;
import eu.....repository.DAOTest;
import org.junit.runner.RunWith;
import org.junit.runners.Suite;

@RunWith(Suite.class)
@Suite.SuiteClasses({
        ServiceTest.class,
        DAOTest.class
})
public class AllTests {
}

Ich erhalte:

INFORMAZIONI: Discovered TestEngines with IDs: [junit-jupiter, junit-vintage]
Empty test suite.

[root]
|+--JUnit Vintage
|   +--eu.....AllTests
|+--JUnit Jupiter

Ich konnte Suite mit JUnit 4 ausführen, aber es funktioniert nicht mit JUnit 5.

7
Davideas

Kurze Antwort

Wenn Sie IntelliJ IDEA 2016.2 verwenden, ist es derzeit nicht möglich, eine mit @RunWith(JUnitPlatform.class) kommentierte Testklasse innerhalb der IDE auszuführen.

Lange Antwort

Basierend auf dem von Ihnen gemeldeten Verhalten, glaube ich, habe ich nach einiger sorgfältiger Untersuchung die Antwort auf Ihre Frage ...

Wenn Sie IntelliJ IDEA 2016.2 verwenden, das integrierte Unterstützung für JUnit 5 bietet, geschieht Folgendes.

  1. IDEA startet die JUnit-Plattform über die Launcher-API und wählt die mit @RunWith(JUnitPlatform.class) kommentierte Testklasse aus (nennen wir sie TestSuite).
  2. Die Variable Launcher erkennt sowohl die Implementierungen junit-jupiter als auch junit-vintageTestEngine.
  3. Die JUnit-Jupiter-Engine ignoriert TestSuite, da sie technisch keine JUnit-Jupiter-Testklasse ist.
  4. Die JUnit Vintage-Engine ignoriert auch TestSuite, da sie mit @RunWith(JUnitPlatform.class) kommentiert wird.
  5. Das Endergebnis ist, dass keine der registrierten Test-Engines angibt, dass sie die TestSuite-Klasse ausführen kann.

Der nicht intuitive Teil ist, dass die JUnit Vintage-Engine TestSuite ignoriert, wenn sie tatsächlich wie eine auf JUnit 4 basierende Testklasse aussieht, da sie mit @RunWith() kommentiert ist. Der Grund, aus dem ignoriert wird, ist die Vermeidung einer unendlichen Rekursion, die im Quellcode für DefensiveAllDefaultPossibilitiesBuilder erläutert wird:

if ("org.junit.platform.runner.JUnitPlatform".equals(runnerClass.getName())) {
    return null;
}

Die Tatsache, dass der obige Code in solchen Szenarien null zurückgibt, führt zu einer leeren Suite.

Natürlich wäre es sicherlich besser, wenn der Benutzer über solche Szenarien informiert würde - beispielsweise über eine Protokollanweisung. Ich habe daher Probleme für JUnit 5 und IntelliJ zur Verbesserung der Benutzerfreundlichkeit in solchen Szenarien geöffnet.

Auf der positiven Seite, da Sie IntelliJ IDEA 2016.2 verwenden, müssen Sie die Testsuite-Unterstützung nicht verwenden. Stattdessen können Sie in der Projektansicht unter IDEA einfach mit der rechten Maustaste auf src/test/Java klicken und Run 'All Tests' auswählen. Dadurch werden alle Tests ausgeführt.

Grüße,

Sam (JUnit 5 Core Committer)

11
Sam Brannen

Ergänzend zu Sam Brannen's Antwort . Ich brauchte einen TestSuit, um das Backend einzurichten, bevor alle Testklassen in einem Paket ausgeführt wurden. Dies ist wahrscheinlich nicht über Run 'All Tests' möglich.

Aber ich denke, ich habe eine gute Lösung gefunden. Ich habe mir das ausgedacht:

import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.Nested;
import your.other.package.test.classes.*;

public class TestSuit {
    @BeforeAll
    public static void setup(){}

    @Nested
    public class TestExtender extends MyTestClass {}
}

Sie können jede Testklasse aus einem anderen Paket erweitern und die Annotation @Nested hinzufügen. Dies ist nicht die beste Lösung, aber es ist eine Problemumgehung, bis IDEA oder JUnit 5 eine andere Lösung für diese Fälle finden.

1
Highchiller

Laut junit oficial Website :

Stellen Sie nur sicher, dass sich das Artefakt der junit-vintage-Engine in Ihrem Testlaufpfad befindet. In diesem Fall werden JUnit 3- und JUnit 4-Tests automatisch vom Starter der JUnit-Plattform Abgeholt.
0
tnas