每次测试后调用ScalaTest afterAll()

时间:2014-01-15 09:13:00

标签: scala scalatest

TLDR;在同时混合BeforeAndAfterAllParallelTestExecution的ScalaTest规范中,afterAll()在每次测试后被调用,然后在所有测试之后再次调用。我只想要毕竟的行为。

我有一个像这样的ScalaTest规范:

class TestSpec extends fixture.FunSpec with ShouldMatchers with BeforeAndAfter with BeforeAndAfterAll with ParallelTestExecution {
   override def afterAll() = {
      println("afterAll")
   }

   describe("something") {
      it("should foo") {
         println("foo")
      }

      it("should bar") {
         println("bar")
      }
   }
}

两个测试想要共享一个夹具,然后afterAll()应该清理夹具。我已经省略了夹具代码的细节,因为这个问题并不重要。

这是我测试的输出:

foo
afterAll
bar
afterAll
afterAll

所以在每次测试后调用afterAll(),然后在所有测试之后再调用afterAll()。我只想在所有测试后调用它。

有谁知道为什么ParallelTestExecution表现得像这样?

更新

如果我不混合foo bar afterAll ,我的测试表现正常:

ParallelTestExecution

不幸的是,我实际上想要{{1}}。有没有办法让我的蛋糕也吃掉它?

2 个答案:

答案 0 :(得分:3)

从马的口中:https://stackoverflow.com/a/15731847/89509

基本上每个测试用例都将作为自己的实例运行,每次调用afterAll一次。

答案 1 :(得分:3)

这是一种正常行为,因为为了降低并发冲突和错误的风险,ParallelTestExecution在其自己的Test类实例中运行每个测试。每个测试都将作为TestSpec的单独实例运行,这会导致为每个实例执行beforeAllafterAll

但是,您可以使用嵌套套件解决此问题(为了获得一个beforeAll和一个afterAll),有关详细信息,请参阅此question