编程方式调用的gradle一个任务图中一个单元测试(Programmatically invoke

2019-09-01 07:44发布

我在写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

该项目可在github上 ,如果你想快速运行测试。

说这句话的,而不是写作的另一种方式:

task2.execute()

我想运行相当于:

gradle task2

在单元测试。

Answer 1:

在我看来,那是你正在试图让这里更是一个集成测试比单元测试。 有人建议我在过去的摇篮团队成员从任务到POJO和单元测试,当你想要做什么编写插件和任务是尽可能多,你可以分开/很有意义。 对于其他一切摇篮确实为你和管道,像执行任务图,测试增量任务的功能等等,你可能希望有集成测试,这肯定是慢,这就是为什么要进行单元测试尽可能。

唯一的问题是,目前摇篮不写那些集成测试提供了一个工具集。 有一个针对设计规范 ,但目前你还是要手工工艺的解决方案,如果你需要一个。

你可以看看,我使用一个在这里 ,但是请记住,它有一些类路径的问题,这就是为什么这条线是必要的。

我发现最近正在使用GradleConnector其他溶液和这样的例子可以发现在这里 。



Answer 2:

卢克·戴利(摇篮核心开发)开发一个很酷的功能测试系统为我的摇篮插件,使用见过这里 。

类似@ ERDI的答案,这是一个功能测试解决方案,并且不使用摇篮的ProjectBuilder的。 它需要你有这些实用类进行测试。

我知道这不是你可能希望简洁的答案,但是这个系统一直担任我非常好,而我开发了几个摇篮插件。



Answer 3:

更换:

task2.execute() // <--- what magic do I need here instead of .execute()

附:

task2.actions.each { Action action ->
     action.execute(task2)
}


Answer 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's call our method
    executeTask(third)

    assertTrue(first.state.executed)
    assertTrue(second.state.executed)
    assertTrue(third.state.executed)
}

输出:

Doing First
Doing Second
Doing Third


文章来源: Programmatically invoke a gradle task graph in a unit test