web-dev-qa-db-fra.com

JUnit 5 - Suite de tests vide dans IntelliJ IDEA lors de l'utilisation du moteur JUnit Jupiter

Comment exécuter des tests All Suite avec JUnit 5 dans IntelliJ IDEA v2016.2.2?

Je reçois Vide test suite sous ce code:

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

Je reçois:

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

[root]
JUnit Jupiter
JUnit Vintage

OU

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

Je reçois:

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

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

J'ai pu exécuter Suite avec JUnit 4, mais cela ne fonctionne pas avec JUnit 5.

7
Davideas

Réponse courte

Si vous utilisez IntelliJ IDEA 2016.2, il n'est actuellement pas possible d'exécuter une classe de test annotée avec @RunWith(JUnitPlatform.class) dans l'EDI.

Longue réponse

Sur la base du comportement que vous avez signalé, après un travail d'enquête laborieux, je pense avoir la réponse à votre question ...

Si vous utilisez IntelliJ IDEA 2016.2, qui prend en charge de manière intégrée JUnit 5, voici ce qui se passe.

  1. IDEA lance la plate-forme JUnit via l'API Launcher en sélectionnant la classe de test annotée avec @RunWith(JUnitPlatform.class) (appelons-la TestSuite).
  2. La Launcher détecte à la fois les implémentations junit-jupiter et junit-vintageTestEngine.
  3. Le moteur JUnit Jupiter ignore TestSuite puisqu'il ne s'agit techniquement pas d'une classe de test JUnit Jupiter.
  4. Le moteur JUnit Vintage ignore également TestSuite car il est annoté avec @RunWith(JUnitPlatform.class).
  5. Le résultat final est qu'aucun moteur de test enregistré ne prétend pouvoir exécuter la classe TestSuite.

La partie non intuitive est que le moteur JUnit Vintage ignore TestSuite, alors qu’il ressemble en réalité à une classe de test basée sur JUnit 4 puisqu’il est annoté avec @RunWith(). Cette raison est ignorée afin d'éviter une récursion infinie, comme l'explique le code source de DefensiveAllDefaultPossibilityBuilder :

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

Le fait que le code ci-dessus renvoie null dans de tels scénarios entraîne un suite vide.

Bien entendu, il serait certainement préférable que l'utilisateur soit informé de tels scénarios, par exemple via une instruction de journal. J'ai donc ouvert des problèmes à la fois pour JUnit 5 et IntelliJ afin d'améliorer la convivialité dans de tels scénarios.

Du côté positif, puisque vous utilisez IntelliJ IDEA 2016.2, vous n'avez pas besoin d'utiliser le support de la suite de tests. Au lieu de cela, vous pouvez simplement cliquer avec le bouton droit de la souris sur src/test/Java dans la vue du projet dans IDEA et sélectionner Run 'All Tests' pour exécuter tous vos tests.

Cordialement,

Sam (responsable de JUnit 5)}

11
Sam Brannen

Complémentaire à réponse de Sam Brannen . J'avais besoin d'un TestSuit pour configurer le backend avant d'exécuter toutes les classes de test d'un paquet. Ce n'est probablement pas possible via Run 'All Tests'.

Mais je pense avoir trouvé une bonne solution de contournement. Je suis venu avec ceci:

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

Vous pouvez étendre chaque classe de test à partir d'un autre package et y ajouter l'annotation @Nested. Ce n'est pas la meilleure solution, mais c'est une solution de contournement jusqu'à ce que IDEA ou JUnit 5 trouve une autre solution pour ce cas.

1
Highchiller

Selon junit oficial website :

Assurez-vous simplement que l'artefact junit-vintage-engine est dans votre chemin d'exécution de test. Dans ce cas, les tests JUnit 3 et JUnit 4 seront automatiquement repris par le lanceur de la plate-forme JUnit
0
tnas