重新运行失败的测试
在开发过程中,您可能会重新运行失败的测试,因为它们很不稳定。要通过 Maven surefire 使用此功能,请将rerunFailingTestsCount
属性设置为大于 0 的值。测试将一直运行,直到它们通过或重新运行的次数已用完。
注意:仅 JUnit 4.x 支持此功能。
mvn -Dsurefire.rerunFailingTestsCount=2 test
如果rerunFailingTestsCount
设置为小于或等于 0 的值,则将被忽略。
在屏幕上输出片状重新运行信息
当rerunFailingTestsCount
设置为大于 0 的值且测试失败时,将重新运行,并且每次运行信息也会输出。将输出每次运行及其编号和修整的堆栈跟踪。
如果测试在第一次运行中通过,那么屏幕上的输出将与rerunFailingTestsCount
未使用的情况相同。
如果第一次运行测试失败,那么有两种可能的情况:
1) 测试在其重新运行之一中通过:最后一次运行将被标记为通过
例如,第二次运行通过的测试将在屏幕上输出:
Run 1: ... Run 2: PASS
那么这个测试将被算作一个片状测试。构建会成功,但在所有测试运行的摘要结束时,会在屏幕上输出易碎测试的数量,例如:
Tests run: 2, Failures: 0, Errors: 0, Skipped: 0, Flakes: 1
2) 测试在所有重新运行中均失败:
例如,一个测试在所有三个运行中都失败了,那么所有的运行都会在屏幕上输出:
Run 1: ... Run 2: ... Run 3: ...
然后这个构建将被标记为失败。该测试的失败类型(失败的测试或错误的测试)取决于它的第一次失败。
在测试报告 xml 中输出不稳定的重新运行信息
当rerunFailingTestsCount
设置为大于 0 的值时,测试报告的输出 xml 也将扩展为包含每次重新运行的信息。
如果测试在第一次运行中通过,则输出 xml 报告将与rerunFailingTestsCount
未使用的情况相同。
如果第一次运行测试失败,那么也有两种可能的情况。
1) 测试在其重新运行之一中通过:
flakyFailure
并且flakyError
元素将用于生成的 xml 报告中,以包含每次失败重新运行的信息。system-out
并且system-err
还将用于每个内部flakyFailure
或flakyError
包含 System.out 和 System.err 输出的信息。原始system-out
和system-err
元素将保留在最后一次成功运行的顶层testcase
。
例如:
<testcase name=".." classname=".." time="0.1"> <flakyFailure message="exception message" type="assertion exception"> <stackTrace>flaky failure stack trace</stackTrace> <system-out> flaky failure System.out log message </system-out> </flakyFailure> <system-out> success </system-out> </testcase>
在 xml 报告中,flaky test 的运行时间将是最后一次成功运行的运行时间。
2) 测试在所有重新运行中均失败:
failure
和error
元素仍将在生成的 xml 报告中使用,以包含第一次失败运行的信息,与不使用rerunFailingTestsCount
. rerunFailure
和rerunError
元素将在生成的 xml 报告中使用,以包含每个后续失败重新运行的信息。system-out
并且system-err
还将用于每个内部flakyFailure
或flakyError
包含 System.out 和 System.err 输出的信息。对于第一次原始失败运行,原始system-out
和system-err
元素将保留在顶层。testcase
例如:
<testcase name=".." classname=".." time="0.1"> <failure message="" type=""> first failure stack trace </failure> <system-out> first failure </system-out> <rerunFailure message="exception message" type="assertion exception"> <stackTrace>rerun failure stack trace</stackTrace> <system-out> rerun failure </system-out> </rerunFailure> </testcase>
在 xml 报告中,重新运行的失败测试的运行时间将是第一次失败运行的运行时间。
在 JUnit Providers 中重新运行执行
提供者surefire-junit4
执行单独的测试类并因此重新运行失败的测试。提供者surefire-junit47
执行所有测试类并在之后重新运行失败的测试。
在 Cucumber JVM 中重新运行执行
从 2.21.0 开始,提供者surefire-junit47
可以重新运行由cucumber-jvm 2.0.0 及更高版本创建的场景。
重新运行并跳过执行
从 2.19.1 开始,您可以一起使用参数skipAfterFailureCount
和rerunFailingTestsCount
。这是由提供者surefire-junit4
和surefire-junit47
. 如果出现错误或失败,您可以再次运行失败的测试并跳过测试集的其余部分skipAfterFailureCount
。请注意,重新运行阶段失败的测试不包含在skipAfterFailureCount
.