成績スクリプトを設定しました。 Gradleビルドを実行すると、すべてが機能し、jUnitテストが実行されます。
その後、Gradleテストを実行すると、次の結果が得られます。
C:\Users\..\..\Project>gradle test
:compileJava UP-TO-DATE
:processResources UP-TO-DATE
:classes UP-TO-DATE
:compileTestJava UP-TO-DATE
:processTestResources UP-TO-DATE
:testClasses UP-TO-DATE
:test UP-TO-DATE
gradle clean
を実行すると、もちろんGradleビルドが動作します...プロジェクト全体をビルドするのではなく、テストのみをリセットできるようにしたいのですが、どうすればよいですか?
1つのオプションは、 コマンドライン で--rerun-tasks
フラグを使用することです。これにより、すべてのテストタスクとそれが依存するすべてのタスクが再実行されます。
テストの再実行のみに関心がある場合、別のオプションは、テストを実行する前にgradleがテスト結果をクリーンにすることです。これは、cleanTest
タスクを使用して実行できます。
いくつかの背景-Javaプラグインは、他の各タスクにクリーンタスクを定義します。 ドキュメント によると:
cleanTaskName-指定されたタスクによって作成されたファイルを削除します。 cleanJarはjarタスクによって作成されたJARファイルを削除し、cleanTestはテストタスクによって作成されたテスト結果を削除します。
したがって、テストを再実行するために必要なのは、cleanTest
タスクも実行することです。gradle cleanTest test
他のオプションは、build.gradleに以下を追加することです。
test.outputs.upToDateWhen {false}
gradle test --rerun-tasks
タスクの最適化が無視されることを指定します。
ソース: https://gradle.org/docs/current/userguide/gradle_command_line.html
コマンドラインを変更したくない場合に備えて、「build.gradle」ファイルを使用したソリューションを次に示します。
test {
dependsOn 'cleanTest'
//Your previous task details (if any)
}
そして、これが出力です。前の出力からの2つの変更に注意してください。
1)新しい「cleanTest」タスクが出力に表示されます。
2) 'test'は常に消去される(つまり、 'UP-TO-DATE'ではない)ため、毎回実行されます:
$ gradle build
:compileJava UP-TO-DATE
:processResources UP-TO-DATE
:classes UP-TO-DATE
:findMainClass
:jar
:bootRepackage
:assemble
:cleanTest
:compileTestJava UP-TO-DATE
:processTestResources UP-TO-DATE
:testClasses UP-TO-DATE
:test
:check
:build
これは最近Gradleのブログ投稿のトピックでした テストの再実行を停止します 。 author は、outputs.upToDateWhen { false }
を使用した例を示し、それが間違っている理由を説明しています。
これは実際には再実行を強制しません
このスニペットの作成者がおそらく言いたいのは、「常にテストを再実行する」ことです。しかし、このスニペットはそうではありません。 Gradleに出力をrecreateに強制するだけで、古いタスクのみをマークします。ただし、ビルドキャッシュが有効になっている場合、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()
}
ブログ記事全体を読むことをお勧めします。
また、--rerun-tasks
を追加することは本当に冗長です。決して起こらない。 --no-rerun-tasks
を作成し、cleanTask
のときに--rerun-tasks
をデフォルトにします