使用maven surefire插件有没有办法让junit“快速失败”?

时间:2009-12-17 19:00:21

标签: maven-2 junit surefire

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

我们的测试套件在覆盖范围和执行时间都在快速增长。当您在测试的第一分钟内等待十分钟以确定测试失败时,执行时间非常令人沮丧且耗时。

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

我知道肯定会有an unresolved ticket for this functionality,但我希望现有解决方案。

7 个答案:

答案 0 :(得分:32)

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

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

答案 1 :(得分:13)

据我所知,没有,这确实需要SUREFIRE-580的解析。如果你想更快地实现这一点,你至少应该投票支持这个问题,并且可选择提交补丁;)

答案 2 :(得分:11)

可能有一个合适的解决方法,但这取决于您的要求,您需要使用可以处理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>

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

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

答案 3 :(得分:2)

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

  

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

一个例子可以是:

mvn clean test -ff

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

答案 4 :(得分:1)

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

答案 5 :(得分:1)

这不是问题的直接答案,但通过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

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

答案 6 :(得分:0)

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

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

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