Kotest 제너레이터 연산(Generator Operations)

Kotest 제너레이터 연산(Generator Operations)으로 Next, Filter, Map, FlatMap, Merging, Bind에 대해 소개한다.

Next

속성 테스트가 아니더라도 값을 반환하는 데만 Arb를 사용하려면 다음을 호출하면 된다.

val arbA: Arb<A> = ...
val a = arbA.next() // use Random.Default
val a2 = arbA.next(rs) // pass in Random

Filter

호가 있고 값의 하위 집합을 제공하는 새 호를 생성하려는 경우 소스 호에서 필터를 호출할 수 있다. 예를 들어, 짝수를 생성하는 한 가지 방법은 정수 구간차원을 가져와 홀수 값을 필터링하는 것이다.

val evens = Arb.int().filter { it.value % 2 == 0 }
val odds = Arb.int().filter { it.value % 2 == 1 }

Map

Arb가 있고 생성된 값을 변환하려는 경우 Map를 사용할 수 있다.

val integerStrings: Arb<String> = Arb.int().map { it.toString() }

FlatMap

방출 또는 에지 케이스가 이전 임의의 방출에 따라 달라지는 arb가 있는 경우 flatMap을 사용할 수 있다.

val dependentArbs: Arb<String> = Arb.of("foo", "bar").flatMap { prefix ->
   Arb.int(1..10).map { integer ->
      "${prefix}-${integer}"
   }
}

Merging

두 제너레이터를 병합하여 결과 요소가 두 제너레이터에서 동일하게 샘플링되도록 할 수 있다.

val merged = arbA.merge(arbB)

따라서 다음 예제에서는 각 무작위 샘플에서 "A" 또는 "B"가 나올 확률이 동일하다:

val a = arbitrary { "a" }
val b = arbitrary { "b" }
val ab = a.merge(b)

println(ab.take(1000).groupingBy { it }.eachCount())
// {a=493, b=507}

두 개 이상의 임의 객체를 병합하는 경우에는 Arb.choice 또는 Arb.choose가 더 적합할 수 있다. 예를 들어 다음을 사용할 수 있다:

  • Arb.choice(arbA, arbB, arbC)arbA, arbB, arbC 사이의 균일한 샘플링을 위해 사용할 수 있다,
  • 또는 각 임의의 빈도를 보다 세밀하게 제어하려면 Arb.choose(4 to arbA, 1 to arbB, 5 to arbC)를 사용할 수 있다. 이 예제에서는 arbA, arbBarbC가 각각 40%, 10%, 50%의 확률로 샘플링된다.

Bind

바인드는 여러 임의의 값을 적용하려는 경우에 유용하다. 바인드를 사용하여 데이터 클래스의 값을 구성하는 방법을 살펴볼 수 있다.

data class Person(val name: String, val age: Int)

val personArb: Arb<Person> = Arb.bind(
   Arb.string(),
   Arb.int()
) { name, age -> Person(name, age) }

참조




최종 수정 : 2024-04-21