私はしばしばグリーンなフレークテストを分析して修正しようとしています。
私の問題は、テストに合格すると、入力のいずれかが変更されるまでBazelが再実行しないことです。
私はあなたがターゲットを再実行するようにバゼルに頼むことができるのを見ましたが、それが最初に緑色になるまでのみです(すなわち、不安定なテストを軽減してそれを解決しないためです)。
合格してもテストを実行するようにBazelに依頼する方法はありますか?bazel test --force-attempts=50 //my-package:my-target
--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.
これを使用して、テストの不安定さをすばやく把握し、失敗したログを取得できます。
どうやらそれにフラグがあります:)
https://docs.bazel.build/versions/master/user-manual.html#flag--cache_test_results
--cache_test_results =(yes | no | auto)(-t)
このオプションが 'auto'(デフォルト)に設定されている場合、Bazelは次の条件のいずれかに該当する場合にのみテストを再実行します。
Bazelは、テストの変更またはテストの依存関係を検出します。テストは、-runs_per_testを使用して外部の複数のテスト実行が要求されたため、テストは失敗しました。 「いいえ」の場合、すべてのテストが無条件に実行されます。
「yes」の場合、キャッシュの動作はautoと同じですが、テストの失敗と--runs_per_testを使用したテストの実行がキャッシュされる場合があります。
このオプションが有効になっているかどうかに関係なく、テスト結果は常にBazelの出力ツリーに保存されるので、キャッシュヒットを取得するために以前のBazelテストの実行で--cache_test_resultsを使用する必要はありません。このオプションは、Bazelが以前に保存した結果を使用するかどうかにのみ影響し、現在の実行の結果を保存するかどうかには影響しません。
.bazelrcファイルでデフォルトでこのオプションを有効にしているユーザーは、特定の実行でデフォルトを上書きするのに、省略形-t(on)または-t-(off)を使用すると便利です。