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