Scalatest - 并行套件

gun*_*gun 6 parallel-processing scala scalatest

我正在使用一个套件(Scalatest-版本:3.2.2),其中有几个 TestSuites:

class SuiteMixedSequentialParallel
    extends Stepwise(
      new TestInParallel,
      new TestSequentially
    )
Run Code Online (Sandbox Code Playgroud)

现在,我希望所有测试都TestInParallel应该并行执行,所有测试都TestSequentially应该顺序执行。

因此我TestInParallelParallelTestExecution

class TestInParallel extends AnyFunSuite with ParallelTestExecution {
  (0 to 10).foreach(i =>
    test(s"$i") {
      Thread.sleep(500)
      println(s"TestInParallel $i")
    }
  )
}
Run Code Online (Sandbox Code Playgroud)
class TestSequentially extends AnyFunSuite {
  (0 to 10).foreach(i =>
    test(s"$i") {
      Thread.sleep(200)
      println(s"TestSequentially $i")
    }
  )
}
Run Code Online (Sandbox Code Playgroud)

当我运行时sbt testOnly TestInParallel,所有测试都是并行执行的。但是:当我运行时sbt testOnly SuiteMixedSequentialParallel,所有测试都会按顺序执行。

有没有人有提示,如何实现, TestInParallel当我运行时,我的测试将并行运行SuiteMixedSequentialParallel

套件TestInParallelTestSequentially仍应按顺序运行。只是测试TestInParallel应该并行运行。

Tom*_*tah 3

来自逐步文档

执行StepsSuite时,无论是否传递Distributor,都会按照传递的顺序依次执行其嵌套套件:Step1Suite、Step2Suite、Step3Suite、Step4Suite和Step5Suite。

来自ParallelTestExecution 文档

ScalaTest 并行运行测试套件的常规方法是并行运行不同的套件,但按顺序运行任何一个套件的测试。

因此,当您将上述两者结合起来时,您会阻止 scalatest 并行运行,从而使 EvenTestInParallel顺序运行。

为了解决这个问题,您需要将ParallelTestExecution特征混合到 中SuiteMixedSequentialParallel,意思是:

class SuiteMixedSequentialParallel
  extends Stepwise(
    new TestInParallel,
    new TestSequentially
) with ParallelTestExecution
Run Code Online (Sandbox Code Playgroud)

这将并行运行两个套件,TestInParallel并行运行测试,并按顺序运行 中的测试TestSequentially。如预期的。

为了验证这一点,我分别将printlnfromHallo Welt改为TestInParallel, 和TestSequentially

我得到的输出是:

TestInParallel 8
TestInParallel 4
TestInParallel 0
TestInParallel 7
TestInParallel 5
TestInParallel 3
TestSequentially 0
TestInParallel 2
TestInParallel 1
TestInParallel 9
TestInParallel 6
TestSequentially 1
TestSequentially 2
TestSequentially 3
TestSequentially 4
TestSequentially 5
TestSequentially 6
TestSequentially 7
TestSequentially 8
TestSequentially 9
Run Code Online (Sandbox Code Playgroud)