Scalatest - 并行套件

Posted

技术标签:

【中文标题】Scalatest - 并行套件【英文标题】:Scalatest - Suite in parallel 【发布时间】:2020-12-20 07:13:47 【问题描述】:

我正在使用一个套件(Scalatest 版本:3.2.2),其中包含多个测试套件:

class SuiteMixedSequentialParallel
    extends Stepwise(
      new TestInParallel,
      new TestSequentially
    )

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

因此我从ParallelTestExecution扩展TestInParallel

class TestInParallel extends AnyFunSuite with ParallelTestExecution 
  (0 to 10).foreach(i =>
    test(s"$i") 
      Thread.sleep(500)
      println(s"TestInParallel $i")
    
  )

class TestSequentially extends AnyFunSuite 
  (0 to 10).foreach(i =>
    test(s"$i") 
      Thread.sleep(200)
      println(s"TestSequentially $i")
    
  )

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

当我运行SuiteMixedSequentialParallel 时,是否有人提示我在TestInParallel 中的测试将并行运行?

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

【问题讨论】:

旁注:如果您想要Ints 的范围,您可以使用List.range(0, 10)(第一个数字包含在内,最后一个数字不包含在内)。 谢谢!很好的提示。嗯,现在我渴望相应地更改示例中的代码。但是,您的评论将不再有意义。所以,我让List.tabulate(10)(identity)照原样。 顺便说一句,更简单的可能是for (i <- 0 to 10) test(...) 。无需编辑您的代码。或者,评论你编辑它并编辑它,任何阅读 cmets 的人都会理解。 :) 在此 cmets 的帮助下编辑了代码示例,使示例更简洁。 【参考方案1】:

来自Stepwise documentation:

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

来自ParallelTestExecution documentation:

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

因此,当您将上述两者结合起来时,您会阻止 scalatest 并行运行,这样即使 TestInParallel 也会按顺序运行。

为了解决这个问题,你需要将ParallelTestExecution trait 混入SuiteMixedSequentialParallel,意思是:

class SuiteMixedSequentialParallel
  extends Stepwise(
    new TestInParallel,
    new TestSequentially
) with ParallelTestExecution

这将并行运行两个套件,TestInParallel 中的测试并行运行,TestSequentially 中的测试依次运行。随心所欲。

为了验证这一点,我将printlnHallo Welt 分别更改为TestInParallelTestSequentially

我得到的输出是:

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

【讨论】:

感谢您的回答! ;-) 不幸的是,我的问题并不像我应该做的那样精确。我想要实现的是,套件TestInParallelTestSequentially 按顺序运行。只是套件TestInParallel 中的测试应该并行运行。当然,在我的项目中,我确实有更多的套件。我只是想要其中一些并行运行它的测试。我将编辑我的问题,以便更清楚。再次感谢您的回答。知道它仍然非常有用。 您为什么希望您的测试按顺序运行? 因为某些套件会更改数据库中的状态并相互损坏。 我不确定这是否可行,因为TestInParallel 扩展了OneInstancePerTest,它创建了一个新的测试套件,然后 SuiteMixedSequentialParallel 依次运行测试。你为什么写SuiteMixedSequentialParallelsbt test 可以为您解决问题吗?相同的代码将提供您正在寻找的内容 我的设置可能有点奇怪,但我确实有一个重写的 Stepwise 类,我在其中重写了 def run 方法。我确实需要与“测试报告系统”(对 XRay Jira)进行通信。每次测试运行都需要创建一个新的“测试执行”(xray)(返回唯一的“测试执行 id”)。所有测试都将其测试结果报告给这个“测试执行”(具有给定的 id)。总结一下:我使用“父亲”套件来处理与报告系统的通信。

以上是关于Scalatest - 并行套件的主要内容,如果未能解决你的问题,请参考以下文章

并行运行 ScalaTest 测试

如何在 ScalaTest / SBT 中按顺序运行测试套件?

如何执行单个嵌套的 ScalaTest Suite?

如何让测试在 Scalatest 中始终以相同的顺序运行?

使用 ScalaTest 和 SBT android-sdk-plugin

如何使用 SBT Jenkins 插件运行特定测试以进行 ScalaTest 测试