To był ostatnio temat na blogu Gradle'a Przestań ponownie uruchamiać swoje testy . Autor przedstawia przykład korzystania outputs.upToDateWhen { false }
i wyjaśnia, dlaczego jest źle:
To faktycznie nie wymusza powtórek
To, co prawdopodobnie chciał powiedzieć autor tego fragmentu, to „Zawsze powtarzaj moje testy”. Ale to nie jest to, co robi ten fragment. Będzie tylko oznaczać zadanie jako nieaktualne, zmuszając Gradle do ponownego utworzenia wyniku. Ale w tym rzecz, jeśli pamięć podręczna kompilacji jest włączona, Gradle nie musi uruchamiać zadania, aby odtworzyć dane wyjściowe. Znajdzie wpis w pamięci podręcznej i rozpakuje wynik do katalogu wyjściowego testu.
To samo dotyczy tego fragmentu:
test.dependsOn cleanTest
Gradle rozpakuje wyniki testu z pamięci podręcznej kompilacji po wyczyszczeniu danych wyjściowych, więc nic nie zostanie ponownie uruchomione. Krótko mówiąc, te fragmenty tworzą bardzo kosztowny brak działania.
Jeśli teraz myślisz „OK, dezaktywuję też pamięć podręczną”, powiem ci, dlaczego nie powinieneś.
Następnie autor wyjaśnia, dlaczego ponowne przeprowadzenie niektórych testów jest stratą czasu:
Zdecydowana większość testów powinna być deterministyczna, tj. Biorąc pod uwagę te same dane wejściowe, powinny one dawać ten sam wynik.
W kilku przypadkach, w których chcesz ponownie uruchomić testy, w których kod nie uległ zmianie, powinieneś zamodelować je jako dane wejściowe. Oto oba przykłady z wpisu na blogu, które pokazują dodawanie danych wejściowych, aby zadanie użyło ich podczas sprawdzania aktualności.
task randomizedTest(type: Test) {
systemProperty "random.testing.seed", new Random().nextInt()
}
task systemIntegrationTest(type: Test) {
inputs.property "integration.date", LocalDate.now()
}
Polecam przeczytanie całego wpisu na blogu.