Kotest 제너레이터(Generators)

Kotest의 제너레이터는 프로퍼티 기반 테스팅을 지원하는데 사용되는 도구이다.

생성된 값은 봉인된 클래스 Gen의 인스턴스에 의해 제공된다. Gen은 입력 스트림과 비슷하지만 속성 테스트 값에 대한 것으로 생각할 수 있다. 각 Gen은 특정 유형에 대해 이러한 값의 (보통) 무한 스트림을 제공한다.

Kotest에는 아리티(arbitrary, 임의의) 값을 생성하는 Arb와 닫힌 공간에서 유한한 값 집합을 생성하는 Exhaustive의 두 가지 유형의 제너레이터가 있다.

두 가지 유형의 제너레이터를 속성 테스트에서 혼합하여 사용할 수 있다. 예를 들어, 0에서 200까지의 모든 짝수(exhaustive)와 함께 100개의 임의의 양의 정수(an arb)가 있는 함수를 테스트할 수 있다.

일부 제너레이터는 JVM에서만 사용할 수 있다. 전체 목록은 여기에서 확인한다.

Arbitrary

Arbs는 하드 코딩된 에지 케이스 세트와 무작위로 선택된 샘플의 무한한 스트림이라는 두 가지 유형의 값을 생성한다.

샘플은 반복될 수 있으며 일부 값은 전혀 생성되지 않을 수도 있다. 예를 들어 0과 Int.MAX 사이의 정수를 1000개 생성하면 가능한 모든 값을 반환할 수 없으며, 일부 값은 두 번 이상 생성될 수 있다. 마찬가지로 0에서 500 사이의 임의의 정수를 1000개 생성하면 일부 값이 두 번 이상 나타날 수 있다.

범위가 있거나 없는 숫자, 유니코드 집합의 문자열, 임의의 목록, 임의의 매개변수가 있는 데이터 클래스, 이메일, 코드포인트, 문자 등이 일반적인 임의의 값이다.

임의의 값 외에도 arbs는 에지 케이스를 제공할 수 있다. Kotest의 속성 테스트의 설계 특징 중 하나는 일부 유형의 값에는 테스트에 포함되기를 원하는 “일반적인” 에지 케이스가 항상 포함된다는 것이다.

예를 들어 정수를 받는 함수를 테스트할 때는 최소한 0, 양수, 음수로 테스트하고 싶을 것이다. 임의의 값만 제공되면 0이 나타날 확률이 상당히 낮기 때문에 Kotest는 정수에 대해 항상 몇 가지 “에지 케이스"를 제공한다(따로 지정하지 않는 한).

테스트를 실행할 때 프레임워크는 샘플과 에지 케이스를 무작위로 번갈아 가며 사용한다. 분할은 기본값이 2% 에지 케이스로 설정된 구성 값에 의해 결정된다.

모든 애브에 에지 케이스가 있는 것은 아니지만 가장 일반적인 유형의 애브에는 에지 케이스가 있다. 다음은 일부 애브에서 사용하는 에지 케이스의 몇 가지 예이다:

  • ints: 0, 1, -1, Int.MAX_VALUE, Int.MIN_VALUE
  • double: 0, 1, -1, Double.MAX_VALUE, Double.MIN_VALUE, Double.POSITIVE_INFINITY, Double.NEGATIVE_INFINITY, Double.NaN
  • strings: empty string, 최소 길이의 문자열, 최소 코드 포인트
  • lists: empty list, 단일 요소 목록, 중복 요소가 있는 목록
  • maps: empty map
  • nullabla valuse: null

Exhaustive

Exhaustive는 지정된 공간에서 모든 값을 생성한다. 해당 공간의 모든 값이 사용되도록 하려는 경우에 유용하다. 예를 들어 열거형 값의 경우 열거형 값에서 무작위로 선택하여 일부 값이 누락되고 다른 값이 중복될 가능성이 있는 것보다 각 열거형이 사용되도록 하는 것이 일반적으로 더 유용하다.

일반적인 열거형에는 작은 컬렉션, 열거형, 부울 값, 목록 또는 집합의 거듭제곱, 사전 정의된 정수 범위 및 사전 정의된 문자열 범위가 포함된다.

익스큐티브가 모든 값을 제공하면 반복해서 다시 시작되므로 입력이 필요한 테스트에서 익스큐티브를 사용할 수 있다.

예를 들어,

enum class Season { Winter, Fall, Spring, Summer }

forAll<Int, Season>(100) { a, season -> ... }

여기서는 100번의 반복을 요청했으므로 계절의 각 값이 25번 제공될 것이다.


참조




최종 수정 : 2024-04-14