【发布时间】:2020-10-10 17:28:38
【问题描述】:
我已经实现了一个自定义 TestEngine 类,它能够通过检查来自 Junit 5 的 EngineDiscoveryRequest 中的 FileSelector 从 *.csv 文件(不是 java 类)中发现和运行单元测试。
我可以使用 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 文件夹中没有任何测试类,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。
【问题讨论】:
-
我没有看到对 junit-jupiter-api 的任何依赖?此外,surefire 通常负责查找测试用例,而这里不是这种情况。除此之外,TestEngine 是为 JUnit Jupiter 所知的测试引擎提供实现的接口。您是否使用
@Testable注释对您的部分进行了注释?您有项目的链接吗? -
嗯,这就是重点。我不想想要使用 Jupiter,因为我有自己的
TestEngine实现。这个实现不依赖于测试类,而是依赖于测试文件(即csv文件),所以不能有任何@Testable注解。我用我的TestEngine实现的相同示例代码更新了我的问题。 -
不准确。您不想使用 junit-jupiter-engine 但您想使用 JUnit Jupiter 平台。此外,您至少需要使用 junit-jupiter-api 来触发surefire以加载正确的基础部件。除此之外,我不确定这是否会起作用,因为surefire依赖于识别你没有的类。此外,您在哪里找到了 csv 文件的问题?在
src/test/resources?除此之外,我很好奇 CSV 文件相对于 Java 代码中真正的书面单元测试有什么优势? -
如果我错了,请纠正我,但是根据Junit用户指南,JUnit Jupiter是新编程模型和扩展模型的结合。我相当确定我不需要这些,因为我的
TestEngine在与ConsoleLauncher一起运行时工作得非常好。控制台启动器在一个 gradle 项目中运行,我只依赖于junit-platform-engine和junit-platform-console。关于用例: csv 文件将在运行时自动生成。它们不是传统意义上的“单元测试”,因为它们用于基于测试的代码搜索。 -
我们在 Apache Maven 中已经意识到了这个问题,并在我们的计划中修复了这个问题。 Surefire 和 Failsafe 从未设计用于运行 CSV。不管你使用什么版本,插件总是使用类和方法运行。我们正在研究一个测试的抽象描述,它可以是任何东西,例如对于 JUnit5 以及运行文件等的唯一 ID。此功能需要进行重大更改才能重新处理插件的内部结构。顺便说一句,所有这些都在 SUREFIRE 的路线图中提到,请参阅首页:maven.apache.org/surefire/maven-surefire-plugin
标签: java maven junit junit5 maven-surefire-plugin