我正在为gradle编写自定义插件,作为单元测试的一部分,我想调用我的任务,但在此之前执行必备任务。
实际的插件很遗憾是一个内部项目,所以我无法确定确切的来源,但我准备了一个单元测试来证明问题:
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
如果您想快速运行测试,项目为available on github。
另一种说法而不是写作:
task2.execute()
我想运行相当于:
gradle task2
在单元测试中。
答案 0 :(得分:7)
在我看来,你想要获得的更多的是集成测试,而不是单元测试。 Gradle团队成员过去曾向我建议,在编写插件和任务时,您要做的就是尽可能多地将您的任务分离到POJO和单元测试中。对于Gradle为您和管道工作所做的其他事情,比如执行任务图,测试增量任务功能等等,您可能希望进行明确较慢的集成测试,这就是您希望尽可能进行单元测试的原因。
唯一的问题是Gradle目前没有提供用于编写这些集成测试的工具集。有一个design spec for that但是如果你需要的话,你现在还需要手工制作解决方案。
您可以查看我使用here的那个,但请记住它有一些类路径问题,这就是为什么this line是必要的。
使用GradleConnector的另一个解决方案示例,我最近找到了here。
答案 1 :(得分:2)
Luke Daley(Gradle core dev)为我的Gradle插件开发了一个很酷的功能测试系统,在使用here中看到了。
与@ erdi的答案类似,这是一个功能测试解决方案,不使用Gradle的ProjectBuilder。它要求您包含these utility classes进行测试。
我意识到这不是你可能希望的简洁答案,但是当我开发一些Gradle插件时,这个系统对我很有帮助。
答案 2 :(得分:0)
替换:
task2.execute() // <--- what magic do I need here instead of .execute()
使用:
task2.actions.each { Action action ->
action.execute(task2)
}
答案 3 :(得分:0)
我使用此方法在测试中执行任务:
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's call our method
executeTask(third)
assertTrue(first.state.executed)
assertTrue(second.state.executed)
assertTrue(third.state.executed)
}
Doing First
Doing Second
Doing Third