多模块下Gradle Wrapper指定test任务与不指定的执行差异及原因
Gradle多模块测试任务执行差异解析
核心区别
两条命令的本质差异在于是否包含根项目的test任务:
- 第一条命令中的
test是根项目层级的任务,在Gradle多模块项目中,根项目的同名任务默认会聚合所有子模块的对应任务——也就是说,执行test时,Gradle会自动触发:module1:test、:module2:test、:module3:test所有子模块的测试任务。 - 第二条命令只明确指定了各个子模块的
test任务,没有触发根项目的聚合任务。
速度差异的原因
第一条命令相当于重复执行了所有子模块的测试:
- 先执行根项目的
test任务,此时已经跑完了所有子模块的测试; - 接着又单独执行
:module1:test、:module2:test、:module3:test,等于把所有测试流程再跑一遍。
两次完整的测试执行加上Gradle的任务调度开销,直接导致总耗时是第二条命令的数倍。即使清理项目缓存,这种重复执行的逻辑也不会改变,因为根项目任务的聚合行为是由Gradle多模块项目的默认规则决定的,和缓存无关。
你可以通过./gradlew test --dry-run验证这一点——执行该命令会列出根项目test任务实际触发的所有子任务,能看到它已经包含了所有子模块的测试任务。
内容的提问来源于stack exchange,提问作者imegorov
相关产品推荐
相关产品推荐

