Scala Language
ScalaCheck로 테스트하기
수색…
소개
ScalaCheck는 Scala로 작성된 라이브러리이며 Scala 또는 Java 프로그램의 속성 기반 테스트를 자동화하는 데 사용됩니다. ScalaCheck는 원래 Haskell 라이브러리 QuickCheck에서 영감을 얻었지만 독자적으로 모험심을 발휘했습니다.
ScalaCheck에는 Scala 런타임 이외의 외부 종속성이 없으며 Scala 빌드 도구 인 sbt와 잘 작동합니다. 또한 ScalaTest 및 specs2 테스트 프레임 워크에도 완벽하게 통합되어 있습니다.
스케일러 및 오류 메시지가 포함 된 Scalacheck
scalatest를 사용하는 scalacheck의 사용 예. 아래에는 네 가지 테스트가 있습니다.
- "쇼 패스 예"- 통과
- "사용자 정의 오류 메시지가없는 간단한 예제 표시"- 세부 정보없이 실패한 메시지 만
&&
boolean 연산자가 사용됩니다. - "인수에 오류 메시지가있는 예제 표시"- 인수 (
"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