ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 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

    댓글

Designed by Tistory.