使用Maven运行单个测试方法


519

我知道您可以使用以下命令在某个类中运行所有测试:

mvn test -Dtest=classname

但是我想运行一个单独的方法,-Dtest = classname.methodname似乎不起作用。


3
我也想知道如何做到这一点。但是,如果我发现自己经常这样做,那么我认为test可能是被分成自己的类的候选者,因此您可以使用mvn test -Dtest=classname语法。
约翰·保利特09年

您是否只想通过命令行知道该怎么做?还是使用IDE(日食)对您有用?
迭戈·迪亚斯

1
我在看命令行。我认为junit eclipse插件将允许您执行此操作。
BillMan

我是为Maven 1做的。我记得,它涉及到对负责对测试类进行自检的JUnit进行更改。
kdgregory

Answers:


698

要在Maven中运行单个测试方法,您需要提供以下命令:

mvn test -Dtest=TestCircle#xyz test

TestCircle测试类名称在哪里xyz,测试方法在哪里。

通配符也可以;在方法名和类名中。

如果要在多模块项目中进行测试,请指定测试所在的模块-pl <module-name>

对于集成测试,请使用it.test=...option而不是test=...

mvn -pl <module-name> -Dit.test=TestCircle#xyz integration-test

4
通过降级为surefire 2.9
qwerty,

15
我修复了“未执行测试!” 通过升级到2.14:
alfonx

54
如果要在多模块项目中进行测试,则还需要指定测试所在的模块-pl <module-name>
2013年

22
使用-DfailIfNoTests=false跳过项目没有测试。No Tests Were Executed当您尝试从根项目运行测试并且所有模块都没有测试时,就会发生这种情况。
2014年

4
这个命令有效!mvn "-DTest=JoinTeamTestCases#validateJoinTeam" test 请注意,“-DTest”以大写字母“ T”开头。
2015年

25

surefire 2.12存在问题。这就是我将maven-surefire-plugin从2.12更改为2.11时发生的事情:

  1. mvn test -Dtest=DesignRulesTest

    结果:
    [错误]无法执行目标org.apache.maven.plugins:maven-surefire-plugin:2.12:对项目pmd的测试(默认测试):未执行任何测试!

  2. mvn test -Dtest=DesignRulesTest

    结果:[INFO] --- maven-surefire-plugin:2.11:test(默认测试)@ pmd --- ...运行net.sourceforge.pmd.lang.java.rule.design.DesignRulesTest测试运行:5 ,失败:0,错误:0,跳过:4,经过时间:4.009秒


5
在2.12.1或更高版本中可以再次使用。
yurez

修复了“未执行测试!” 通过升级到2.14
alfonx

如果您使用@Category(IntegrationTest.class),请使用-Dit.test=ClassName,否则您将获得No tests were executed!最新的插件版本。
uvsmtid

16

我对TestNG(不好意思,JUnit不支持)的测试用例是我可以为要运行的测试分配一个组

@Test(groups="broken")

然后只需运行'mvn -Dgroups = broken'。


1
这是一个很好的答案。就我而言,该测试尝试运行,但是某些Seam组件未正确设置,因此看起来这也跳过了部分设置代码。
克里斯·威廉姆斯

1
正确。您需要将groups = broken放入@BeforeMethod中,或执行@BeforeMethod(alwaysRun = true)
tunaranch 2010年

因为我遇到编译问题,请让我知道这里是什么组。
Paramesh Korrakuti 2015年

14

在单个测试类中运行一组方法在2.7.3版中,单个测试类中只能运行n个测试。

注意:junit 4.x和TestNG支持它。

您必须使用以下语法

mvn -Dtest=TestCircle#mytest test

您也可以使用模式

mvn -Dtest=TestCircle#test* test

从surefire 2.12.1开始,您可以选择多种方法(目前仅JUnit4X,欢迎使用补丁程序)

mvn -Dtest=TestCircle#testOne+testTwo test

检查有关单个测试的链接


2
就我而言,我必须对TestClass#test名称加双引号,例如mvn -Dtest =“ TestCircle#myTest”测试
Pratik Khadloya 2014年

@PratikKhadloya知道它如何用于依赖测试吗?说,我在TestClass中有test1(),test2(),test3()方法,而test2取决于test1。我如何只运行test2()?
Ziska 2014年

3
我认为,如果您的测试之间存在依赖性,那么您做错了什么。每个测试应独立于其他测试。您需要删除它们之间的耦合。
Pratik Khadloya 2014年

11

您可以使用以下语法运行特定的测试类和方法:

  1. 完整的软件包:mvn test -Dtest =“ com.oracle.tests。**”

  2. 一个类中的所有方法:mvn test -Dtest = CLASS_NAME1

  3. 单个类中的单个方法:mvn test -Dtest = CLASS_NAME1#METHOD_NAME1

  4. 来自多个类的多重方法:mvn test -Dtest = CLASS_NAME1#METHOD_NAME1,CLASS_NAME2#METHOD_NAME2


10

这个命令有效! mvn "-DTest=JoinTeamTestCases#validateJoinTeam" test请注意,“-DTest”以大写字母“ T”开头。


4
难道不是与神火2.18.x工作; 它只是运行所有测试。
Janaka Bandara '18

4

tobrien提到的test参数允许您在方法名称之前使用来指定方法。这应该适用于JUnit和TestNG。我从未尝试过,只需在Surefire插件页面上阅读它即可:

指定此参数以按文件名运行单个测试,从而覆盖include / excludes参数。您在此处指定的每个模式都将用于创建格式为** / $ {test} .java的包含模式,因此您只需键入“ -Dtest = MyTest”即可运行一个名为“ foo / MyTest.java”的测试。此参数将覆盖include / excludes参数和TestNG suiteXmlFiles参数。从2.7.3开始,您可以通过添加#myMethod或#my * ethod在测试中执行有限数量的方法。junit 4.x和testNg支持Si类型“ -Dtest = MyTest#myMethod”



3

从surefire插件版本2.22.1开始(可能更早),可以在使用testng.xml时使用testnames属性运行单个测试。

给定以下testng.xml

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

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

从命令行

mvn clean test -DselectedTests=run-B-test

进一步阅读- 使用Testng的Maven surefire插件


-5

您可以运行一个测试类,但不能运行一个测试类中的单个方法。您使用类的简单名称而不是类的完全限定名称。因此,如果您在“ org.sonatype.test.MyTest”中有一个测试,并且这是您要运行的唯一测试,那么您的命令行将如下所示:

mvn test -Dtest=MyTest

我在单个模块项目中测试了先前注释中描述的解决方案,因此该注释所讲的不正确。
2015年

5
最初回答时,可能在2009年是对的。
flurdy

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.