使用 Maven Surefire 运行依赖项 jar 中包含的 JUnit 测试

Posted

技术标签:

【中文标题】使用 Maven Surefire 运行依赖项 jar 中包含的 JUnit 测试【英文标题】:Run JUnit Tests contained in dependency jar using Maven Surefire 【发布时间】:2012-05-16 19:58:42 【问题描述】:

我的 maven 存储库中有一个 jar,其中包含 junit 测试,它应该在不同的项目中运行,因为它能够检查项目并测试它的某些功能。不幸的是,surefire 不会提取 jar 中包含的测试,例如 Feature Request shows。

在功能请求中,他们建议解压 jar,然后由 surefire 执行。

我使用 maven-dependency-plugin 成功解压了 jar,但包含的测试无论如何都不会执行。这就是我配置 maven-dependency-plugin 以解压缩我的 jar 的方式:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-dependency-plugin</artifactId>
    <executions>
        <execution>
            <id>unpack</id>
            <phase>process-test-classes</phase>
            <goals>
                <goal>unpack</goal>
            </goals>
            <configuration>
                <artifactItems>
                    <artifactItem>
                        <groupId>de.mwx.test</groupId>
                        <artifactId>selenium-test-base</artifactId>
                        <version>0.1</version>
                        <overWrite>true</overWrite>
                          <outputDirectory>
                              $project.build.directory/classes
                          </outputDirectory>
                    </artifactItem>
                </artifactItems>
            </configuration>
        </execution>
    </executions>
</plugin>

如有任何帮助,将不胜感激。

【问题讨论】:

为什么测试在另一个罐子里?他们是针对您的项目还是其他项目进行测试?如果是另一个,你为什么要运行它们?如果用于您的应用,为什么它们不在您的项目中? 另一个jar其实是一个测试框架,对当前项目进行操作,执行杂项任务。在我看来,这似乎是最模块化的方式:但我猜这不是 surefix 的预期用途。 但是 maven 项目已经为项目的测试定义了一个标准。而且 IMO 让项目依赖于其测试是没有意义的——如果有的话,测试将依赖于被测模块,因为测试使用该模块,但反之则不然。 如果项目本身就是一个测试,那么让一个项目依赖于它的测试是有意义的。依赖 jar 是一个框架,它调用当前项目中的测试。这使得动态配置一组测试变得容易。 IMO,不,这没有意义。 【参考方案1】:

如问题中所述,您需要有一个包含在项目中的套件,该套件不位于测试 jar 中。

【讨论】:

是的,这就是我所说的项目。我将更新我的问题以使这一点更清楚。 我建议使用 test-classes 目录而不是 classes 文件夹作为 outputDirectory。【参考方案2】:

(这只是重申上面来自 khmarbaise 的评论中的内容,但由于没有澄清,我认为值得重申):

使用 test-classes 目录而不是 classes 文件夹作为 outputDirectory:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-dependency-plugin</artifactId>
    <executions>
        <execution>
            <id>unpack</id>
            <phase>process-test-classes</phase>
            <goals>
                <goal>unpack</goal>
            </goals>
            <configuration>
                <artifactItems>
                    <artifactItem>
                        <groupId>de.mwx.test</groupId>
                        <artifactId>selenium-test-base</artifactId>
                        <version>0.1</version>
                        <overWrite>true</overWrite>
                          <outputDirectory>
                              $project.build.directory/test-classes
                          </outputDirectory>
                    </artifactItem>
                </artifactItems>
            </configuration>
        </execution>
    </executions>
</plugin>

【讨论】:

【参考方案3】:

有一种方法可以在 Maven 中从另一个 jar 中运行测试。 从 maven-surefire-plugin 2.15 版开始,您可以告诉 maven 扫描您的测试 jar 以进行测试并运行它们。 您不需要提取测试 jar。 只需向您的测试 jar 添加一个依赖项,然后:

<plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-surefire-plugin</artifactId>
        <configuration>
            <dependenciesToScan>
                <dependency>test.jar.group:test.jar.artifact.id</dependency>
            </dependenciesToScan>
        </configuration>
    </plugin>

从https://gist.github.com/aslakknutsen/4520226 拿了这些东西 还有https://issues.apache.org/jira/browse/SUREFIRE-569

正如预期的那样,这适用于 JUnit 和 Testng。可能适用于万能可以运行的任何东西。

【讨论】:

工作就像一个魅力!即使指定对 test-jar 的依赖项(使用 tests @mac 你是否需要做任何事情来指定测试分类器?

以上是关于使用 Maven Surefire 运行依赖项 jar 中包含的 JUnit 测试的主要内容,如果未能解决你的问题,请参考以下文章

Spring Boot 无法运行 maven-surefire-plugin ClassNotFoundException org.apache.maven.surefire.booter.Forke

Maven/Surefire 找不到要运行的测试

maven-surefire 插件没有运行少数 Junit5 测试配置文件

使用 maven surefire 使用 mpirun 运行 Junit 测试

解决maven插件问题:'无法加载mojo'

Maven Surefire 插件没有重新运行失败的 Cucumber 测试