我目前正在使用maven开发一个java项目。我们使用maven surefire插件来运行我们的junit套件作为构建过程的一部分。
我们的测试套件在覆盖范围和执行时间都在快速增长。当您在测试的第一分钟内等待十分钟以确定测试失败时,执行时间非常令人沮丧且耗时。
我想找到一种方法让构建过程在测试套件中出现第一个错误/失败时失败。我知道这对于其他构建工具是可行的,但我一直无法通过maven surefire找到一种方法。
我知道肯定会有an unresolved ticket for this functionality,但我希望现有解决方案。
答案 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)
如果不完全符合您的需要,有几种方法可以加快速度:
如果是多模块构建,请添加 - 在第一个模块之后退出命令行以退出。
调查失败的安全措施 将集成测试运行到 生命周期的不同阶段。
查看基于配置文件的快速和慢速测试解决方案 - Is there a way to tell surefire to skip tests in a certain package?
答案 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构建,它运行已更改代码的测试,然后开始完整的测试构建。
这已被证明是一种令人满意的解决方案。