我使用 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 方法以 IncrementalTaskInputs
作为参数)。如果输入不是增量的,它只会运行原始任务。如果输入是增量的,它会遍历更改并设置 includePatterns
以包含所有类。然后,这将仅运行已更改的测试。
您可以在您的 build.gradle
中使用此任务:
task testWatcher(type: TestWatcher) {
}
它接受所有默认的测试任务配置。您可以将任务代码直接放在脚本中或放在 buildSrc
文件夹下。
更多信息可以看this article我写。它展示了如何将其与持续构建支持结合使用,以便在代码更改时仅重新运行更改的测试。文章中的代码可以在 GitHub repo 中找到,您还可以在独立示例中找到上述代码。
关于java - 使用 Gradle 更改源文件时运行单元测试的子集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43532078/