Kotest 프로퍼티 기반 테스트(Property-based Testing)
프로퍼티 기반 테스트
Kotest는 독립적으로 사용할 수 있는 여러 하위 프로젝트로 나눠진다. 이러한 하위 프로젝트 중 하나가 프로퍼티 테스트 프레임워크(Property-based Testing)이다. 당연하겠지만, 프로퍼티 테스트 지원의 이점을 누리기 위해 Kotest를 테스트 프레임워크로 사용할 필요는 없다.
프로퍼티 테스트란 무엇인가요?
개발자는 일반적으로 예제 기반 테스트를 작성한다. 이는 여러분이 잘 알고 있고 좋아하는 다양한 단위 테스트이다. 몇 가지 입력값과 예상 결과를 제공하면 Kotest 또는 JUnit과 같은 테스트 프레임워크가 실제 결과가 예상에 부합하는지 확인한다.
이 접근 방식의 한 가지 문제점은 개발자가 미처 생각하지 못한 에지 케이스 또는 선택한 입력의 커버리지 부족으로 인해 오류를 놓치기 쉽다는 것이다. 대신 프로퍼티 테스트를 사용하면 수백 또는 수천 개의 값이 동일한 테스트에 입력되며, 값은 (일반적으로) 프로퍼티 테스트 프레임워크에서 임의로 생성된다.
예를 들어, 좋은 프로퍼티 테스트 프레임워크에는 음수 무한대, 빈 목록, ASCII가 아닌 문자가 포함된 문자열 등과 같은 값이 포함된다. 예제 기반 테스트를 작성할 때 우리가 종종 잊어버리는 것들이다.
프로퍼티 테스트는 원래 퀵체크(Quickcheck)와 같은 프레임워크에서 어떤 객체에 대한 프로퍼티, 즉 모든 입력에 대해 참이어야 하는 프로퍼티을 테스트하는 개념으로 고안된 것이다. 다른 말로 하면 불변성이다. 불변성의 예를 들어, 두 개의 문자열 a와 b가 주어진다면, length(a + b)
는 항상 length(a) + length(b)
와 같아야 한다.
여기서 프로퍼티 테스트라는 용어가 유래하였다.
그러나 모나드 법칙(monad laws)이나 기본 숫자 함수 같은 것만 테스트하기 위해 프로퍼티 테스트를 사용할 필요는 없다. 다양한 입력 값을 활용할 수 있는 모든 테스트가 좋은 후보이다. 예를 들어, 사용자 이름의 유효성을 검사하는 함수가 있는데 유효한 이메일이 수락되는지 테스트하고 싶을 수 있다. 여기서 프로퍼티 테스트는 유효성 검사 로직을 강화하는 데 도움이 되는 수천 개의 조합을 생성하는 데 유용할 것이다.
시작하기
프로퍼티 테스트 프레임워크는 모든 대상에서 지원된다.
JVM/Gradle
빌드에 다음 종속성을 추가한다:
dependencies {
testImplementation("io.kotest:kotest-property:$version")
}
JVM/Maven
빌드에 다음 종속성을 추가한다:
<dependency>
<groupId>io.kotest</groupId>
<artifactId>kotest-property-jvm</artifactId>
<version>${version}</version>
<scope>test</scope>
</dependency>
Multiplatform
commonTest
소스 집합에 다음 종속성을 추가한다:
kotlin {
sourceSets {
val commonTest by getting {
dependencies {
implementation("io.kotest:kotest-property:$version")
}
}
}
}
또는 특정 대상에 종속성을 추가할 수도 있다. 예를 들어 Javascript 대상에 jsTest
소스 집합만 사용하는 종속성을 추가할 수 있다.
kotlin {
targets {
js {
browser()
nodejs()
}
}
sourceSets {
val jsTest by getting {
dependencies {
implementation("io.kotest:kotest-property:$version")
}
}
}
}
다음 단계
테스트에 대한 입력 값을 생성하기 위해 Kotest는 제너레이터(generator)라는 용어를 사용한다. 입력 인수당 하나의 제너레이터가 테스트 함수에 전달되고 테스트는 설정된 반복 횟수 동안 실행된다.
자세히 알아보기
- 테스트 함수가 사용되는 방법.
- 다양한 유형의 제너레이터와 그에 대한 연산.
- 사용자 지정 제너레이터를 작성하는 방법.
- 시드를 포함하여 테스트에 대한 구성을 지정하는 방법.