Scala Language
ScalaCheckによるテスト
サーチ…
前書き
ScalaCheckは、Scalaで書かれたライブラリであり、ScalaやJavaプログラムのプロパティベースの自動テストに使用されます。 ScalaCheckはもともとHaskellライブラリのQuickCheckに触発されていましたが、独自の方法でもテストしました。
ScalaCheckには、Scalaランタイム以外の外部依存関係はなく、Scalaビルドツールであるsbtでうまく動作します。また、ScalaTestとspecs2のテストフレームワークに完全に統合されています。
スケーラビリティとエラーメッセージを含むScalacheck
Scatatestを使用するscalacheckの使用例以下に4つのテストがあります。
- "show pass example" - それが通過する
- "カスタムエラーメッセージが表示されない単純な例を表示する" - 詳細がなくメッセージに失敗しました。
&&
ブール演算子が使用されています - "引数にエラーメッセージが表示された例を表示する" - 引数(
"argument" |:
:)にエラーメッセージが表示される&&
代わりにProps.allメソッドが使用される - "コマンドのエラーメッセージを表示する" - コマンドのエラーメッセージ(
"command" |:
)&&
代わりにProps.allメソッドが使用される
import org.scalatest.prop.Checkers
import org.scalatest.{Matchers, WordSpecLike}
import org.scalacheck.Gen._
import org.scalacheck.Prop._
import org.scalacheck.Prop
object Splitter {
def splitLineByColon(message: String): (String, String) = {
val (command, argument) = message.indexOf(":") match {
case -1 =>
(message, "")
case x: Int =>
(message.substring(0, x), message.substring(x + 1))
}
(command.trim, argument.trim)
}
def splitLineByColonWithBugOnCommand(message: String): (String, String) = {
val (command, argument) = splitLineByColon(message)
(command.trim + 2, argument.trim)
}
def splitLineByColonWithBugOnArgument(message: String): (String, String) = {
val (command, argument) = splitLineByColon(message)
(command.trim, argument.trim + 2)
}
}
class ScalaCheckSpec extends WordSpecLike with Matchers with Checkers {
private val COMMAND_LENGTH = 4
"ScalaCheckSpec " should {
"show pass example" in {
check {
Prop.forAll(listOfN(COMMAND_LENGTH, alphaChar), alphaStr) {
(chars, expArgument) =>
val expCommand = new String(chars.toArray)
val line = s"$expCommand:$expArgument"
val (c, p) = Splitter.splitLineByColon(line)
Prop.all("command" |: c =? expCommand, "argument" |: expArgument =? p)
}
}
}
"show simple example without custom error message " in {
check {
Prop.forAll(listOfN(COMMAND_LENGTH, alphaChar), alphaStr) {
(chars, expArgument) =>
val expCommand = new String(chars.toArray)
val line = s"$expCommand:$expArgument"
val (c, p) = Splitter.splitLineByColonWithBugOnArgument(line)
c === expCommand && expArgument === p
}
}
}
"show example with error messages on argument" in {
check {
Prop.forAll(listOfN(COMMAND_LENGTH, alphaChar), alphaStr) {
(chars, expArgument) =>
val expCommand = new String(chars.toArray)
val line = s"$expCommand:$expArgument"
val (c, p) = Splitter.splitLineByColonWithBugOnArgument(line)
Prop.all("command" |: c =? expCommand, "argument" |: expArgument =? p)
}
}
}
"show example with error messages on command" in {
check {
Prop.forAll(listOfN(COMMAND_LENGTH, alphaChar), alphaStr) {
(chars, expArgument) =>
val expCommand = new String(chars.toArray)
val line = s"$expCommand:$expArgument"
val (c, p) = Splitter.splitLineByColonWithBugOnCommand(line)
Prop.all("command" |: c =? expCommand, "argument" |: expArgument =? p)
}
}
}
出力(フラグメント):
[info] - should show example // passed
[info] - should show simple example without custom error message *** FAILED ***
[info] (ScalaCheckSpec.scala:73)
[info] Falsified after 0 successful property evaluations.
[info] Location: (ScalaCheckSpec.scala:73)
[info] Occurred when passed generated values (
[info] arg0 = List(), // 3 shrinks
[info] arg1 = ""
[info] )
[info] - should show example with error messages on argument *** FAILED ***
[info] (ScalaCheckSpec.scala:86)
[info] Falsified after 0 successful property evaluations.
[info] Location: (ScalaCheckSpec.scala:86)
[info] Occurred when passed generated values (
[info] arg0 = List(), // 3 shrinks
[info] arg1 = ""
[info] )
[info] Labels of failing property:
[info] Expected "" but got "2"
[info] argument
[info] - should show example with error messages on command *** FAILED ***
[info] (ScalaCheckSpec.scala:99)
[info] Falsified after 0 successful property evaluations.
[info] Location: (ScalaCheckSpec.scala:99)
[info] Occurred when passed generated values (
[info] arg0 = List(), // 3 shrinks
[info] arg1 = ""
[info] )
[info] Labels of failing property:
[info] Expected "2" but got ""
[info] command
Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow