我如何要求Bazel重新运行缓存测试?

Itt*_*tai 10 bazel

我正在尝试分析并修复一个通常为绿色的片状测试.
我的问题是,一旦测试通过,Bazel不会重新运行它,直到任何输入发生变化.
我看到你可以要求Bazel重新运行一个目标但AFAICT只有在第一次它是绿色时(即减轻一个片状测试而不是解决它).

有没有办法要求Bazel即使通过了测试?
我喜欢类似的东西bazel test --force-attempts=50 //my-package:my-target

Itt*_*tai 23

显然它有一面旗帜:)

https://docs.bazel.build/versions/master/user-manual.html#flag--cache_test_results

--cache_test_results =(是|否|自动)( - t)

如果此选项设置为"auto"(默认值),则Bazel将仅在以下任何条件适用时重新运行测试:

Bazel检测到测试或其依赖关系的变化,测试被标记为请求外部多次测试运行--runs_per_test测试失败.如果'不',所有测试都将无条件执行.

如果为"是",则缓存行为将与auto相同,除非它可以使用--runs_per_test缓存测试失败和测试运行.

请注意,无论是否启用此选项,测试结果始终保存在Bazel的输出树中,因此您无需在之前的bazel测试运行中使用--cache_test_results以获取缓存命中.该选项仅影响Bazel是否将使用以前保存的结果,而不是它是否将保存当前运行的结果.

默认情况下在.bazelrc文件中启用此选项的用户可以找到缩写-t(on)或-t-(off),以便覆盖特定运行的默认值.

  • `--cache_test_results=no` (6认同)

kri*_*ina 9

除了--cache_test_results之外,Bazel实际上还有一个专门用于诊断片状测试的标志:--runs_per_test它将重新运行测试N次并且只保留失败运行的日志:

$ bazel test --runs_per_test=10 :flaker
INFO: Found 1 test target...
FAIL: //:flaker (run 10 of 10) (see /output/testlogs/flaker/test_run_10_of_10.log).
FAIL: //:flaker (run 4 of 10) (see /output/testlogs/flaker/test_run_4_of_10.log).
FAIL: //:flaker (run 5 of 10) (see /output/testlogs/flaker/test_run_5_of_10.log).
FAIL: //:flaker (run 9 of 10) (see /output/testlogs/flaker/test_run_9_of_10.log).
FAIL: //:flaker (run 3 of 10) (see /output/testlogs/flaker/test_run_3_of_10.log).
Target //:flaker up-to-date:
  bazel-bin/flaker
INFO: Elapsed time: 0.828s, Critical Path: 0.42s
//:flaker                                                                FAILED

Executed 1 out of 1 tests: 1 fails locally.
Run Code Online (Sandbox Code Playgroud)

您可以使用它快速找出测试的碎片程度并获得一些失败的日志.

  • 如果你想使用 `--runs_per_test` 但不并行,你可以传递 `--local_test_jobs=1`。 (8认同)
  • “--runs_per_test”的一个问题是 bazel 并行运行测试。如果测试正在访问全局结构(例如文件系统)并且正确的同步不可用,则这可能是不可取的。 (3认同)