TLDR;在同时混合BeforeAndAfterAll
和ParallelTestExecution
的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}}。有没有办法让我的蛋糕也吃掉它?
答案 0 :(得分:3)
从马的口中:https://stackoverflow.com/a/15731847/89509
基本上每个测试用例都将作为自己的实例运行,每次调用afterAll
一次。
答案 1 :(得分:3)
这是一种正常行为,因为为了降低并发冲突和错误的风险,ParallelTestExecution
在其自己的Test类实例中运行每个测试。每个测试都将作为TestSpec
的单独实例运行,这会导致为每个实例执行beforeAll
和afterAll
。
但是,您可以使用嵌套套件解决此问题(为了获得一个beforeAll
和一个afterAll
),有关详细信息,请参阅此question。