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

SBT中用正则表达式选择测试用例以拆分CI并行任务

解决SBT集成测试按类名首字母拆分并行任务的问题

由于SBT的testOnly仅支持*通配符,不支持正则表达式的字符范围匹配,你可以通过枚举首字母通配符组合的方式,模拟实现按类名首字母范围拆分测试任务的需求,同时可以在build.sbt中定义自定义任务简化CI调用。

方法1:直接使用多通配符模式调用testOnly

针对四个分组,直接在CI命令中使用多个通配符模式(空格分隔):

  • 运行A-D开头的测试:
    sbt "it:testOnly *.[A]*Spec *.[B]*Spec *.[C]*Spec *.[D]*Spec"
    
  • 运行E-H开头的测试:
    sbt "it:testOnly *.[E]*Spec *.[F]*Spec *.[G]*Spec *.[H]*Spec"
    
  • 运行I-O开头的测试:
    sbt "it:testOnly *.[I]*Spec *.[J]*Spec *.[K]*Spec *.[L]*Spec *.[M]*Spec *.[N]*Spec *.[O]*Spec"
    
  • 运行P-Z开头的测试:
    sbt "it:testOnly *.[P]*Spec *.[Q]*Spec *.[R]*Spec *.[S]*Spec *.[T]*Spec *.[U]*Spec *.[V]*Spec *.[W]*Spec *.[X]*Spec *.[Y]*Spec *.[Z]*Spec"
    

方法2:在build.sbt中定义自定义任务

为了避免CI命令过长,可在项目的build.sbt中定义对应分组的自定义任务,后续CI直接调用任务名称即可:

// 确保集成测试配置已正确定义
lazy val IntegrationTest = config("it") extend Test

// 定义A-D分组测试任务
lazy val itTestAtoD = taskKey[Unit]("Run integration tests with class names starting from A to D")
itTestAtoD := (testOnly in IntegrationTest).toTask(" *.[A]*Spec *.[B]*Spec *.[C]*Spec *.[D]*Spec").value

// 定义E-H分组测试任务
lazy val itTestEtoH = taskKey[Unit]("Run integration tests with class names starting from E to H")
itTestEtoH := (testOnly in IntegrationTest).toTask(" *.[E]*Spec *.[F]*Spec *.[G]*Spec *.[H]*Spec").value

// 定义I-O分组测试任务
lazy val itTestItoO = taskKey[Unit]("Run integration tests with class names starting from I to O")
itTestItoO := (testOnly in IntegrationTest).toTask(" *.[I]*Spec *.[J]*Spec *.[K]*Spec *.[L]*Spec *.[M]*Spec *.[N]*Spec *.[O]*Spec").value

// 定义P-Z分组测试任务
lazy val itTestPtoZ = taskKey[Unit]("Run integration tests with class names starting from P to Z")
itTestPtoZ := (testOnly in IntegrationTest).toTask(" *.[P]*Spec *.[Q]*Spec *.[R]*Spec *.[S]*Spec *.[T]*Spec *.[U]*Spec *.[V]*Spec *.[W]*Spec *.[X]*Spec *.[Y]*Spec *.[Z]*Spec").value

之后CI中只需分别执行以下命令即可并行运行测试:

sbt itTestAtoD
sbt itTestEtoH
sbt itTestItoO
sbt itTestPtoZ

原理说明

SBT的testOnly支持同时传入多个匹配模式,每个模式用空格分隔,只要测试类名匹配任意一个模式就会被执行。通过枚举首字母对应的通配符模式,就能实现和正则.*\.[A-D].*Spec等价的筛选效果。

内容的提问来源于stack exchange,提问作者KrzyH

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 04:32:31