Spock或Gradle如何设置Spec测试套件的指定执行顺序?
Spock 端配置Spec执行顺序
Spock 2.0及以上版本原生支持测试执行顺序控制,有两种实现方式:
- 注解式配置:给对应角色的Spec类添加
@Order注解,数值越小执行优先级越高。比如administrator相关Spec加@Order(1),developer相关加@Order(2),reporter相关加@Order(3)即可。不需要修改构建配置,仅需在测试类中引入org.spockframework.framework.annotation.Order注解即可。 - 全局规则配置:如果不想逐个类加注解,可自定义Spock全局扩展,实现按包名/类名自动排序的逻辑。在
src/test/resources/META-INF/services/org.spockframework.runtime.extension.IGlobalExtension文件中注册自定义扩展类,重写排序逻辑匹配admin、developer、reporter的包名/类名规则自动分配优先级即可。
Gradle 端调整Spec执行顺序
无需修改测试代码,直接调整构建配置即可实现,替代你当前多次调用test任务的方案:
- 按包含顺序执行:直接在
build.gradle的test任务中按优先级配置include规则,示例配置如下:
test { // 按优先级依次加载对应范围的测试类 include '**/admin/**/*Spec.class' include '**/developer/**/*Spec.class' include '**/reporter/**/*Spec.class' // 其余测试最后执行,不需要可删除该行 include '**/*Spec.class' // 关闭并行执行避免打乱顺序 maxParallelForks = 1 forkEvery = 0 }
- 自定义排序规则:如果需要更灵活的排序逻辑,可直接给test任务添加排序器:
test { sortTests { testClassA, testClassB -> def nameA = testClassA.className def nameB = testClassB.className // admin类优先 if (nameA.contains('Admin') && !nameB.contains('Admin')) return -1 if (!nameA.contains('Admin') && nameB.contains('Admin')) return 1 // developer次之 if (nameA.contains('Developer') && nameB.contains('Reporter')) return -1 if (nameA.contains('Reporter') && nameB.contains('Developer')) return 1 // 其余类默认排序 return 0 } maxParallelForks = 1 }
注意:两种方案都需要关闭测试并行执行,否则多线程调度依然会打乱预设的执行顺序。
内容的提问来源于stack exchange,提问作者Bohdan Nesteruk
相关产品推荐
相关产品推荐

