运行 使用 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