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
中的测试将并行运行?
套件TestInParallel
和TestSequentially
仍应按顺序运行。只是 TestInParallel
中的测试应该并行运行。
【问题讨论】:
旁注:如果您想要Int
s 的范围,您可以使用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
中的测试依次运行。随心所欲。
为了验证这一点,我将println
从Hallo 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
【讨论】:
感谢您的回答! ;-) 不幸的是,我的问题并不像我应该做的那样精确。我想要实现的是,套件TestInParallel
和TestSequentially
按顺序运行。只是套件TestInParallel
中的测试应该并行运行。当然,在我的项目中,我确实有更多的套件。我只是想要其中一些并行运行它的测试。我将编辑我的问题,以便更清楚。再次感谢您的回答。知道它仍然非常有用。
您为什么希望您的测试按顺序运行?
因为某些套件会更改数据库中的状态并相互损坏。
我不确定这是否可行,因为TestInParallel
扩展了OneInstancePerTest
,它创建了一个新的测试套件,然后 SuiteMixedSequentialParallel 依次运行测试。你为什么写SuiteMixedSequentialParallel
? sbt test
可以为您解决问题吗?相同的代码将提供您正在寻找的内容
我的设置可能有点奇怪,但我确实有一个重写的 Stepwise 类,我在其中重写了 def run
方法。我确实需要与“测试报告系统”(对 XRay Jira)进行通信。每次测试运行都需要创建一个新的“测试执行”(xray)(返回唯一的“测试执行 id”)。所有测试都将其测试结果报告给这个“测试执行”(具有给定的 id)。总结一下:我使用“父亲”套件来处理与报告系统的通信。以上是关于Scalatest - 并行套件的主要内容,如果未能解决你的问题,请参考以下文章
如何在 ScalaTest / SBT 中按顺序运行测试套件?