使用FlatSpec,Selenium DSL和Spring进行ParallelTestExecution

时间:2013-03-31 12:39:06

标签: selenium scalatest

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

  1. 一个浏览器打开并执行一些之前的所有内容(但不是Spring的内容)
  2. 另一个浏览器打开并执行beforeAll stuff
  3. 第二个浏览器用于第一次测试然后关闭
  4. 另一个浏览器打开并执行所有内容后再进行第二次测试
  5. 第一个和第三个浏览器关闭
  6. 所以基本上测试运行与没有ParallelTestExecution完全相同,只是打开了一个额外的窗口?

1 个答案:

答案 0 :(得分:10)

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

可能发生的另一件事是,如果你告诉ScalaTest你想要一般的并行执行,ParallelTestExecution只会并行运行测试。如果您正在使用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。