Specs からSpecs2に移行しようとしている古いデータベース テスト スイートがあります。ただし、Specs2 は (私の観点からは) 奇妙な順序でテストを実行します。これにより、データベースの状態が変更され、特定のコードが 2 回実行されるため、テストが中断されます。
テストの簡略化されたバージョンを以下に示します。私が理解している限り、テストは次の順序で実行する必要があります: (シーケンシャルを指定したため):
! 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
そして私の2つの質問:
! 222
最初に実行されないのはなぜですか?sssstart eeeend
2回出力される可能性はありますか?仕様はオブジェクトであり、2 回作成されていませんか?
奇妙なことに、テストから副作用を取り除くと、つまり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 バージョン。
(テストを完全に書き直す必要があると思われる場合は、代わりにこの質問を見てください:相互に依存するテストを使用して Specs2 データベース テストを設計する方法は? )