ScalaTest:如何混合并行和顺序测试

Bas*_*que 7 parallel-processing scala scalatest


假设我有 6 个测试套件:ABCDEF,我希望 ABC 顺序运行,然后并行运行 DEF。
输出如下:

A
B
C // always in that order
E
D
F // The order doesn't matter
Run Code Online (Sandbox Code Playgroud)

这个想法是能够独立于其余测试来测试 ABC。

我已经尝试过的

创建一个像这样的超级顺序测试类并添加@DoNotDiscover顺序测试。

A
B
C // always in that order
E
D
F // The order doesn't matter
Run Code Online (Sandbox Code Playgroud)

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

我也尝试过

class MasterSuite extends Stepwise(
  Sequential(new A, new B, new C)
)
Run Code Online (Sandbox Code Playgroud)

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

Mat*_*ndt 3

的文档Stepwise说明如下:

\n
\n

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

\n
\n

所以显而易见的问题是:Distributor传递给 的runNestedSuites方法的是什么MasterSuite?因为这Distributor就是最终要传递给包含、和的对象runNestedSuites的方法的内容。SuitesDEF

\n

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

\n
class MasterSuite extends Stepwise(\n  new A,\n  new B,\n  new C,\n  new Suites(new D, new E, new F)) with ParallelTestExecution\n
Run Code Online (Sandbox Code Playgroud)\n

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

\n

那么,问题解决了吗?不幸的是,没有,因为虽然它显然开始运行DE并且F并行地运行,但它没有等待它们完成只是声明它们全部成功 \xe2\x80\x93 即使我故意添加了一个失败的测试来F查看是否一切正常正确。据我所知,这就是它应该完成的方式,但它只是被破坏了。

\n

经过多年的 ScalaTest 经验,我得出了个人结论:它是一个充满 bug 的垃圾,我强烈建议远离它。很抱歉我无法给出比这更乐观的答案。

\n