【问题标题】:Run a single test method with maven使用 maven 运行单个测试方法
【发布时间】:2010-12-24 20:16:22
【问题描述】:

我知道您可以使用以下方法运行某个类中的所有测试:

mvn test -Dtest=classname

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

【问题讨论】:

  • 我也有兴趣知道如何做到这一点。但是,如果我发现自己经常这样做,我认为该测试可能会被拆分到自己的类中,因此您可以使用 mvn test -Dtest=classname 语法。
  • 你想知道如何只通过命令行来做吗?还是使用 IDE (eclipse) 对你有用?
  • 我正在查看命令行。我认为 junit eclipse 插件将允许您这样做。
  • 我是为 Maven 1 做的。我记得,它涉及对负责内省测试类的 JUnit 进行更改。

标签: java maven unit-testing maven-2 maven-3


【解决方案1】:

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

mvn test -Dtest=TestCircle#xyz test

其中TestCircle 是测试类名,xyz 是测试方法。

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

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

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

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

【讨论】:

  • 通过降级到 surefire 2.9 修复了“未执行测试”错误
  • 我修复了“未执行任何测试!”通过升级到 2.14:
  • 如果你在一个多模块项目中测试,你还需要用-pl &lt;module-name&gt;指定测试所在的模块。
  • 使用-DfailIfNoTests=false 跳过未经测试的项目。 No Tests Were Executed 当您尝试从根项目运行测试并且根本没有测试的模块时发生。
  • 这个命令有效!! mvn "-DTest=JoinTeamTestCases#validateJoinTeam" test 请注意,“-DTest”以大写“T”开头。
【解决方案2】:

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

  1. mvn test -Dtest=DesignRulesTest

    结果:
    [错误] 未能执行目标 org.apache.maven.plugins:maven-surefire-plugin:2.12:test (default-test) on project pmd: 没有执行测试!强>

  2. mvn test -Dtest=DesignRulesTest

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

【讨论】:

  • 在 2.12.1 或更高版本中再次工作。
  • 修复了“未执行任何测试!”通过升级到 2.14
  • 如果您使用@Category(IntegrationTest.class),请使用-Dit.test=ClassName,否则即使使用最新的插件版本,您也会得到No tests were executed!
【解决方案3】:

我用我的 TestNG 做什么,(对不起,JUnit 不支持这个)测试用例是我可以为我想运行的测试分配一个组

@Test(groups="broken")

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

【讨论】:

  • 这是一个很好的答案。在我的例子中,测试试图运行,但一些 Seam 组件没有正确设置,所以看起来这也跳过了设置代码的某些部分。
  • 正确。您需要将 groups=broken 放入您的 @BeforeMethod 中,或者执行 @BeforeMethod(alwaysRun=true)
  • 请告诉我这里的组是什么,因为我遇到了编译问题。
【解决方案4】:

在单个测试类中运行一组方法 在 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

查看link about single tests

【讨论】:

  • 在我的情况下,我不得不双引号 TestClass#test 名称,如 mvn -Dtest="TestCircle#myTest" test
  • @PratikKhadloya 知道它如何用于依赖测试吗?比如说,我在 TestClass 中有 test1()、test2()、test3() 方法,而 test2 依赖于 test1。我怎样才能只运行 test2()?
  • 我认为如果您的测试之间存在依赖关系,那么您做错了什么。每个测试都应该独立于其他测试。你需要去掉它们之间的耦合。
【解决方案5】:

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

  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

【讨论】:

    【解决方案6】:

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

    【讨论】:

    • 与 SureFire 2.18.x 一起工作吗?它只是运行所有测试。
    • 这对我使用 Java17 时产生了影响
    【解决方案7】:

    从测试类运行单个测试方法。

    mvn test -Dtest=Test1#methodname


    其他相关用例

    • mvn test // Run all the unit test classes

    • mvn test -Dtest=Test1 // Run a single test class

    • mvn test -Dtest=Test1,Test2 // Run multiple test classes

    • mvn test -Dtest=Test1#testFoo* // Run all test methods that match pattern 'testFoo*' from a test class.

    • mvn test -Dtest=Test1#testFoo*+testBar* // Run all test methods match pattern 'testFoo*' and 'testBar*' from a test class.

    【讨论】:

    • 极好的解决方案
    【解决方案8】:

    我尝试了该线程中提供的几种解决方案,但是它们不适用于依赖于不同模块的模块。在那种情况下,我必须使用附加参数从根模块运行mvn-am (--also-make),它告诉 maven 构建您的测试模块所依赖的模块和-DfailIfNoTests=false,否则“没有测试处决!”出现错误。

    mvn test -pl B -Dtest=MyTestClass#myTest -am -DfailIfNoTests=false
    

    根目录中的 pom.xml 部分:

    <modules>
        <module>A</module>
        <module>B</module>
    <modules>
    

    B 依赖于 A。

    【讨论】:

      【解决方案9】:

      tobrien 提到的test 参数允许您在方法名称前使用# 来指定方法。这应该适用于 JUnit 和 TestNG。没试过,看Surefire Plugin page

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

      【讨论】:

        【解决方案10】:

        新版本的 JUnit 包含 Categories 运行器: http://kentbeck.github.com/junit/doc/ReleaseNotes4.8.html

        但是JUnit的发布过程不是基于maven的,所以maven用户必须手动把它放到他们的仓库中。

        【讨论】:

        【解决方案11】:

        从 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
        

        进一步阅读 - Maven surefire plugin using testng

        【讨论】:

          【解决方案12】:

          首先你需要清理你的 maven 项目

          mvn clean

          然后你可以运行特定的文件和函数使用

          mvn test -Dtest=testClassName#testCaseName

          【讨论】:

            【解决方案13】:

            您需要指定要执行的 JUnit 测试类及其方法。

            mvn test -Dtest=com.mycompany.AppTest#testMethod
            

            https://metamug.com/article/java/build-run-java-maven-project-command-line.html#running-unit-tests

            【讨论】:

              【解决方案14】:

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

              mvn test -Dtest=MyTest
              

              【讨论】:

              • 我在单个模块项目中测试了以前的 cmets 描述的解决方案,所以这个评论说的是不正确的。
              • 2009 年最初回答时可能是真的。
              猜你喜欢
              • 2012-01-02
              • 1970-01-01
              • 2019-05-05
              • 2015-02-23
              • 2013-03-10
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多