You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 00:24:03