Gradle:如何将--tests过滤器传递给链式Test任务
解决方法
方案1:修改聚合任务为普通任务,传递命令行测试过滤器
将原有的runIntegrationTest从Test类型改为普通任务,在配置阶段读取命令行传入的--tests参数,手动应用到所有平台测试任务上:
ext.createRunIntegrationTestsTask = { String taskName , String buildPlatform -> return project.tasks.create(taskName, Test.class) { dependsOn buildPlatform // 保留原有其他配置 } } def Platforms = ["A", "B"] def platformTestTasks = [] for (platform in Platforms) { def taskName = "runIntegrationTestsPlatform$platform" println "Creating task: $taskName" def testTask = createRunIntegrationTestsTask(taskName, "buildPlatform$platform") platformTestTasks.add(testTask) } // 修改聚合任务为普通任务,仅负责触发平台测试任务 task runIntegrationTest { dependsOn platformTestTasks doFirst { def testFilter = project.gradle.startParameter.testFilter if (testFilter != null && !testFilter.testPatterns.isEmpty()) { platformTestTasks.each { task -> task.testFilter = testFilter } } } }
方案2:让平台测试任务继承主任务的测试配置(保留主任务为Test类型)
如果希望保留runIntegrationTest的Test类型,可让它不执行实际测试,同时让平台测试任务的测试过滤规则与主任务关联:
ext.createRunIntegrationTestsTask = { String taskName , String buildPlatform, Test masterTestTask -> return project.tasks.create(taskName, Test.class) { dependsOn buildPlatform // 直接继承主任务的测试过滤规则 tests = masterTestTask.tests // 保留原有其他配置 } } def Platforms = ["A", "B"] // 先创建主测试任务,设置为空执行规则避免自身跑测试 task runIntegrationTest(type: Test) { include 'invalid/path/**' } for (platform in Platforms) { def taskName = "runIntegrationTestsPlatform$platform" println "Creating task: $taskName" createRunIntegrationTestsTask(taskName, "buildPlatform$platform", runIntegrationTest) } // 主任务依赖所有平台测试任务 runIntegrationTest.dependsOn Platforms.collect { "runIntegrationTestsPlatform$it" }
原理说明
- Gradle的
--tests参数默认仅作用于直接指定的任务,不会自动传递给依赖任务。 - 方案1通过读取
project.gradle.startParameter.testFilter获取命令行的过滤规则,手动同步到所有平台测试任务。 - 方案2通过让平台测试任务的
tests属性直接引用主任务的配置,实现过滤规则的继承,主任务通过无效路径配置避免自身执行测试。
执行命令保持不变:
gradlew :runIntegrationTest --tests "com.somestuff.methodTest"
内容的提问来源于stack exchange,提问作者asdf
相关产品推荐
相关产品推荐

