Про це нещодавно було темою у публікації до блогу 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()
}
Рекомендую прочитати всю публікацію в блозі.