【问题标题】:ScalaTest: How to mix parallel and sequential testsScalaTest:如何混合并行和顺序测试
【发布时间】:2022-01-23 17:26:46
【问题描述】:


假设我有 6 个测试套件:A B C D E F,我希望 A B C 顺序运行,THEN 并行运行 D E F。
像这样的输出:

A
B
C // always in that order
E
D
F // The order doesn't matter

我们的想法是能够独立于其他测试来测试 ABC。

我已经尝试过的

像这样创建一个超级顺序测试类,并在顺序测试中添加@DoNotDiscover

class MasterSuite extends Stepwise(
  Sequential(new A, new B, new C)
)

但是,即使 A B C 顺序运行,也会与其他测试并行运行。

我也试过了

class MasterSuite extends Stepwise(
  Sequential(new A, new B, new C),
  Suites(new D, new E, new F)
)

但对我来说,它会按顺序运行我所有的测试(也许我错过了 build.sbt 文件中的某些内容)。

【问题讨论】:

    标签: scala parallel-processing scalatest


    【解决方案1】:

    Stepwise 的文档说明如下:

    Stepwise 和 Sequential 之间的区别在于,尽管 Stepwise 按顺序执行其自己的嵌套套件,它将传递给它的任何分发器传递给那些嵌套套件。因此,如果定义了分发器,则嵌套套件可以并行运行自己的嵌套套件和测试。相比之下,Sequential 总是将分发器的 None 传递给嵌套套件,因此传递给 Sequential 构造器的嵌套套件中包含的所有测试和嵌套套件都将按顺序执行。

    那么显而易见的问题是:什么Distributor 被传递给MasterSuiterunNestedSuites 方法?因为Distributor 最终将传递给包含DEFSuites 对象的runNestedSuites 方法。

    通过调试器的实验,我发现Distributor 通常是None。但是,如果您将 ParallelTestExecution 特征混合到您的 MasterSuite 类中,您将得到一个 Some,而我也在调试器中验证了这一点。

    class MasterSuite extends Stepwise(
      new A,
      new B,
      new C,
      new Suites(new D, new E, new F)) with ParallelTestExecution
    

    现在,MasterSuite 将依次运行ABC,然后开始并行运行其他套件。

    那么,问题解决了吗?不幸的是,没有,因为虽然它显然 开始 运行 DEF,但它并没有等待它们完成并宣布它们一切都成功了——尽管我故意在F 中添加了一个失败的测试以查看一切是否正常。所以据我所知,这就是它应该如何完成的,它只是坏了。

    在多年使用 ScalaTest 的经验之后,我得出了我个人的结论:这是一个漏洞百出的垃圾,我强烈建议远离它。很抱歉,我不能给出比这更乐观的答案了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-09-23
      • 1970-01-01
      • 2015-10-06
      • 2019-06-09
      • 2013-03-23
      • 2013-08-16
      • 2015-02-25
      • 2015-11-28
      相关资源
      最近更新 更多