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.
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.
Launcher
en sélectionnant la classe de test annotée avec @RunWith(JUnitPlatform.class)
(appelons-la TestSuite
).Launcher
détecte à la fois les implémentations junit-jupiter
et junit-vintage
TestEngine
.TestSuite
puisqu'il ne s'agit techniquement pas d'une classe de test JUnit Jupiter.TestSuite
car il est annoté avec @RunWith(JUnitPlatform.class)
.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)}
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.
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