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
相关产品推荐
相关产品推荐

