如何使用 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 运行特定包中的所有测试?的主要内容,如果未能解决你的问题,请参考以下文章
如何将 testthat 测试应用于我的包中与特定命名模式匹配的所有函数?