これは最近、Gradleのブログ投稿「テストの再実行を停止する」のトピックでした。著者は、使用例を示しoutputs.upToDateWhen { false }
、それは間違っている理由を説明します。
これは実際には再実行を強制しません
このスニペットの作成者がおそらく言いたかったのは、「常にテストを再実行する」です。しかし、このスニペットはそうではありません。これは、タスクに古いマークを付けるだけで、Gradleに出力を再作成させます。しかし、ビルドキャッシュが有効になっている場合、Gradleは出力を再作成するためにタスクを実行する必要はありません。キャッシュ内のエントリを見つけ、結果をテストの出力ディレクトリに解凍します。
このスニペットについても同様です。
test.dependsOn cleanTest
Gradleは、出力がクリーンアップされた後にビルドキャッシュからテスト結果をアンパックするため、何も再実行されません。要するに、これらのスニペットは非常に高価なノーオペレーションを作成しています。
「さあ、私もキャッシュを非アクティブ化します」と考えているなら、そうすべきでない理由を教えてください。
その後、著者はさらに、いくつかのテストを再実行することが時間の無駄である理由を説明します。
テストの大部分は確定的である必要があります。つまり、同じ入力が与えられた場合、同じ結果が得られるはずです。
コードが変更されていない場所でテストを再実行したい場合は、それらを入力としてモデル化する必要があります。以下は、ブログの投稿の例で、入力を追加してタスクを最新のチェック中に使用できるようにする例を示しています。
task randomizedTest(type: Test) {
systemProperty "random.testing.seed", new Random().nextInt()
}
task systemIntegrationTest(type: Test) {
inputs.property "integration.date", LocalDate.now()
}
ブログ投稿全体を読むことをお勧めします。