gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:31:32 26 4
gpt4 key购买 nike

我使用 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com