Run a single test method with maven
我知道您可以使用以下方法在某个类中运行所有测试:
1 | mvn test -Dtest=classname |
但我想运行一个单独的方法,-dtest=classname.methodname似乎不起作用。
要在Maven中运行单个测试方法,需要提供以下命令:
1 | mvn test -Dtest=TestCircle#xyz test |
其中,
通配符也可以使用;包括方法名和类名。
如果您在一个多模块项目中进行测试,请指定该测试与
对于集成测试,使用
1 | mvn -pl <module-name> -Dit.test=TestCircle#xyz integration-test |
Surefire 2.12有问题。这就是我将Maven Surefire插件从2.12更改为2.11时发生的情况:
Result:
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-surefire-plugin:2.12:test (default-test) on project pmd: No tests were executed!
Result:
[INFO] --- maven-surefire-plugin:2.11:test (default-test) @ pmd ---
...
Running net.sourceforge.pmd.lang.java.rule.design.DesignRulesTest
Tests run: 5, Failures: 0, Errors: 0, Skipped: 4, Time elapsed: 4.009 sec
我对我的测试所做的,(抱歉,JUnit不支持这个)测试用例是我可以为要运行的测试分配一个组
1 | @Test(groups="broken") |
然后简单地运行"mvn-dgroups=broken"。
在单个测试类中运行一组方法对于版本2.7.3,您只能在一个测试类中运行n个测试。
注意:它支持junit 4.x和testng。
必须使用以下语法
1 | mvn -Dtest=TestCircle#mytest test |
你也可以用图案
1 | mvn -Dtest=TestCircle#test* test |
从Surefire 2.12.1开始,您可以选择多种方法(此时仅限JUnit4x,欢迎使用补丁)
1 | mvn -Dtest=TestCircle#testOne+testTwo test |
检查有关单个测试的链接
可以使用以下语法运行特定的测试类和方法:
full package : mvn test -Dtest="com.oracle.tests.**"
all method in a class : mvn test -Dtest=CLASS_NAME1
single method from single class :mvn test -Dtest=CLASS_NAME1#METHOD_NAME1
multiple method from multiple class : mvn test -Dtest=CLASS_NAME1#METHOD_NAME1,CLASS_NAME2#METHOD_NAME2
这个命令有效!!
Tobrien提到的测试参数允许您在方法名称之前使用指定方法。这对于JUnit和Testng应该是有效的。我从未尝试过,只需在Surefire插件页面上阅读:
Specify this parameter to run individual tests by file name, overriding the includes/excludes parameters. Each pattern you specify here will be used to create an include pattern formatted like **/${test}.java, so you can just type"-Dtest=MyTest" to run a single test called"foo/MyTest.java".
This parameter overrides the includes/excludes parameters, and the TestNG suiteXmlFiles parameter. since 2.7.3 You can execute a limited number of method in the test with adding #myMethod or #my*ethod. Si type"-Dtest=MyTest#myMethod" supported for junit 4.x and testNg
JUnit的新版本包含类别运行程序:http://kentbeck.github.com/junit/doc/releasenotes4.8.html
但是JUnit的发布过程并不是基于Maven的,所以Maven用户必须手动将其放到自己的存储库中。
从Surefire插件版本2.22.1(可能更早)开始,使用testng.xml时,可以使用testnames属性运行单个测试。
给定以下testng.xml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE suite SYSTEM"http://testng.org/testng-1.0.dtd"> <suite name="Suite"> <test name="all-tests"> <classes> <class name="server.Atest"/> <class name="server.Btest"/> <class name="server.Ctest"/> </classes> </test> <test name="run-A-test"> <classes> <class name="server.Atest"/> </classes> </test> <test name="run-B-test"> <classes> <class name="server.Btest"/> </classes> </test> <test name="run-C-test"> <classes> <class name="server.Ctest"/> </classes> </test> </suite> |
使用pom.xml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> [...] <properties> <selectedTests>all-tests</selectedTests> </properties> [...] <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> maven-surefire-plugin</artifactId> <version>2.22.1</version> <configuration> <suiteXmlFiles> <file>src/test/resources/testng.xml</file> </suiteXmlFiles> <properties> <property> <name>testnames</name> <value>${selectedTests}</value> </property> </properties> </configuration> </plugin> </plugins> [...] </project> |
从命令行
1 | mvn clean test -DselectedTests=run-B-test |
进一步阅读-maven surefire插件使用testng
可以运行单个测试类,但不能在测试类中运行单个方法。您使用的是类的简单名称,而不是类的完全限定名称。因此,如果您在"org.sonatype.test.mytest"中有一个测试,并且这是您想要运行的唯一测试,那么您的命令行应该如下所示:
1 | mvn test -Dtest=MyTest |
据我所知,Surefire插件没有提供任何实现这一点的方法。但请随意打开一个问题:)