From 82dd36bb57360fd4eee51bbda0d9a88712e32e1d Mon Sep 17 00:00:00 2001 From: Heiko Klare Date: Wed, 10 Jan 2024 08:43:15 +0100 Subject: [PATCH] Enable JUnit 5 test suite engine in tycho-surefire #2462 Currently, Tycho is not capable of running JUnit 5 test suites, since the required SuiteTestEngine is not provided while running tests. This change adds the SuiteTestEngine to tycho-surefire executions using JUnit Platform 1.8 (the first with suite support) or newer. To this end, the SuiteTestEngine is always enabled when running JUnit 5 tests. It also adds a regression test for executing a test suite based on JUnit Jupiter 5.9. Fixes https://github.com/eclipse-tycho/tycho/issues/2462 --- .../bundle.test/META-INF/MANIFEST.MF | 8 ++++ .../bundle.test/build.properties | 4 ++ .../surefire.junit59suite/bundle.test/pom.xml | 37 +++++++++++++++++++ .../src/bundle/test/JUnit59Test.java | 28 ++++++++++++++ .../src/bundle/test/SuiteWithAllTests.java | 22 +++++++++++ .../tycho/test/surefire/JUnit5Test.java | 13 +++++++ .../eclipse/tycho/test/util/SurefireUtil.java | 18 +++++++-- .../bnd.bnd | 1 + .../pom.xml | 15 ++++++++ .../org.junit.platform.engine.TestEngine | 1 + .../bnd.bnd | 1 + .../pom.xml | 15 ++++++++ .../org.junit.platform.engine.TestEngine | 3 +- .../bnd.bnd | 1 + .../pom.xml | 15 ++++++++ .../org.junit.platform.engine.TestEngine | 1 + .../bnd.bnd | 1 + .../pom.xml | 15 ++++++++ .../org.junit.platform.engine.TestEngine | 3 +- 19 files changed, 197 insertions(+), 5 deletions(-) create mode 100644 tycho-its/projects/surefire.junit59suite/bundle.test/META-INF/MANIFEST.MF create mode 100644 tycho-its/projects/surefire.junit59suite/bundle.test/build.properties create mode 100644 tycho-its/projects/surefire.junit59suite/bundle.test/pom.xml create mode 100644 tycho-its/projects/surefire.junit59suite/bundle.test/src/bundle/test/JUnit59Test.java create mode 100644 tycho-its/projects/surefire.junit59suite/bundle.test/src/bundle/test/SuiteWithAllTests.java diff --git a/tycho-its/projects/surefire.junit59suite/bundle.test/META-INF/MANIFEST.MF b/tycho-its/projects/surefire.junit59suite/bundle.test/META-INF/MANIFEST.MF new file mode 100644 index 0000000000..8f9088e1f0 --- /dev/null +++ b/tycho-its/projects/surefire.junit59suite/bundle.test/META-INF/MANIFEST.MF @@ -0,0 +1,8 @@ +Manifest-Version: 1.0 +Bundle-ManifestVersion: 2 +Bundle-Name: JUnit5 Suite Test Plug-in +Bundle-SymbolicName: bundle.test.junit59suite +Bundle-Version: 1.0.0 +Bundle-RequiredExecutionEnvironment: JavaSE-1.8 +Import-Package: org.junit.jupiter.api;version="5.9.0", + org.junit.platform.suite.api;version="1.9.0" diff --git a/tycho-its/projects/surefire.junit59suite/bundle.test/build.properties b/tycho-its/projects/surefire.junit59suite/bundle.test/build.properties new file mode 100644 index 0000000000..34d2e4d2da --- /dev/null +++ b/tycho-its/projects/surefire.junit59suite/bundle.test/build.properties @@ -0,0 +1,4 @@ +source.. = src/ +output.. = bin/ +bin.includes = META-INF/,\ + . diff --git a/tycho-its/projects/surefire.junit59suite/bundle.test/pom.xml b/tycho-its/projects/surefire.junit59suite/bundle.test/pom.xml new file mode 100644 index 0000000000..a1dc655921 --- /dev/null +++ b/tycho-its/projects/surefire.junit59suite/bundle.test/pom.xml @@ -0,0 +1,37 @@ + + + 4.0.0 + org.eclipse.tycho.tycho-its.surefire-junit5 + bundle.test.junit59suite + eclipse-test-plugin + 1.0.0 + + + + eclipse + p2 + ${target-platform} + + + + + + + org.eclipse.tycho + tycho-maven-plugin + ${tycho-version} + true + + + org.eclipse.tycho + tycho-surefire-plugin + ${tycho-version} + + + **/SuiteWithAllTests.java + + + + + + diff --git a/tycho-its/projects/surefire.junit59suite/bundle.test/src/bundle/test/JUnit59Test.java b/tycho-its/projects/surefire.junit59suite/bundle.test/src/bundle/test/JUnit59Test.java new file mode 100644 index 0000000000..0b4f84bd06 --- /dev/null +++ b/tycho-its/projects/surefire.junit59suite/bundle.test/src/bundle/test/JUnit59Test.java @@ -0,0 +1,28 @@ +/******************************************************************************* + * Copyright (c) 2023 Vector Informatik GmbH and others. + * This program and the accompanying materials + * are made available under the terms of the Eclipse Public License 2.0 + * which accompanies this distribution, and is available at + * https://www.eclipse.org/legal/epl-2.0/ + * + * SPDX-License-Identifier: EPL-2.0 + * + * Contributors: + * Vector Informatik GmbH - initial API and implementation + *******************************************************************************/ +package bundle.test; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +class JUnit59Test { + + @Test + @DisplayName("started from test suite") + void startedFromSuite() { + assertEquals(2, 1 + 1); + } + +} diff --git a/tycho-its/projects/surefire.junit59suite/bundle.test/src/bundle/test/SuiteWithAllTests.java b/tycho-its/projects/surefire.junit59suite/bundle.test/src/bundle/test/SuiteWithAllTests.java new file mode 100644 index 0000000000..e1ddf2b6df --- /dev/null +++ b/tycho-its/projects/surefire.junit59suite/bundle.test/src/bundle/test/SuiteWithAllTests.java @@ -0,0 +1,22 @@ +/******************************************************************************* + * Copyright (c) 2023 Vector Informatik GmbH and others. + * This program and the accompanying materials + * are made available under the terms of the Eclipse Public License 2.0 + * which accompanies this distribution, and is available at + * https://www.eclipse.org/legal/epl-2.0/ + * + * SPDX-License-Identifier: EPL-2.0 + * + * Contributors: + * Vector Informatik GmbH - initial API and implementation + *******************************************************************************/ +package bundle.test; + +import org.junit.platform.suite.api.Suite; +import org.junit.platform.suite.api.SelectClasses; + +@Suite +@SelectClasses({ JUnit59Test.class }) +public class SuiteWithAllTests { + +} diff --git a/tycho-its/src/test/java/org/eclipse/tycho/test/surefire/JUnit5Test.java b/tycho-its/src/test/java/org/eclipse/tycho/test/surefire/JUnit5Test.java index 9adde2dfda..9ff0101dfd 100644 --- a/tycho-its/src/test/java/org/eclipse/tycho/test/surefire/JUnit5Test.java +++ b/tycho-its/src/test/java/org/eclipse/tycho/test/surefire/JUnit5Test.java @@ -93,4 +93,17 @@ public void testJUnit59Runner() throws Exception { // make sure test tagged as 'slow' was skipped assertNumberOfSuccessfulTests(projectBasedir, "bundle.test.JUnit59Test", 4); } + + @Test + public void testJUnit59Suite() throws Exception { + final Verifier verifier = getVerifier("/surefire.junit59suite/bundle.test"); + verifier.executeGoal("verify"); + verifier.verifyErrorFreeLog(); + final String projectBasedir = verifier.getBasedir(); + assertTestMethodWasSuccessfullyExecuted(projectBasedir, "SuiteWithAllTests", "bundle.test.JUnit59Test", + "started from test suite"); + // make sure tests from suite were executed + assertNumberOfSuccessfulTests(projectBasedir, "bundle.test.JUnit59Test", 1); + } + } diff --git a/tycho-its/src/test/java/org/eclipse/tycho/test/util/SurefireUtil.java b/tycho-its/src/test/java/org/eclipse/tycho/test/util/SurefireUtil.java index 634df79318..134cf03888 100644 --- a/tycho-its/src/test/java/org/eclipse/tycho/test/util/SurefireUtil.java +++ b/tycho-its/src/test/java/org/eclipse/tycho/test/util/SurefireUtil.java @@ -35,11 +35,23 @@ public static File testResultFile(String baseDir, String testSuffix) { public static void assertTestMethodWasSuccessfullyExecuted(String baseDir, String className, String methodName, int iterations) throws Exception { - File resultFile = getTestResultFile(baseDir, className); - Document document = readDocument(resultFile); + assertTestMethodWasSuccessfullyExecuted(baseDir, className, className, methodName, iterations); + } + + public static void assertTestMethodWasSuccessfullyExecuted(String baseDir, String suiteClassSimpleName, + String testClassQualifiedName, String methodName) throws Exception { + String testClassSimpleName = testClassQualifiedName.substring(testClassQualifiedName.lastIndexOf(".") + 1); + assertTestMethodWasSuccessfullyExecuted(baseDir, testClassQualifiedName, + String.join(" ", suiteClassSimpleName, testClassSimpleName), methodName, 1); + } + + private static void assertTestMethodWasSuccessfullyExecuted(String baseDir, String qualifiedClassName, + String classNameInReport, String methodName, int iterations) throws Exception { // surefire-test-report XML schema: // https://maven.apache.org/surefire/maven-surefire-plugin/xsd/surefire-test-report.xsd - String testCaseXPath = String.format("/testsuite/testcase[@classname='%s' and @name='%s']", className, + File resultFile = getTestResultFile(baseDir, qualifiedClassName); + Document document = readDocument(resultFile); + String testCaseXPath = String.format("/testsuite/testcase[@classname='%s' and @name='%s']", classNameInReport, methodName); List testCaseNodes2 = XMLTool.getMatchingNodes(document, testCaseXPath); assertEquals(resultFile.getAbsolutePath() + " with xpath " + testCaseXPath diff --git a/tycho-surefire/org.eclipse.tycho.surefire.junit58/bnd.bnd b/tycho-surefire/org.eclipse.tycho.surefire.junit58/bnd.bnd index 44bfb51dc6..f3c92316bc 100644 --- a/tycho-surefire/org.eclipse.tycho.surefire.junit58/bnd.bnd +++ b/tycho-surefire/org.eclipse.tycho.surefire.junit58/bnd.bnd @@ -1,5 +1,6 @@ Import-Package: \ org.junit.jupiter.api.*;version='[5.8,5.9)',\ + org.junit.platform.suite.api;resolution:=optional;version='[1.8,1.9)',\ org.opentest4j;version='[1.2,2)',\ !org.apache.maven.surefire.*,\ !org.apache.maven.plugin.surefire.*,\ diff --git a/tycho-surefire/org.eclipse.tycho.surefire.junit58/pom.xml b/tycho-surefire/org.eclipse.tycho.surefire.junit58/pom.xml index d6c8650fbb..de04cce985 100644 --- a/tycho-surefire/org.eclipse.tycho.surefire.junit58/pom.xml +++ b/tycho-surefire/org.eclipse.tycho.surefire.junit58/pom.xml @@ -62,6 +62,21 @@ junit-jupiter-engine ${junit-jupiter-version} + + org.junit.platform + junit-platform-suite-api + ${junit-platform-version} + + + org.junit.platform + junit-platform-suite-commons + ${junit-platform-version} + + + org.junit.platform + junit-platform-suite-engine + ${junit-platform-version} + org.apache.maven.surefire common-java5 diff --git a/tycho-surefire/org.eclipse.tycho.surefire.junit58/src/main/resources/META-INF/services/org.junit.platform.engine.TestEngine b/tycho-surefire/org.eclipse.tycho.surefire.junit58/src/main/resources/META-INF/services/org.junit.platform.engine.TestEngine index f19e876790..5ec9a2def9 100644 --- a/tycho-surefire/org.eclipse.tycho.surefire.junit58/src/main/resources/META-INF/services/org.junit.platform.engine.TestEngine +++ b/tycho-surefire/org.eclipse.tycho.surefire.junit58/src/main/resources/META-INF/services/org.junit.platform.engine.TestEngine @@ -1 +1,2 @@ org.junit.jupiter.engine.JupiterTestEngine +org.junit.platform.suite.engine.SuiteTestEngine \ No newline at end of file diff --git a/tycho-surefire/org.eclipse.tycho.surefire.junit58withvintage/bnd.bnd b/tycho-surefire/org.eclipse.tycho.surefire.junit58withvintage/bnd.bnd index c2d08524ef..c3746bc107 100644 --- a/tycho-surefire/org.eclipse.tycho.surefire.junit58withvintage/bnd.bnd +++ b/tycho-surefire/org.eclipse.tycho.surefire.junit58withvintage/bnd.bnd @@ -1,5 +1,6 @@ Import-Package: \ org.junit.jupiter.api.*;version='[5.8,5.9)',\ + org.junit.platform.suite.api;resolution:=optional;version='[1.8,1.9)',\ org.junit.runner.*;resolution:=optional;version='[4.12,5)',\ org.junit.runners.*;resolution:=optional;version='[4.12,5)',\ org.junit.experimental.categories;resolution:=optional;version='[4.12,5)',\ diff --git a/tycho-surefire/org.eclipse.tycho.surefire.junit58withvintage/pom.xml b/tycho-surefire/org.eclipse.tycho.surefire.junit58withvintage/pom.xml index 70eb66ec8b..759ac32bab 100644 --- a/tycho-surefire/org.eclipse.tycho.surefire.junit58withvintage/pom.xml +++ b/tycho-surefire/org.eclipse.tycho.surefire.junit58withvintage/pom.xml @@ -72,6 +72,21 @@ junit-vintage-engine ${junit-jupiter-version} + + org.junit.platform + junit-platform-suite-api + ${junit-platform-version} + + + org.junit.platform + junit-platform-suite-commons + ${junit-platform-version} + + + org.junit.platform + junit-platform-suite-engine + ${junit-platform-version} + org.opentest4j opentest4j diff --git a/tycho-surefire/org.eclipse.tycho.surefire.junit58withvintage/src/main/resources/META-INF/services/org.junit.platform.engine.TestEngine b/tycho-surefire/org.eclipse.tycho.surefire.junit58withvintage/src/main/resources/META-INF/services/org.junit.platform.engine.TestEngine index 4e28d5caa6..1e3bab1293 100644 --- a/tycho-surefire/org.eclipse.tycho.surefire.junit58withvintage/src/main/resources/META-INF/services/org.junit.platform.engine.TestEngine +++ b/tycho-surefire/org.eclipse.tycho.surefire.junit58withvintage/src/main/resources/META-INF/services/org.junit.platform.engine.TestEngine @@ -1,4 +1,5 @@ # Manual merge of META-INF/services/org.junit.platform.engine.TestEngine of both junit-vintage-engine and junit-jupiter-engine # otherwise only one of the two files would win when extracting dependencies org.junit.jupiter.engine.JupiterTestEngine -org.junit.vintage.engine.VintageTestEngine \ No newline at end of file +org.junit.vintage.engine.VintageTestEngine +org.junit.platform.suite.engine.SuiteTestEngine diff --git a/tycho-surefire/org.eclipse.tycho.surefire.junit59/bnd.bnd b/tycho-surefire/org.eclipse.tycho.surefire.junit59/bnd.bnd index 9470f7a290..2266fb2466 100644 --- a/tycho-surefire/org.eclipse.tycho.surefire.junit59/bnd.bnd +++ b/tycho-surefire/org.eclipse.tycho.surefire.junit59/bnd.bnd @@ -1,5 +1,6 @@ Import-Package: \ org.junit.jupiter.api.*;version='[5.9,6)',\ + org.junit.platform.suite.api;resolution:=optional;version='[1.9,2)',\ org.opentest4j;version='[1.2,2)',\ !org.apache.maven.surefire.*,\ !org.apache.maven.plugin.surefire.*,\ diff --git a/tycho-surefire/org.eclipse.tycho.surefire.junit59/pom.xml b/tycho-surefire/org.eclipse.tycho.surefire.junit59/pom.xml index 1b3046ca0c..1d02c233c7 100644 --- a/tycho-surefire/org.eclipse.tycho.surefire.junit59/pom.xml +++ b/tycho-surefire/org.eclipse.tycho.surefire.junit59/pom.xml @@ -62,6 +62,21 @@ junit-jupiter-engine ${junit-jupiter-version} + + org.junit.platform + junit-platform-suite-api + ${junit-platform-version} + + + org.junit.platform + junit-platform-suite-commons + ${junit-platform-version} + + + org.junit.platform + junit-platform-suite-engine + ${junit-platform-version} + org.apache.maven.surefire common-java5 diff --git a/tycho-surefire/org.eclipse.tycho.surefire.junit59/src/main/resources/META-INF/services/org.junit.platform.engine.TestEngine b/tycho-surefire/org.eclipse.tycho.surefire.junit59/src/main/resources/META-INF/services/org.junit.platform.engine.TestEngine index f19e876790..5ec9a2def9 100644 --- a/tycho-surefire/org.eclipse.tycho.surefire.junit59/src/main/resources/META-INF/services/org.junit.platform.engine.TestEngine +++ b/tycho-surefire/org.eclipse.tycho.surefire.junit59/src/main/resources/META-INF/services/org.junit.platform.engine.TestEngine @@ -1 +1,2 @@ org.junit.jupiter.engine.JupiterTestEngine +org.junit.platform.suite.engine.SuiteTestEngine \ No newline at end of file diff --git a/tycho-surefire/org.eclipse.tycho.surefire.junit59withvintage/bnd.bnd b/tycho-surefire/org.eclipse.tycho.surefire.junit59withvintage/bnd.bnd index 75e44c3d16..e8466702ae 100644 --- a/tycho-surefire/org.eclipse.tycho.surefire.junit59withvintage/bnd.bnd +++ b/tycho-surefire/org.eclipse.tycho.surefire.junit59withvintage/bnd.bnd @@ -1,5 +1,6 @@ Import-Package: \ org.junit.jupiter.api.*;version='[5.9,6)',\ + org.junit.platform.suite.api;resolution:=optional;version='[1.9,2)',\ org.junit.runner.*;resolution:=optional;version='[4.12,5)',\ org.junit.runners.*;resolution:=optional;version='[4.12,5)',\ org.junit.experimental.categories;resolution:=optional;version='[4.12,5)',\ diff --git a/tycho-surefire/org.eclipse.tycho.surefire.junit59withvintage/pom.xml b/tycho-surefire/org.eclipse.tycho.surefire.junit59withvintage/pom.xml index c70641b2c3..2399d916f9 100644 --- a/tycho-surefire/org.eclipse.tycho.surefire.junit59withvintage/pom.xml +++ b/tycho-surefire/org.eclipse.tycho.surefire.junit59withvintage/pom.xml @@ -72,6 +72,21 @@ junit-vintage-engine ${junit-jupiter-version} + + org.junit.platform + junit-platform-suite-api + ${junit-platform-version} + + + org.junit.platform + junit-platform-suite-commons + ${junit-platform-version} + + + org.junit.platform + junit-platform-suite-engine + ${junit-platform-version} + org.opentest4j opentest4j diff --git a/tycho-surefire/org.eclipse.tycho.surefire.junit59withvintage/src/main/resources/META-INF/services/org.junit.platform.engine.TestEngine b/tycho-surefire/org.eclipse.tycho.surefire.junit59withvintage/src/main/resources/META-INF/services/org.junit.platform.engine.TestEngine index 4e28d5caa6..1e3bab1293 100644 --- a/tycho-surefire/org.eclipse.tycho.surefire.junit59withvintage/src/main/resources/META-INF/services/org.junit.platform.engine.TestEngine +++ b/tycho-surefire/org.eclipse.tycho.surefire.junit59withvintage/src/main/resources/META-INF/services/org.junit.platform.engine.TestEngine @@ -1,4 +1,5 @@ # Manual merge of META-INF/services/org.junit.platform.engine.TestEngine of both junit-vintage-engine and junit-jupiter-engine # otherwise only one of the two files would win when extracting dependencies org.junit.jupiter.engine.JupiterTestEngine -org.junit.vintage.engine.VintageTestEngine \ No newline at end of file +org.junit.vintage.engine.VintageTestEngine +org.junit.platform.suite.engine.SuiteTestEngine