运行 使用 Apache Maven Surefire 在 Junit 5 平台上进行基于文件的测试
Running file-based tests on Junit 5 Platform using Apache Maven Surefire
我已经实现了自定义 TestEngine
class,它能够从 *.csv
文件中发现和 运行 单元测试(不是 java classes) 通过在 Junit 5.
的 EngineDiscoveryRequest
中检查 FileSelector
我能够 运行 这些测试没有问题使用 Junit 团队提供的 ConsoleLauncher
,通过调用 org.junit.platform.console.ConsoleLauncher -f build/resources/test/testfile_1.csv
(这是从 gradle 任务调用因为 gradle does not support resource-based testing 但这在这里无关紧要)。
现在,我正在尝试 运行 使用相同的自定义测试引擎进行相同的测试,但使用的是 maven 和 surefire 插件,而不是控制台启动器。我当前的 pom.xml
如下所示(相关部分):
<project>
<dependencies>
<dependency>
<groupId>my_custom_test_engine</groupId>
<artifactId>custom_test_engine</artifactId>
<version>1.0-SNAPSHOT</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.junit.platform</groupId>
<artifactId>junit-platform-engine</artifactId>
<version>1.7.0-M1</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.junit.platform</groupId>
<artifactId>junit-platform-console</artifactId>
<version>1.7.0-M1</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-simple</artifactId>
<version>1.7.30</version>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>3.0.0-M5</version>
</plugin>
</plugins>
</build>
</project>
不幸的是,surefire:test
似乎甚至没有调用我的测试引擎进行发现,只是以:
结束
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 0.626 s
[INFO] Finished at: 2020-06-20T17:00:01+02:00
[INFO] ------------------------------------------------------------------------
我的 src
文件夹中没有任何测试 class,只有 resources/testfile_1.csv
.
下的一个测试文件
surefire 甚至支持使用 Junit 5 进行基于文件的测试吗?如果是这样,我如何强制 Surefire 调用我的自定义测试引擎来进行测试发现?
-- 更新
我的 TestEngine
实现的发现部分看起来像这样(只显示相关部分):
public class MyTestEngine implements TestEngine {
@Override
public TestDescriptor discover(EngineDiscoveryRequest discoveryRequest, UniqueId uniqueId) {
EngineDescriptor engineDescriptor = new EngineDescriptor(uniqueId, name);
logger.debug("Discovering tests");
discoveryRequest.getSelectorsByType(FileSelector.class).forEach(selector -> {
logger.debug("Discovered: {}", selector.getFile().getAbsolutePath());
engineDescriptor.addChild(new TestDescriptor (engineDescriptor.getUniqueId(), selector.getFile().getName()));
});
}
-- 更新 2
我的测试文件位于 src/test/resources
.
下
想通了。感谢@johanneslink 为我指明了正确的方向。
Surefire 确实不支持基于资源的测试(另见 this issue)。
相反,我所做的(正如@johanneslink 所建议的那样)是创建一个空的 class,它可以被 surefire 检测到,以便调用自定义 TestEngine
:
public class TestInitializer {
}
然后,在我的 TestEngine
中,我检查 ClassSelector
并发现基于资源的测试:
discoveryRequest.getSelectorsByType(ClassSelector.class).forEach(selector -> {
if (selector.getClassName().equals(TestInitializer.class.getName())) {
discoverTests(new File(System.getenv("test_dir")), engineDescriptor);
}
});
我的测试文件所在的实际目录由环境变量test_dir
指定。
然后,为了实际使用自定义 TestEngine
,请按如下方式修改您的 pom.xml
:
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.22.2</version>
<configuration>
<dependenciesToScan>
<dependency>
my_custom_test_engine:custom_test_engine
</dependency>
</dependenciesToScan>
<includes>
<include>**/TestInitializer*
</include>
</includes>
<environmentVariables>
<test_dir>target/test-classes
</test_dir>
</environmentVariables>
</configuration>
</plugin>
</plugins>
</build>
dependenciesToScan
属性 将确保 surefire 扫描包含 TestInitializer
class.
的依赖项
请注意,maven-surefire-plugin
的最新版本 3.0.0-M5
在这方面似乎已被破坏,因为测试将被发现并且 运行,但 surefire 不会拿起的结果。请改用 2.22.2
。
我已经实现了自定义 TestEngine
class,它能够从 *.csv
文件中发现和 运行 单元测试(不是 java classes) 通过在 Junit 5.
EngineDiscoveryRequest
中检查 FileSelector
我能够 运行 这些测试没有问题使用 Junit 团队提供的 ConsoleLauncher
,通过调用 org.junit.platform.console.ConsoleLauncher -f build/resources/test/testfile_1.csv
(这是从 gradle 任务调用因为 gradle does not support resource-based testing 但这在这里无关紧要)。
现在,我正在尝试 运行 使用相同的自定义测试引擎进行相同的测试,但使用的是 maven 和 surefire 插件,而不是控制台启动器。我当前的 pom.xml
如下所示(相关部分):
<project>
<dependencies>
<dependency>
<groupId>my_custom_test_engine</groupId>
<artifactId>custom_test_engine</artifactId>
<version>1.0-SNAPSHOT</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.junit.platform</groupId>
<artifactId>junit-platform-engine</artifactId>
<version>1.7.0-M1</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.junit.platform</groupId>
<artifactId>junit-platform-console</artifactId>
<version>1.7.0-M1</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-simple</artifactId>
<version>1.7.30</version>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>3.0.0-M5</version>
</plugin>
</plugins>
</build>
</project>
不幸的是,surefire:test
似乎甚至没有调用我的测试引擎进行发现,只是以:
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 0.626 s
[INFO] Finished at: 2020-06-20T17:00:01+02:00
[INFO] ------------------------------------------------------------------------
我的 src
文件夹中没有任何测试 class,只有 resources/testfile_1.csv
.
surefire 甚至支持使用 Junit 5 进行基于文件的测试吗?如果是这样,我如何强制 Surefire 调用我的自定义测试引擎来进行测试发现?
-- 更新
我的 TestEngine
实现的发现部分看起来像这样(只显示相关部分):
public class MyTestEngine implements TestEngine {
@Override
public TestDescriptor discover(EngineDiscoveryRequest discoveryRequest, UniqueId uniqueId) {
EngineDescriptor engineDescriptor = new EngineDescriptor(uniqueId, name);
logger.debug("Discovering tests");
discoveryRequest.getSelectorsByType(FileSelector.class).forEach(selector -> {
logger.debug("Discovered: {}", selector.getFile().getAbsolutePath());
engineDescriptor.addChild(new TestDescriptor (engineDescriptor.getUniqueId(), selector.getFile().getName()));
});
}
-- 更新 2
我的测试文件位于 src/test/resources
.
想通了。感谢@johanneslink 为我指明了正确的方向。
Surefire 确实不支持基于资源的测试(另见 this issue)。
相反,我所做的(正如@johanneslink 所建议的那样)是创建一个空的 class,它可以被 surefire 检测到,以便调用自定义 TestEngine
:
public class TestInitializer {
}
然后,在我的 TestEngine
中,我检查 ClassSelector
并发现基于资源的测试:
discoveryRequest.getSelectorsByType(ClassSelector.class).forEach(selector -> {
if (selector.getClassName().equals(TestInitializer.class.getName())) {
discoverTests(new File(System.getenv("test_dir")), engineDescriptor);
}
});
我的测试文件所在的实际目录由环境变量test_dir
指定。
然后,为了实际使用自定义 TestEngine
,请按如下方式修改您的 pom.xml
:
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.22.2</version>
<configuration>
<dependenciesToScan>
<dependency>
my_custom_test_engine:custom_test_engine
</dependency>
</dependenciesToScan>
<includes>
<include>**/TestInitializer*
</include>
</includes>
<environmentVariables>
<test_dir>target/test-classes
</test_dir>
</environmentVariables>
</configuration>
</plugin>
</plugins>
</build>
dependenciesToScan
属性 将确保 surefire 扫描包含 TestInitializer
class.
请注意,maven-surefire-plugin
的最新版本 3.0.0-M5
在这方面似乎已被破坏,因为测试将被发现并且 运行,但 surefire 不会拿起的结果。请改用 2.22.2
。