JUnitのパラメータ化されたテストのように、複数のデータセットでテストを実行する便利な方法はありますか?
3 に答える
複数のデータ セットをテストするための新機能が ScalaTest 1.5 に追加されました。現在、スナップショットとして試すことができます。これは scala-tools.org でリリースされています。
グループ ID: org.scalatest 成果物 ID: scalatest バージョン: 1.5-SNAPSHOT
TableDrivenPropertyChecks をミックス (またはメンバーをインポート) すると、次のようにテーブルを定義できます。
val examples =
Table(
("a", "b", "c", "d"),
( 1, 1, 1, 1),
( 1, 1, 1, 1),
( 1, 1, 1, 1),
( 1, 1, 1, 1)
)
タプルの var arg リストを Table に渡します。各タプルは同じアリティを持つ必要があります。この場合、各タプルのアリティは 4 (4 メンバー) です。最初のタプルはすべて文字列で、これらは列の名前を定義します。後続のタプルは、それぞれ 1 行のデータを定義します。タプルには任意の型を入れることができますが、通常、各列には同じ型が含まれます。ただし、必要に応じて、何でも含むことができる Any 型の列を作成できます。1 ~ 22 列のテーブルを作成できます。22 を超える列が必要な場合 (Scala の最大タプル サイズは現在 22 です)、1 つ以上の列で複合型を使用することができます。
テーブルを作成したら、次のように forAll でチェックできます。
forAll (examples) { (a, b, c, d) =>
a + b + c + d should equal (4)
}
forAll は 2 つのパラメーター リストを取ります。1 つ目はテーブルで、2 つ目は「プロパティ関数」です。これは、テーブルのすべての行に対して真であるべきことを表現します。forAll は、テーブルの各行を取得し (もちろん、列名の見出し行をスキップします)、プロパティが保持されていることを確認します。そうでない場合は、テーブルのどの行が失敗したか、名前付き列の値が何であったかなどを示す素敵なエラー メッセージが表示されます。
Table はデータ タプルの Seq であるため、Seq のように使用することもできます。たとえば、どの行が失敗したかを示す Option[Exception] の Seq を次のように取得できます。
for ((a, b, c, d) <- examples) yield {
failureOf { a + b + c + d should equal (4) }
}
結果の Seq には、テーブル内のデータの行ごとに 1 つの Option が含まれます。これは、プロパティがその行に渡された場合は None であり、プロパティが失敗した場合は Some[Exception] です。Some の例外には、失敗に関するすべての詳細が含まれています。
共有テストはあなたにとって興味深いものになる可能性があります。これらを使用すると、次のスタック例のように一連のテストを定義できます。
def nonEmptyStack(stack: Stack[Int], lastItemAdded: Int) {
"be non-empty" in {
assert(!stack.empty)
}
"return the top item on peek" in {
assert(stack.peek === lastItemAdded)
}
"not remove the top item on peek" in {
val size = stack.size
assert(stack.peek === lastItemAdded)
assert(stack.size === size)
}
"remove the top item on pop" in {
val size = stack.size
assert(stack.pop === lastItemAdded)
assert(stack.size === size - 1)
}
}
実際の仕様では、次のように使用できます。
behave like nonEmptyStack(stackWithOneItem, lastValuePushed)
つまり、nonEmptyStackはパラメーター化された一連のテストであり、テストするさまざまなデータセットで使用できます。