使用Gradle更改源文件时运行单元测试的子集

时间:2017-04-21 00:40:39

标签: java unit-testing gradle

我使用gradle 3.5构建系统,并在Java项目中进行了多次单元和集成测试。当我在源文件(sourceSets)中进行更改时,gradle的编译避免和增量编译确保只编译相关的源文件,这是一个巨大的节省时间。但是,所有测试针对sourceSet中的每个更改运行。 gradle可以识别并仅运行单元测试的相关子集而不是全部吗?如果没有,有没有办法实现这个目标?

1 个答案:

答案 0 :(得分:0)

是的,Gradle可以做到这一点,但AFAIK不是开箱即用的。

如果任务是作为Incremental Task实现的,则Gradle任务可以判断哪些文件已被更改。 Gradle中的Test任务不是增量的。幸运的是,通过扩展它很容易把它变成一个:

class TestWatcher extends Test {

    @TaskAction
    void executeTests(IncrementalTaskInputs inputs) {
        if (inputs.incremental) {
            def outputDir = this.project.sourceSets['test'].output.classesDir.absolutePath
            this.filter.includePatterns = []
            inputs.outOfDate { InputFileDetails change ->
                def candidate = change.file.absolutePath
                if (candidate.endsWith('.class')) {
                    candidate = candidate
                            .replace('.class', '')
                            .replace(outputDir, '')
                            .substring(1)
                            .replace(File.separator, '.')
                    this.filter.includePatterns += candidate
                }
            }
        }
        super.executeTests()
    }
}

此任务是增量的(main方法以IncrementalTaskInputs为参数)。如果输入不是增量输入,则只运行原始任务。如果输入是增量的,则迭代更改并设置includePatterns以包括所有类。然后,这将仅运行已更改的测试。

您可以在build.gradle

中使用此任务
task testWatcher(type: TestWatcher) {
}

它接受所有默认测试任务配置。您可以将任务代码直接放在脚本中或buildSrc文件夹下。

有关详细信息,请参阅我写的this article。它显示了如何将此与持续构建支持一起使用,以便在代码更改时仅重新运行已更改的测试。文章中的代码可以在GitHub repo中找到,您可以在自包含的示例中找到上述代码。