如何在Scalatest中标记测试类禁止与其他测试并行执行?
在Scalatest中混合并行与串行测试类的实现方案
方法一:自定义标记+配置文件控制(最接近Xunit的CollectionDefinition)
Scalatest支持通过Tag标记区分测试类,再结合配置文件为不同标记的测试设置并行策略,完美适配单次Runner调用的需求:
给串行测试类添加标记
给依赖全局变量的测试类打上自定义标记,比如SerialOnly:import org.scalatest.flatspec.AnyFlatSpec import org.scalatest.Tag @Tag("SerialOnly") class GlobalStateDependentSpec1 extends AnyFlatSpec { "依赖全局状态的测试1" should "串行执行" in { // 测试逻辑 } } @Tag("SerialOnly") class GlobalStateDependentSpec2 extends AnyFlatSpec { "依赖全局状态的测试2" should "串行执行" in { // 测试逻辑 } }创建Scalatest配置文件
在src/test/resources下新建scalatest.conf,配置全局并行开启,同时指定带SerialOnly标记的测试禁用并行:org.scalatest.parallelExecution = true org.scalatest.tagSpecificParallelExecution = { "SerialOnly" = false }在IntelliJ中配置运行参数
打开测试运行配置,在VM参数中添加:-Dconfig.resource=scalatest.conf运行时所有测试会单次启动,带标记的2个类串行执行,其余8个保持并行。
方法二:嵌套套件分组控制
通过嵌套套件将并行、串行测试类分组,各自控制并行开关,再用总套件统一执行:
import org.scalatest.Suites import org.scalatest.flatspec.AnyFlatSpec // 串行套件:禁用并行 class SerialTestSuite extends Suites( new GlobalStateDependentSpec1, new GlobalStateDependentSpec2 ) { override def parallelExecution: Boolean = false } // 并行套件:启用并行 class ParallelTestSuite extends Suites( new ParallelSpec1, new ParallelSpec2, new ParallelSpec3, // ... 其余5个并行测试类 ) { override def parallelExecution: Boolean = true } // 总套件:统一执行所有测试 class AllTests extends Suites( new ParallelTestSuite, new SerialTestSuite )
直接在IntelliJ中运行AllTests即可,单次调用完成所有测试,子套件各自遵循并行/串行规则。
方法三:命令行参数组合(无需修改代码)
如果不想改动测试代码,可以通过Scalatest的命令行参数组合实现单次调用:
scalatest -P -l SerialOnly -- -n SerialOnly
-P -l SerialOnly:开启全局并行,运行所有不带SerialOnly标记的测试-- -n SerialOnly:运行带SerialOnly标记的测试(默认串行,未加-P参数)
内容的提问来源于stack exchange,提问作者mabead
相关产品推荐
相关产品推荐

