如何在 maven 的集成测试目标中运行单个测试

Posted

技术标签:

【中文标题】如何在 maven 的集成测试目标中运行单个测试【英文标题】:How to run individual test in the integration-test target in maven 【发布时间】:2010-10-28 00:59:27 【问题描述】:

我们在 Maven 中为集成测试阶段生命周期定义了数百个测试,它们需要很长时间才能完成。

我想做的只是在integration-test 中运行一项测试。我试着做:

mvn -Dtest=<my-test> integration-test

但这不起作用。 -Dtest 只运行单元测试目标中的测试,而不是集成测试阶段。我尝试了-Dintegration-test=&lt;my-test&gt;,但被忽略了。

有没有办法做到这一点?


我的配置是:

<plugin> 
    <groupId>org.apache.maven.plugins</groupId> 
    <artifactId>maven-surefire-plugin</artifactId> 
    <executions> 
        <execution> 
            <id>surefire-it</id> 
            <phase>integration-test</phase> 
            <goals> 
                <goal>test</goal> 
            </goals> 
            <configuration> 
                <excludes> 
                    <exclude>none</exclude> 
                </excludes> 
                <includes>
                    <include>**/api/**</include> 
                </includes> 
    ..... 

【问题讨论】:

我刚刚在我的项目中完成了这项工作,并且成功了。你有没有机会从 pom 中发布 surefire 插件部分? org.apache.maven.pluginsmaven-surefire-pluginsurefire-it integration-testtestnone**/api/** ..... 由于限制,我无法发布完整的内容。但这就是它的要点。 您可以作为问题的一部分发布。如果您删除排除和包含部分会发生什么,只是出于兴趣。除此之外你的配置和我的一样 【参考方案1】:

如果您使用的是Maven failsafe plugin,则可以通过将it.test 属性设置为您的完全限定测试类名称来运行单个集成测试:

mvn -Dit.test=your.TestCase verify

见the failsafe plugin docs for more info。

【讨论】:

这在 2013 年 7 月 26 日对我有用,插件版本为 2.15 和 Maven 3.1.0,尽管其他答案是这样说的。另一个答案似乎是一个错误。 已针对 mvn 3.2.5、插件 2.18 验证。运行一个集成测试: mvn integration-test -Dit.test=MyClassIT 但是,这也运行单元测试: mvn verify -Dit.test=MyClassIT 请注意,这可能仍会运行单元测试。要关闭单元测试的执行,请添加-Dtest=foo -DfailIfNoTests=false(假设 foo 不存在),请参阅***.com/questions/6612344/…。【参考方案2】:

Failsafe documentation 会让您像这样指定测试:

mvn -Dit.test=BrokenIT verify

但是,-Dit.test 似乎不再起作用了。相反,用于指定 Surefire 测试的相同参数显然也适用于 Failsafe。例如:

mvn -Dtest=WorksIT verify

我已经提交了bug(编辑: 在 2.12 中被关闭为“无法复制”)以更正文档。

【讨论】:

无法触发构建测试环境的build-helper-maven-plugin。 @okwap 这听起来像是您的项目和插件设置所特有的,而不是故障安全/集成测试问题。 5 年后...我遇到了类似的问题 -Dit.test,或者任何带有点的参数都不起作用。通过 cmd 而不是 powershell 运行命令为我修复了它。【参考方案3】:

只需添加 -DfailIfNoTests=false 即可使用 testNG 为我工作。像这样的:

mvn integration-test -Dtest=aITest -DfailIfNoTests=false

【讨论】:

【参考方案4】:

我为此苦苦挣扎,并创建了一个额外的配置文件,以便在我只想运行一个集成测试时使用。我希望我在这里成功提取了正确的部分:

    <profile>
        <id>integrationTestSingle</id>
        <build>
            <plugins>
                <plugin>
                    <artifactId>maven-surefire-plugin</artifactId>
                    <executions>
                        <execution>
                            <id>surefire-it</id>
                            <phase>integration-test</phase>
                            <goals>
                                <goal>test</goal>
                            </goals>
                            <configuration>
                                <includes>
                                    <include>**/integration/**/$test.java</include>
                                </includes>
                                <skipTests>false</skipTests>
                            </configuration>
                        </execution>
                    </executions>
                    <configuration>
                        <argLine>-Xms256M -Xmx768M -XX:MaxPermSize=256M</argLine>
                    </configuration>
                </plugin>

                <plugin>
                    <artifactId>maven-surefire-plugin</artifactId>
                    <executions>
                        <execution>
                            <id>default-test</id>                                
                            <configuration>
                                <skipTests>true</skipTests>
                            </configuration>
                        </execution>
                    </executions>

                </plugin>
            </plugins>
        </build>
    </profile>

现在,我使用 integrationTestSingle 配置文件和 -DfailIfNoTests=false -Dtest=NameOfTest 调用 maven,它在常规“测试”阶段不运行任何常规测试,而在集成测试期间仅运行 NameOfTest 测试阶段。

【讨论】:

【参考方案5】:

我不确定 JUnit,但对于 TestNG,策略是定义一个只有一个测试的套件 XML 文件,然后在您的 POM 中配置surefire插件以仅运行它。在你的 POM 中,你会有这样的东西(免责声明,这是未经测试的):

  <plugin>
    <artifactId>maven-surefire-plugin</artifactId>
    <executions>
      <execution>
        <phase>integration-test</phase>
        <configuration>
          <suiteXmlFiles>
            <suiteXmlFile>single-test.xml</suiteXmlFile>
          </suiteXmlFiles>
        </configuration>
        <goals>
          <goal>run</goal>
        </goals>
      </execution>
    </executions>
  </plugin>

要配置套件文件,请参阅http://testng.org/doc/documentation-main.html

【讨论】:

我同意詹姆斯的观点。 TestNG 适合这种情况,但我认为最好使用 TestNG 组:@Test(groups = "slow_test" ) 然后在您的 TestNG 套件中: 然后你总是可以包含/排除特定的组【参考方案6】:

我自己也遇到了。这样的事情对我很有效:

mvn -Pintegration-test -Dtest=<my-test>

诀窍是确保在 -Dtest 部分之前提到了测试组。

【讨论】:

【参考方案7】:

我正在使用: Apache Maven 3.6.3

openjdk version "11.0.2" 2019-01-15

<groupId>org.codehaus.mojo</groupId>
<artifactId>failsafe-maven-plugin</artifactId>
<version>2.4.3-alpha-1</version>

这个命令对我有用:

mvn failsafe:integration-test  -Dsurefire.skip=true -DskipIntegrationTests=false -DskipTests=false -Dtest=com.myxyz.func.ITestGate

【讨论】:

【参考方案8】:

通过使用实际文档回到基础知识,实际上比上面的答案更简单。

运行 Junit 5 集成测试:

openjdk version "11.0.11" 2021-04-20
Apache Maven 3.6.3

在主构建中,只需放入记录的故障安全配置:

  <build>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-failsafe-plugin</artifactId>
        <version>3.0.0-M5</version>
        <executions>
          <execution>
            <goals>
              <goal>integration-test</goal>
              <goal>verify</goal>
            </goals>
          </execution>
        </executions>
      </plugin>
    </plugins>
  </build>

然后你可以只运行一个特定的集成测试:

mvn -Dtest=\*cs1_\* verify

请注意,此版本将在 target 文件夹中运行您的测试,如果您需要加载任何类似于 src\test\resources\x.y 的外部文件,则将它们复制到 target\test-classes\x.y

【讨论】:

【参考方案9】:

这对我有用,当我在集成测试中只运行一种测试方法时

    mvn clean -Dit.test=some.package.SomeTestClass#testMethodName integration-test

【讨论】:

以上是关于如何在 maven 的集成测试目标中运行单个测试的主要内容,如果未能解决你的问题,请参考以下文章

运行 Maven 集成测试时获取“在分支目标处期望堆栈图帧”

如何在Gradle中为单个测试类并行执行JUnit测试

如何在 grails 3 中运行单个集成测试?

如何使用 Maven Surefire 插件与不同的组进行测试和集成测试?

在多模块 Maven 项目中构建所有模块后,如何运行集成测试?

如何:针对测试环境(数据库)运行 Maven 集成测试