複数のテストケースを備えたScalatestまたはSpecs2
質問
TestNGとJavaでは、DataProviderを使用して複数のテストケースを実行できます。これは、個別のテストとして実行されるため、テストの実行は障害時に停止しません。 ScalatestまたはSpecs/Specs2のアナログはありますか?
解決
ScalateSt 2とSpecs2の両方で、データでパラメーター化するために、実行時にテストケースを簡単に作成できます。これがSpecs2の例です。
class BasketSpecification extends Specification {
"a basket must contain fruits" >> {
Seq(apple, banana, orange) foreach { fruit =>
("it contains: " + fruit) >> {
basket must contain(fruit)
}
}
}
}
次に、出力は次のとおりです。
A basket must contain fruits
+ it contains: apple
+ it contains: banana
+ it contains: orange
一方、次の仕様:
class BasketSpecification extends Specification {
"a basket must contain fruits" >> {
Seq(apple, cake, orange) foreach { fruit =>
("it contains: " + fruit) >> {
basket must contain(fruit)
}
}
}
}
次のようなものを印刷します
A basket must contain fruits
+ it contains: apple
x it contains: cake
'basket' does not contain 'cake'
+ it contains: orange
他のヒント
同じテストコードが複数のフィクスチャーによって「共有」されているため、その概念はScalatestで「共有テスト」と呼ばれます。このテストコードは、「フィクスチャー」がTestNGのDataProviderアプローチの「データ」です。テストを関数として表現するスカラテストの各スタイルの特性に対してこれを行う方法があります。 Wordspecの例は次のとおりです。
http://www.scalatest.org/scaladoc-1.6.1/#org.scalatest.wordspec@sharedtests
代わりに、forループを使用して、異なるデータポイントについて同じテストコードを登録することもできます。これは、ここにある電子メールのディスカッションで出てきました:
http://groups.google.com/group/scalatest-users/browse_thread/thread/7337628407b48068
その場合のループコードの場合は次のように見えます。
for (browser <- List("IE", "Chrome", "Firefox")) {
test(browser + ": test one") { driver =>
info("Testing using " + driver)
}
test(browser + ": test two") { driver =>
info("Testing using " + driver)
}
test(browser + ": test three") { driver =>
info("Testing using " + driver)
}
test(browser + ": test four") { driver =>
info("Testing using " + driver)
}
test(browser + ": test five") { driver =>
info("Testing using " + driver)
}
}
}
これにより、実際には15のテストが登録され、各ブラウザドライバーの5つのテストが登録されます。これはあなたが望んでいると信じています。