如何让Gradle中的多个Spock Test测试任务实现并行执行
问题原因
你之前添加的--parallel参数默认仅支持多项目构建的跨项目任务并行,单项目内的独立任务并行需要额外配置。同时你当前定义的两个Test任务共享默认的测试输出目录,Gradle检测到输出路径存在冲突也会禁止两个任务并行执行。
配置步骤
- 启用单项目任务并行开关
在项目根目录的gradle.properties文件中添加以下2行配置:
# 开启全局并行执行 org.gradle.parallel=true # 开启单项目内独立任务并行(Gradle 6.8及以上版本支持) org.gradle.parallel.intra-project=true
如果不想修改配置文件,也可以在执行命令时直接附加对应参数:./gradlew cleanTest test1 test2 --info --rerun-tasks --parallel --parallel-intra-project --max-workers=3
- 为两个测试任务配置独立的输出目录
避免输出文件互相覆盖,Gradle只有确认任务之间没有输入输出冲突时才会调度并行执行,修改后的任务定义如下:
def failedTest = 0 // 提前声明你用到的failedTest变量,避免编译报错 task test1(type: Test) { ignoreFailures true testLogging { events 'started', 'passed', 'skipped', 'failed' exceptionFormat "full" showStandardStreams = true afterSuite { desc, result -> if (!desc.parent) { // 匹配最外层测试套件 failedTest += result.failedTestCount } } } include "org/company/project/test/Test1.class" // 单独配置test1的输出目录 reports.junitXml.outputLocation.set(layout.buildDirectory.dir("test-results/test1")) reports.html.outputLocation.set(layout.buildDirectory.dir("reports/tests/test1")) binResultsDir.set(layout.buildDirectory.dir("test-results/binary/test1")) } task test2(type: Test) { ignoreFailures true testLogging { events 'started', 'passed', 'skipped', 'failed' exceptionFormat "full" showStandardStreams = true afterSuite { desc, result -> if (!desc.parent) { // 匹配最外层测试套件 failedTest += result.failedTestCount } } } include "org/company/project/test/Test2.class" // 单独配置test2的输出目录 reports.junitXml.outputLocation.set(layout.buildDirectory.dir("test-results/test2")) reports.html.outputLocation.set(layout.buildDirectory.dir("reports/tests/test2")) binResultsDir.set(layout.buildDirectory.dir("test-results/binary/test2")) }
验证方式
执行测试命令后查看运行日志,若test1未执行完成时就已经打印test2的测试启动日志,即说明并行配置生效。
内容的提问来源于stack exchange,提问作者Joshi
相关产品推荐
相关产品推荐

