我正在尝试将旧数据库测试套件从 Specs 迁移到Specs2。然而,Specs2 以一种奇怪的顺序运行测试(从我的角度来看),这会破坏测试,因为它们会更改数据库状态,并运行某些代码两次。
在下面找到测试的简化版本。据我了解,测试应该按以下顺序运行:(因为我已经指定了顺序):
! 222
,,但是! 333
,! 444
实际发生的是它们按以下顺序执行:
! 333
,,! 222
! 444
以下是测试:
object IncludedSpec extends Specification {
sequential
println("sssstart")
"IncludedSpec" should {
println("..222")
"context free block" >> {
println("....! 222 the first test")
1 === 1
}
var variableN = 0
"block with context" >> {
println("....333")
"using one variable" >> {
println("......! 333 doing some tests and setting variableN")
variableN = 123
}
println("....444")
"using it again" >> {
println("......! 444 testing variableN")
variableN === 123
}
println("....555")
}
}
println("eeeend")
}
这是所有println
输出:
sssstart
eeeend
sssstart
eeeend
..222
....333
......! 333 doing some tests and setting variableN
....444
....555
....! 222 the first test
......! 444 testing variableN
还有我的两个问题:
为什么不
! 222
先执行?怎么可能
sssstart eeeend
输出两次?规范是一个对象并且没有创建两次?
奇怪的是,如果我从测试中移除副作用——即移除variableN并将测试主体替换为ok
——测试以正确的顺序运行。
版本详细信息:我正在使用 Paly Framework 2.1-SNAPSHOT(2012 年 10 月 28 日的版本 203df0e)和 Scala 2.10.0-RC1 运行这些测试。我认为Play捆绑的Specs2版本是1.12版本,因为该inline
方法可用,并且是在1.12(-SNAPSHOT)中添加的,参见https://github.com/etorreborre/specs2/issues/87并且没有后Specs2 版本。
(哦,如果你认为我应该完全重写测试,那么看看这个问题:How design a Specs2 database test, with interdependent tests?)