当源文件使用gradle更改源文件时,运行单元测试子集



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

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

gradle任务可以判断如果任务作为增量任务实现,则可以更改哪些文件。Gradle中的测试任务不是增量。幸运的是,可以通过扩展将其转变为一个:

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

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

您可以在build.gradle中使用此任务:

task testWatcher(type: TestWatcher) {
}

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

有关更多信息,您可以看到我写的这篇文章。它显示了如何将其与连续构建支持一起使用以重新运行仅在代码更改时重新运行的测试。本文中的代码可以在GitHub Repo中找到,在该示例中,您还可以在其中找到上述代码。

最新更新