在 GitHub 上叉我

重新运行失败的测试

在开发过程中,您可能会重新运行失败的测试,因为它们很不稳定。要通过 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还将用于每个内部flakyFailureflakyError包含 System.out 和 System.err 输出的信息。原始system-outsystem-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) 测试在所有重新运行中均失败:

failureerror元素仍将在生成的 xml 报告中使用,以包含第一次失败运行的信息,与不使用rerunFailingTestsCount. rerunFailurererunError元素将在生成的 xml 报告中使用,以包含每个后续失败重新运行的信息。system-out并且system-err还将用于每个内部flakyFailureflakyError包含 System.out 和 System.err 输出的信息。对于第一次原始失败运行,原始system-outsystem-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 开始,您可以一起使用参数skipAfterFailureCountrerunFailingTestsCount。这是由提供者surefire-junit4surefire-junit47. 如果出现错误或失败,您可以再次运行失败的测试并跳过测试集的其余部分skipAfterFailureCount。请注意,重新运行阶段失败的测试不包含在skipAfterFailureCount.