1

我正在使用 Scalatest、FlatSpec、Spring、Selenium DSL 和 BeforeAndAfterAll。其中一件事情似乎会阻止 ParallelTestExecution 正常工作。当我运行一个包含两个测试的类时会发生这种情况:

  1. 一个浏览器打开并执行一些 beforeAll 的东西(但不是 Spring 的东西)
  2. 另一个浏览器打开并执行 beforeAll 的东西
  3. 第二个浏览器用于第一次测试然后关闭
  4. 另一个浏览器打开并执行 beforeAll 内容,然后进行第二次测试
  5. 第一和第三浏览器关闭

所以基本上测试运行与没有 ParallelTestExecution 的情况完全相同,只是打开了一个额外的窗口?

4

1 回答 1

11

我想你可能会观察到两种不同的效果。首先,ParallelTestExecution 扩展了 OneInstancePerTest。它在自己的实例中运行每个测试,以减少测试之间共享可变状态的可能性,从而将并发 Heisenbugs 引入您的测试。但这样做的方式是测试类的初始实例为每个测试创建一个实例,并将这些实例传递给分发器(如果已定义),分发器将并行运行它们。因此,由于您有两个测试,您将获得测试类的三个实例——在主线程上运行的初始实例,以及两个特定于测试的实例,每个测试一个,可以并行运行这些测试。由于您的 beforeAll 和 afterAll 方法具有创建和关闭 Web 浏览器的副作用,因此您会看到该副作用 3 次。

可能发生的另一件事是 ParallelTestExecution 只会在您告诉 ScalaTest 您通常希望并行执行时并行运行测试。如果您使用的是 Runner,则可以通过传入 -P 来完成。否则不会定义分发器,在这种情况下,ParallelTestExecution 只是在主线程(调用 run 的线程)上按顺序执行测试。

ParallelTestExecution 适用于您实际上需要在同一个测试类中并行执行测试的极少数情况。一个例子可能是一个测试类,它有很多非常慢的测试。在大多数情况下,我希望 ScalaTest 并行运行套件的默认方法可以为您提供与并行运行测试一样好的性能提升。要获得这种并行执行,您不需要混合任何特征(即,不需要 ParallelTestExecution)。只需将 -P 传递给 Runner,或告诉 sbt 并行运行 ScalaTest 等。

此外,BeforeAndAfterAll 适用于需要在所有测试和嵌套套件之前和之后发生的事情。如果您希望每个测试都有自己的浏览器,那么您可能希望改用 BeforeAndAfterEach。在 ParallelTestExecution 案例中,这只会弹出两个浏览器,而不是三个。如果您真的希望所有测试共享同一个浏览器,那么我会检查 Selenium 文档以确保这是可能的。可能 Selenium 一次只能让您与给定的 WebBrowser 驱动程序进行一次交互。

总之,如果我猜对了你真正想要完成的事情,我会放弃 ParallelTestExecution,将 BeforeAndAfterAll 更改为 BeforeAndAfterEach(或使用 withFixture),并将 -P 传递给 Runner(直接,通过 ant 或 Maven)或询问 sbt并行运行 ScalaTest。

于 2013-03-31T16:45:42.997 回答