如何使用 Maven 运行特定包中的所有测试?

Posted

技术标签:

【中文标题】如何使用 Maven 运行特定包中的所有测试?【英文标题】:How to run all tests in a particular package with Maven? 【发布时间】:2011-10-12 18:57:17 【问题描述】:

我可以在Maven docs 中找到它显示如何运行的地方:

    单次测试 单个测试类中的所有测试 匹配特定模式的类中的所有测试

但是如何在一个包中运行所有的测试呢?这可能吗?

我更喜欢不需要修改pom.xml 或代码的解决方案。

【问题讨论】:

试试这个link。 如果您使用的是intellij,只需在项目窗口中选择包并执行“Ctrl+Shift+F10”即可。我知道这不是直接使用 maven,但我希望对那里的人有所帮助。 【参考方案1】:

你也可以使用模式,例如

 mvn '-Dtest=de.mypackage.*Test' test

在包 de.mypackage 中以 *Test 结尾的类中运行所有测试。

[2017/12/18 更新]: 由于这已成为公认的答案,因此这里有一些进一步的信息:

Maven 使用Maven Surefire plugin 执行测试。

上面使用的语法(限定包名)需要 Surefire 版本 2.19.1 或更高版本!早期版本需要使用路径表达式,例如

mvn -Dtest="de/mypackage/*Test" test

我使用引号(` 或 ")来防止 shell 执行路径名扩展,Maven 不需要任何引号。

可以使用以下语法执行单个测试方法

mvn -Dtest=MyUnitTest#testMethod test

子包中的所有测试也可以包含在内,以便在包de.mypackage.sub执行中或包下执行所有测试:

mvn -Dtest="de/mypackage/sub/**" test

或使用 Surefire 2.19.1 或更高版本

mvn -Dtest="de.mypackage.sub.**" test

还有更多可能,例如使用正则表达式,请参阅official documentation of running a single test。

【讨论】:

非常适合我! mvn test -Dtest=com.example.handler.*Test 你甚至可以使用mvn '-Dtest=de.mypackage.**.*Test' test 来包含子包 在 Maven 3 中,当我不使用撇号 (') 时它可以正常工作 当你想测试很多包时,你可以把它全部列出来(在逗号后面写就行了),例如:mvn -Dtest=com.packadmin.*Test,com.packclient.*Test test 对于尝试在包中运行测试的任何其他人,您必须以 **.* 结尾。前任。 -Dtest="com.name.**.*"【参考方案2】:

AFAIK 没有用于 surefire:test 的命令行参数来运行特定包中的测试。

我使用一个配置变量来达到同样的效果。我的 pom.xml 片段:

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-surefire-plugin</artifactId>
            <version>2.7.2</version>
            <configuration>
                <includes>
                    <include>**/$testGroup/*Test.java</include>
                </includes>
            </configuration>
        </plugin>
    </plugins>
</build>

现在,如果我想在名为“com.example”的包中运行测试,我使用以下命令:

mvn test -DtestGroup=com/example

【讨论】:

【参考方案3】:

您可以参考以下场景:

(1) maven build 期间跳过所有测试执行

mvn package -DskipTests

(2) 执行所有测试用例

mvn test

(3) 执行特定的测试组

mvn test -DincludeGroups=TestGroup1,TestGroup2

(4) 执行时排除特定的测试组

mvn test -DexcludeGroups=TestGroup3,TestGroup4

(5) 执行特定的包测试用例

mvn test -Dtest="test.java.com.service.map.**"

(6) 执行特定测试

mvn test -Dtest=Test1,Test2

我希望通过不同的执行组合对您更有帮助。

【讨论】:

【参考方案4】:
mvn test -Dtest=com.myrootpackage.myfirstlevelpackage.*

...如果你想包含所有子包:

mvn test -Dtest=com.myrootpackage.myfirstlevelpackage.**.*

【讨论】:

【参考方案5】:

O Badr 答案的 pom.xml 版本:

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-surefire-plugin</artifactId>
                <version>2.20.1</version>
                <configuration>
                    <includes>
                 <!-- includes all tests, but not in subpackages -->
                        <include>**/package1/*</include>   
                 <!-- includes all tests, AND in subpackages -->
                        <include>**/package2/**</include>
                    </includes>
                </configuration>
            </plugin>

        </plugins>
    </build>

【讨论】:

我关于 Maven 的老问题得到了相当一致的关注......我不确定我应该对此感到高兴还是难过。【参考方案6】:

遇到了同样的问题(如何在特定包中运行所有测试)并尝试了很多方法,两个有效的命令是:

mvn -Dtest=com.package.my.package.** test

mvn -Dtest=com.package.my.package.**.* test

【讨论】:

【参考方案7】:

这可能不是最好的答案,但您可以运行一个 TestSuite(它是一个测试),它在一个包中包含您想要的所有测试。

【讨论】:

【参考方案8】:

也可以这样做

mvn clean test -Dtest="**/service/**/*.java"

例如:我在 /home/repository 中,我只想在 /home/repository/service 文件夹上运行测试

这里的服务文件夹在我当前的文件夹中。

【讨论】:

【参考方案9】:

您可以通过 Surefire-plugin 在 pom.xml 中提及软件包

<plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-surefire-plugin</artifactId>
            <version>2.19.1</version>
            <configuration>
                <includes>
                    <include>com.mycom.mydep.mypak.*, com.mycom.mydep.mypak2.*</include>
                </includes>
            </configuration>
        </plugin>

请注意,JUnit 版本应大于 4.8。并且surefire的版本应该是2.19.1 Find more details here

【讨论】:

以上是关于如何使用 Maven 运行特定包中的所有测试?的主要内容,如果未能解决你的问题,请参考以下文章

使用 Maven,我如何运行特定的测试?

如何通过maven测试Jenkins项目下的特定模块?

如何将 testthat 测试应用于我的包中与特定命名模式匹配的所有函数?

如何按特定顺序运行 Maven 测试? [复制]

如何在没有 Maven 的情况下同时运行 Eclipse Java 项目的所有 JUnit 测试?

Maven中的依赖相关总结