在单元测试中以编程方式调用Gradle任务图 [英] Programatically invoke a gradle task graph in a unit test

查看:125
本文介绍了在单元测试中以编程方式调用Gradle任务图的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在为Gradle编写自定义插件,并且作为单元测试的一部分,我想调用我的任务,但因为这是执行必备任务的一部分。



不幸的是,实际的插件是一个内部项目,所以我不能确定确切的源代码,但是我已经准备了一个单元测试来演示问题:

 包玩具

导入org.gradle.api.Project
导入org.gradle.testfixtures.ProjectBuilder
import org.junit.Test
$ b $ class ToyTasksTest {

布尔task1Run = false
布尔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()//< ---我需要什么魔法而不是.execute()

断言task2Run == true
assert task1Run == true
}
}

输出为:

 断言失败:

断言task2Run == true
| |
false false

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



另一种方式这样说而不是写作:

  task2.execute()

我想运行相当于:

  gradle task2 

在单元测试中。

解决方案

在我看来,你试图在这里得到的是比单元测试更多的集成测试。 Gradle团队成员过去曾经向我建议,在编写插件和执行任务时,你想要做的就是尽可能多地分离/从你的任务中分离出来,并将其分解为POJO和单元测试。对于Gradle为你做的所有其他事情以及管道工作,比如执行任务图,测试增量任务特性等等,你可能想要进行集成测试,这肯定比较慢,这就是为什么你想尽可能地进行单元测试的原因。 p>

唯一的问题是Gradle目前不提供用于编写​​这些集成测试的工具集。有一个设计规范,但目前你如果您需要的话,仍然需要手工制作解决方案。



您可以看看我使用的这里,但请记住它有一些classpath问题,这就是为什么这一行是必需的。



另一个使用GradleConnector并且我最近发现的解决方案的例子可以找到< a href =https://github.com/bmuschko/gradle-clover-plugin/blob/master/src/integTest/groovy/org/gradle/api/plugins/clover/CloverPluginIntegSpec.groovy#L182>这里 a>。


I am in the process of writing a custom plugin for gradle and as part of the unit testing I would like to invoke my task but in such away as it's prerequisite tasks are executed.

The actual plugin is unfortunately an internal project so I can't sure the exact source, but I have prepared a unit test that demonstrates the problem:

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
    }
}

The output is:

Assertion failed: 

assert task2Run == true
       |        |
       false    false

The project is available on github if you would like to quickly run the test.

Another way of saying this instead of writing:

task2.execute()

I'd like run the equivalent of:

gradle task2

In the unit test.

解决方案

It seems to me that what you are trying to get here is more of an integration test than a unit test. It was suggested to me in the past by Gradle team members that when writing plugins and task what you want to do is to separate as much as you can/makes sense from your task into POJO and unit test that. For everything else that Gradle does for you and the plumbing, like executing task graph, testing incremental task features and so on you probably want to have integration tests which definitely are slower, that's why you want to unit test as much as possible.

The only problem is that Gradle currently doesn't provide a toolset for writing those integration tests. There is a design spec for that but currently you still have to hand craft a solution if you need one.

You can have a look the one that I using here but keep in mind that it has some classpath issues, that's why this line is necessary.

An example of the other solution that is using GradleConnector and that I found recently can be found here.

这篇关于在单元测试中以编程方式调用Gradle任务图的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆