-
scalatest-3.0.5 에서 scalacheck 의 generator 사용하기scala/scalatest 2022. 2. 19. 19:52
문제
scalatest 내에서 scalacheck 의 generator 를 사용해 보자.
아래 Person 인스턴스를 생성해 주는 generator 를 만들어 보자
case class Person(name: String, age: Int, isAdult: Boolean, gender: String, isMarried: Boolean)
코드
build.sbt 에 scalatest, scalacheck 라이브러리를 추가한다.
libraryDependencies ++= Seq( "org.scalatest" %% "scalatest" % "3.0.5" % "test", "org.scalacheck" %% "scalacheck" % "1.13.5" % "test" )
Generator 와 테스트를 작성한다.
person 의 name 과 gender 가 일치할 경우 동일한 인물로 보고, distinct person list 를 만들어 주는 distinctPeople 도 작성해 본다.
import org.scalacheck.Gen import org.scalatest.prop.PropertyChecks import org.scalatest.{BeforeAndAfter, FunSuite} case class Person(name: String, age: Int, isAdult: Boolean, gender: String, isMarried: Boolean) object PersonGen { def distinct[T](items: List[T])(f: (T, T) => Boolean): List[T] = items.foldLeft[List[T]](List.empty[T])((acc, x) => if (acc.exists(y => f(x, y))) acc else acc :+ x) val person: Gen[Person] = for { name <- Gen.alphaLowerStr age <- Gen.choose(1, 100) isAdult = age >= 18 gender <- Gen.oneOf[String]("male", "female") isMarried <- Gen.frequency[Boolean]((1, false), (2, true)) } yield Person(name, age, isAdult, gender, isMarried) private def isEqPerson(x: Person, y: Person): Boolean = x.name == y.name && x.gender == y.gender val people: Gen[List[Person]] = Gen.nonEmptyListOf(person) val distinctPeople: Gen[List[Person]] = people.map(persons => distinct(persons)(isEqPerson)) // def persons(n: Int): Gen[List[Person]] = Gen.listOfN(n, person) } class MyAppTest extends FunSuite with BeforeAndAfter with PropertyChecks { test("If age is more or equal to 18, then isAdult should be true.") { forAll(PersonGen.person) { p => whenever(p.age >= 18) { assert(p.isAdult === true) } } } }
'scala > scalatest' 카테고리의 다른 글
BeforeAndAfterAll (0) 2023.03.21 BeforeAndAfter (0) 2023.03.21 scalatest-3.2.3 의 property based test (0) 2023.01.25 scalatest-3.0.5 의 property based test (0) 2021.11.14