Программно вызывать график задачи gradle в unit test
Я занимаюсь написанием настраиваемого плагина для gradle и как часть модульного тестирования, я хотел бы вызвать свою задачу, но в такой ситуации, когда выполняются необходимые задачи.
Фактический плагин, к сожалению, является внутренним проектом, поэтому я не могу точно указать источник, но я подготовил unit test, который демонстрирует проблему:
package toy
import org.gradle.api.Project
import org.gradle.testfixtures.ProjectBuilder
import org.junit.Test
class ToyTasksTest {
boolean task1Run = false
boolean task2Run = false
@Test
public void taskDependencies(){
Project p = ProjectBuilder.builder().build()
p.task("task1") << {
p.logger.info("task1 running")
task1Run = true
}
def task2 = p.task("task2", dependsOn: 'task1') << {
p.logger.info("task2 running")
task2Run = true
}
task2.execute() // <--- what magic do I need here instead of .execute()
assert task2Run == true
assert task1Run == true
}
}
Вывод:
Assertion failed:
assert task2Run == true
| |
false false
Проект доступен в github, если вы хотите быстро запустить тест.
Другой способ сказать это, а не писать:
task2.execute()
Я бы хотел запустить эквивалент:
gradle task2
В unit test.
Ответы
Ответ 1
Мне кажется, что вы пытаетесь получить здесь больше теста интеграции, чем unit test. Мне было предложено в прошлом члены команды Gradle, что при написании плагинов и задач, что вы хотите сделать, нужно отделить столько, сколько вы можете/имеет смысл от вашей задачи в POJO и unit test, что. Для всего, что Gradle делает для вас и для сантехники, например для выполнения графика задач, тестирования инкрементных функций задачи и т.д., Вы, вероятно, захотите провести интеграционные тесты, которые определенно медленнее, поэтому вы хотите unit test максимально увеличить.
Единственная проблема заключается в том, что Gradle в настоящее время не предоставляет набор инструментов для написания этих тестов интеграции. Для этого есть спецификация дизайна, но в настоящее время вам все равно придется вручную обрабатывать решение, если оно вам нужно.
Вы можете посмотреть, что я использую здесь, но имейте в виду, что у него есть некоторые проблемы с classpath, поэтому эта строка необходима.
Пример другого решения, использующего GradleConnector и которое я нашел недавно, можно найти здесь.
Ответ 2
Luke Daley (Gradle core dev) разработал классную функциональную систему тестирования для моих плагинов Gradle, которые можно использовать здесь.
Подобно ответу @erdi, это решение для функционального тестирования и не использует Gradle ProjectBuilder. Это требует, чтобы вы включили эти классы утилиты для тестирования.
Я понимаю, что это не тот краткий ответ, на который вы могли надеяться, но эта система очень хорошо меня обслуживала, когда я разрабатывал несколько плагинов Gradle.
Ответ 3
Заменить:
task2.execute() // <--- what magic do I need here instead of .execute()
С
task2.actions.each { Action action ->
action.execute(task2)
}
Ответ 4
Я использую этот метод для выполнения задач в тестах:
void executeTask(Task task) {
task.taskDependencies.getDependencies(task).each {
subTask -> executeTask(subTask)
}
task.execute()
}
Пример:
@Test
void testTasksDependency() {
def first = project.task("first").doLast {
println "Doing First"
}
def second = project.task("second", dependsOn: first).doLast {
println "Doing Second"
}
def third = project.task("third", dependsOn: second).doLast {
println "Doing Third"
}
// Let call our method
executeTask(third)
assertTrue(first.state.executed)
assertTrue(second.state.executed)
assertTrue(third.state.executed)
}
Вывод:
Doing First
Doing Second
Doing Third