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

标签 java unit-testing gradle

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

最佳答案

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

如果任务实现为 Incremental Task,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()
    }
}

这个任务是增量的(main 方法以 IncrementalTask​​Inputs 作为参数)。如果输入不是增量的,它只会运行原始任务。如果输入是增量的,它会遍历更改并设置 includePatterns 以包含所有类。然后,这将仅运行已更改的测试。

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

task testWatcher(type: TestWatcher) {
}

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

更多信息可以看this article我写。它展示了如何将其与持续构建支持结合使用,以便在代码更改时仅重新运行更改的测试。文章中的代码可以在 GitHub repo 中找到,您还可以在独立示例中找到上述代码。

关于java - 使用 Gradle 更改源文件时运行单元测试的子集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43532078/

相关文章:

java - Quartz 调度程序 - 是否可以配置 Quartz 以允许 RAMJobStore 中具有相同标识的作业?

java - @VisibleForTesting() 函数在使用时不会触发生产代码的编译错误

android - Android:更新Android Studio tu 0.8.7后,Gradle错误:找不到com.android.tools.build:gradle:2.0

android - 许多库上的 APK META-INF 中复制的重复文件?

java - 未知/通配符 (?) 方法调用中的通用类型

java - 字符串和数组混合语法以及非常罕见的用法

java - 我们可以在 Spring WS 中使用多个消息工厂吗?

unit-testing - 有没有办法使用 Elixir 中的 Doctest 测试 IO 输出?

ios - 需要有关 iOS 的 BDD 的建议

gradle - 如何使Gradle项目版本对眼睛友好?