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
,arbB
및arbC
가 각각 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