如何仅针对单个 Maven 模块运行测试?

Vol*_*ıcı 9 java maven maven-surefire-plugin

dad给定一个带有模块和的 Maven 项目son,其中son依赖于dad,也mvn -am -pl son test运行测试dad。有没有办法避免这种情况并且只对son模块运行测试?

请注意,有几种方法可以实现此目的,尽管每种方法都有其自己的警告,但我不喜欢:

  • 使用-Dtest="**/son/*Test.java" -DfailIfNoTests=false覆盖maven-surefire-plugin模块中的配置。
  • 与 类似-Dtest,JUnit 5 标签也可以被过滤,但这种方法也有前面提到的同样的缺点。
  • 可以先执行 aninstall -DskipTests=true然后执行mvn -pl son test,尽管这会因部分工作而污染本地 Maven 存储库。

jpl*_*osa 5

在 Maven 3.3.9 上,我运行:

mvn test -pl :web-module

运行网络模块。<module>web-module</module>在 POM 中,标签内应如下所示modules

要测试该模块内的特定类:

mvn test -pl :web-module -Dtest="ClassUnderTest"


小智 1

我被这个问题困扰了一段时间,但最终我找到了解决方案。

这是我的条件:

  • 我有很多子模块:A、B 和 C。其中有些是独立的,有些是依赖的。
  • 我只想运行 Module-C 测试,但 C 依赖于 A 和 B。
  • mvn clean test -pl C 对我不起作用,因为 2。
  • mvn clean test -pl C -am 为我工作,但它运行所有模块测试。

这是我的想法:

之所以mvn clean test -pl C -am运行所有测试,是因为C依赖于A和B,所以模块C必须先编译A和B,然后再编译C。

这些是决议:

  1. 让父 Pom 跳过所有模块测试。
  2. 在模块 C 上创建配置文件并启用测试。
  3. 赶紧跑 mvn clean test -DmoduleCTest=true

模块C pom是这样的,另一个模块也是同样的方式,但是有diff profile id。

<profiles>
    <profile>
        <id>moduleCTest</id>
        <activation>
            <property>
                <name>moduleCTest</name>
                <value>true</value>
            </property>
        </activation>
        <build>
            <plugins>
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-surefire-plugin</artifactId>
                    <configuration>
                        <skipTests>false</skipTests>
                    </configuration>
                </plugin>
            </plugins>
        </build>
    </profile>
</profiles>

Run Code Online (Sandbox Code Playgroud)