【问题标题】:Is there a way to "fail fast" for junit with the maven surefire plugin?有没有办法使用 maven surefire 插件为 junit “快速失败”?
【发布时间】:2010-12-27 18:54:39
【问题描述】:

我目前正在使用 maven 开发一个 java 项目。作为构建过程的一部分,我们使用 maven surefire 插件来运行我们的 junit 套件。

我们的测试套件在覆盖范围和执行时间方面都在快速增长。当您最终等待十分钟才能发现测试在测试的第一分钟失败时,执行时间非常令人沮丧和耗时。

我想找到一种方法,使构建过程在测试套件中的第一个错误/失败时失败。我知道这对于其他构建工具是可能的,但我一直无法找到使用 maven surefire 的方法。

我知道在surefire jira中有an unresolved ticket for this functionality,但我希望有一个现有的解决方案。

【问题讨论】:

    标签: maven-2 junit surefire


    【解决方案1】:

    您可以使用--fail-fast 选项运行maven:

    -ff 选项对于运行交互的开发人员非常有用 希望在开发周期中获得快速反馈的构建。

    一个例子可以是:

    mvn clean test -ff

    http://books.sonatype.com/mvnref-book/reference/running-sect-options.html

    【讨论】:

    • 这是 Maven 的默认行为。一旦其中一个项目失败,这将导致多项目构建的构建失败。该项目的所有单元测试将在第一次失败后继续运行。
    【解决方案2】:

    截至 2015 年 9 月 6 日,it appears there is、-Dsurefire.skipAfterFailureCount=1。

    截至 2015 年 10 月 19 日version 2.19 has been released。

    【讨论】:

    • 此选项似乎会继续处理所有剩余的测试以将它们标记为已跳过。非常奇怪,而且不像人们希望的那样快速失败。
    • @MatthewRead 我不确定这是如何工作的,我从未真正使用过它(或者我可能在 7 年前使用过,但我忘记了细节哈哈)。它实际上是“运行”测试只是说它们最后被跳过了吗?如果是这样,我会考虑使用 Surefire 打开一个错误。
    【解决方案3】:

    这不是问题的直接答案,但它也可以通过 grep 提供 maven 的输出,去除大部分内容并帮助您查看测试失败的位置。

    像这样:

    mvn test | grep -w 'Running\|Tests'
    

    产生如下输出(对于我的代码):

    Running scot.mygov.pp.test.dashboard.DashboardJsonSerDesCRUDTest
    Tests run: 26, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.029 sec
    Running scot.mygov.pp.test.dashboard.DashboardBaselineCRUDTest
    Tests run: 26, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.026 sec
    Running scot.mygov.pp.test.dashboard.DashboardDatabaseValidationTest
    Tests run: 7, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 2.264 sec
    Running scot.mygov.pp.test.dashboard.DashboardServiceWebServiceIsolationCRUDTest
    Tests run: 26, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.032 sec
    

    更容易看出第一个失败错误在哪里。

    【讨论】:

      【解决方案4】:

      据我所知,否,这确实需要SUREFIRE-580的分辨率。如果你想更快地实现这一点,你至少应该为这个问题投票,并且可以选择提交一个补丁;)

      【讨论】:

        【解决方案5】:

        这并不能完全解决问题,但我的工作场所最终提出的解决方案是使用 Atlassian 的 Clover 来运行与更改的代码有关的测试的专门构建。

        我们有一个 Clover 构建,它运行更改代码的测试,然后启动完整的测试构建。

        这已被证明是一个令人满意的解决方案。

        【讨论】:

          【解决方案6】:

          可能有合适的解决方法,但这取决于您的要求,并且您需要使用可以处理 jvm 进程返回码的 CI 服务器。

          基本思想是完全停止 Maven 的 JVM 进程,并让操作系统知道该进程已意外停止。然后,像 Jenkins/Hudson 这样的持续集成服务器应该能够检查非零退出代码,并让您知道测试失败。

          第一步是确保在第一次测试失败时退出 JVM。您可以通过使用自定义 RunListener(将其放在 src/test/java 中)来使用 JUnit 4.7 或更高版本:

          package org.example
          import org.junit.runner.notification.Failure;
          import org.junit.runner.notification.RunListener;
          public class FailFastListener extends RunListener {
                  public void testFailure(Failure failure) throws Exception {
                          System.err.println("FAILURE: " + failure);
                          System.exit(-1);
                  }
          }
          

          然后,您需要配置该类,以便 Surefire 将其注册到 JUnit 4 Runner。编辑您的pom.xml 并将listener 配置属性添加到maven-surefire-plugin。您还需要将surefire 配置为不派生新的JVM 进程 来执行测试。否则,它将继续下一个测试用例。

          <plugin>
              <groupId>org.apache.maven.plugins</groupId>
              <artifactId>maven-surefire-plugin</artifactId>
              <version>2.10</version>
              <configuration>
                  <forkMode>never</forkMode>
                  <properties>
                      <property>
                          <name>listener</name>
                          <value>org.example.FailFastListener</value>
                      </property>
                  </properties>
              </configuration>
          </plugin>
          

          如果这没有帮助,我会尝试 fork maven surefire junit 提供程序插件。

          顺便说一句,根据定义,单元测试的运行速度应该快于 0.1 秒。如果由于单元测试,您的构建确实需要很长时间,那么您将来必须让它们运行得更快。

          【讨论】:

          • 优秀的解决方案。顺便说一句,看起来 never 限制可以通过使用 -ff 选项运行 maven 来放松。在 System.exit() 之后,surefire 将立即中止构建,并显示一条消息“goal org.apache.maven.plugins:maven-surefire-plugin:2.16:test failed: The forked VM 在没有正确告别的情况下终止。VM crash or System.退出叫什么?”
          • 这看起来像是我的问题的解决方案,但我无法让它工作,在发现错误后测试继续运行。另一方面,我没有收到关于我的 RunListener 或我的 pom 文件的任何错误消息。有谁知道可能出了什么问题?
          【解决方案7】:

          如果不完全符合您的需要,有几种方法可以加快速度:

          【讨论】:

          • --fail-fast 是默认行为。
          猜你喜欢
          • 1970-01-01
          • 2016-11-10
          • 1970-01-01
          • 2012-09-01
          • 2019-01-08
          • 2011-08-27
          • 1970-01-01
          • 2017-02-05
          • 1970-01-01
          相关资源
          最近更新 更多