如何在Groovy中重构代码实现测试任务批量串行+套件并行调度?
重构Groovy代码实现测试分组串行+套件并行
首先,我们需要先统一收集所有测试任务的执行逻辑,再按每3个一组进行分组,最终实现测试套件内部串行执行、套件之间并行运行的效果。重构后的代码如下:
// 1. 先收集所有单个测试的执行闭包 def allTestTasks = [] config.deploymentTargets.each { deploymentName -> config.deploymentTargetsMap[deploymentName][branchName].each { deploymentTargetName -> def testContext = "${stageName}.${deploymentTargetName}" // 将单个测试的执行逻辑存入列表 allTestTasks.add({ stage(testContext) { /* set up one test */ } }) } } // 2. 按每3个测试为一组拆分,不足3个的自动组成最后一组 def testSuites = allTestTasks.collate(3) // 3. 为每个测试套件创建并行任务,套件内部串行执行测试 testSuites.eachWithIndex { suiteTasks, index -> def suiteName = "Test-Suite-${index + 1}" deployments[suiteName] = { stage(suiteName) { // 套件内逐个串行执行测试 suiteTasks.each { task -> task() } } } }
关键逻辑说明:
- 收集测试任务:先遍历所有部署目标,把每个测试的执行逻辑统一存入列表,方便后续分组操作。
- 自动分组:用Groovy自带的
collate(3)方法,一键将测试列表按每3个元素分割成子列表,每个子列表对应一个测试套件;如果总测试数不是3的倍数,最后一组会自动包含剩余的1-2个测试。 - 套件并行+内部串行:每个测试套件作为独立的并行单元存入
deployments,套件内部通过each方法逐个串行执行测试任务,既控制了单批次并行数量,又保证了组内测试的串行顺序。
另外修正了原代码的笔误:将stage( textContext )改为stage(testContext),避免变量名错误。
内容的提问来源于stack exchange,提问作者Graeme Perrow
相关产品推荐
相关产品推荐

