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

我可以在 Maven 医生中找到它显示如何运行:

  1. 一次测试
  2. 单个测试类中的所有测试
  3. 类中与特定模式匹配的所有测试

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

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

117517 次浏览

It may not be the best answer, but you could run a single TestSuite (which is a Test) which includes all the test you want in one package.

AFAIK there are no command line parameter for surefire:test to run tests in a specific package.

I use a configuration variable to achieve the same effect. A fragment of my 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>

Now if I want to run tests in a package named "com.example", I use the following command:

mvn test -DtestGroup=com/example

You could use a pattern as well, for example

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

runs all tests in classes from package de.mypackage ending on *Test.

[update 2017/12/18]:
Since this became the accepted answer, here's some further information:

  • Maven uses the Maven Surefire plugin to execute tests.
  • The syntax used above (qualified package name) requires Surefire version 2.19.1 or higher! Earlier versions require the use of path expressions, for example

    mvn -Dtest="de/mypackage/*Test" test
    
  • I'm using quotes (` or ") to prevent the shell from performing pathname expansion, Maven doesn't require any quotes.

  • A single test method can be exuted using the following syntax

    mvn -Dtest=MyUnitTest#testMethod test
    
  • All tests from subpackages may be includes as well, in order to execute all tests in or beneath package de.mypackage.sub execute:

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

    or with Surefire 2.19.1 or higher

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

There are further possibilities like using regular expressions, see the official documentation of running a single test.

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

...and if you want to include all sub packages:

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

It can also be done by

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

eg: I am in my /home/repository and I want to run tests on /home/repository/service folder only

Here service folder is inside my current folder.

You can mention packages in your pom.xml through Surefire-plugin

<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>

Please note that JUnit version should be greater than 4.8. and version of surefire should be 2.19.1 Find more details here

The pom.xml version of O Badr's answer:

    <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>

You can take reference from the following scenarios:

(1) Skip all test execution during maven build

mvn package -DskipTests

(2) Execute All test cases

mvn test

(3) Execute specific test group

mvn test -DincludeGroups=TestGroup1,TestGroup2

(4) Exclude specific test group during execution

mvn test -DexcludeGroups=TestGroup3,TestGroup4

(5) Execute specific package testcases

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

(6) Execute specific test

mvn test -Dtest=Test1,Test2

I hope it will be more helpful to you with a different combination of execution.

Had the same problem (how to run all tests in a particular package) and tried many ways, two commands that worked were:

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


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