Dies war kürzlich das Thema in Gradles Blog-Post. Hören Sie auf, Ihre Tests erneut auszuführen . Der Autor zeigt ein Beispiel mit outputs.upToDateWhen { false }
und erklärt, warum es falsch ist:
Dies erzwingt keine Wiederholungen
Was der Autor dieses Snippets wahrscheinlich sagen wollte, ist "Meine Tests immer wiederholen". Das ist jedoch nicht das, was dieser Ausschnitt tut. Die Aufgabe wird nur als veraltet markiert, sodass Gradle gezwungen ist , die Ausgabe neu zu erstellen . Wenn der Build-Cache aktiviert ist, muss Gradle die Aufgabe nicht ausführen, um die Ausgabe neu zu erstellen. Es findet einen Eintrag im Cache und entpackt das Ergebnis in das Ausgabeverzeichnis des Tests.
Gleiches gilt für dieses Snippet:
test.dependsOn cleanTest
Gradle entpackt die Testergebnisse aus dem Build-Cache, nachdem die Ausgabe bereinigt wurde, sodass nichts erneut ausgeführt wird. Kurz gesagt, diese Schnipsel erzeugen ein sehr teures No-Op.
Wenn Sie jetzt denken "Okay, ich werde auch den Cache deaktivieren", lassen Sie mich Ihnen sagen, warum Sie nicht sollten.
Anschließend erklärt der Autor, warum das Wiederholen einiger Tests Zeitverschwendung ist:
Die überwiegende Mehrheit Ihrer Tests sollte deterministisch sein, dh bei gleichen Eingaben sollten sie das gleiche Ergebnis liefern.
In den wenigen Fällen, in denen Sie Tests erneut ausführen möchten, bei denen sich der Code nicht geändert hat, sollten Sie sie als Eingabe modellieren. Hier sind beide Beispiele aus dem Blog-Beitrag, die das Hinzufügen einer Eingabe zeigen, damit die Aufgabe diese bei ihren aktuellen Überprüfungen verwendet.
task randomizedTest(type: Test) {
systemProperty "random.testing.seed", new Random().nextInt()
}
task systemIntegrationTest(type: Test) {
inputs.property "integration.date", LocalDate.now()
}
Ich empfehle den gesamten Blog-Beitrag zu lesen.