PHpullh
학습 라이브러리/Kotlin/프로퍼티 기반 테스트 (Property-Based)

KOTLIN · 테스트

프로퍼티 기반 테스트 (Property-Based)

무작위 입력으로 속성(불변식)을 검증하는 프로퍼티 기반 테스트입니다. 엣지 케이스를 자동으로 발견합니다.

테스트고급property-basedrandom-testinginvariantkotest

핵심 설명

무작위 입력으로 속성(불변식)을 검증하는 프로퍼티 기반 테스트입니다. 엣지 케이스를 자동으로 발견합니다.

Kotlin code

import kotlin.random.Random

// 프로퍼티 테스트 프레임워크 (간략 구현)
fun <T> forAll(
    iterations: Int = 100,
    generator: () -> T,
    property: (T) -> Boolean
) {
    repeat(iterations) { i ->
        val input = generator()
        if (!property(input)) {
            throw AssertionError("반례 발견! 입력: $input (반복 #$i)")
        }
    }
}

// 테스트 대상
fun reverse(list: List<Int>): List<Int> = list.reversed()
fun sort(list: List<Int>): List<Int> = list.sorted()

fun main() {
    // 속성 1: 두 번 reverse하면 원본
    forAll(
        generator = { List(Random.nextInt(0, 20)) { Random.nextInt(-100, 100) } },
        property = { list -> reverse(reverse(list)) == list }
    )
    println("✓ reverse(reverse(x)) == x")

    // 속성 2: 정렬 후 크기 동일
    forAll(
        generator = { List(Random.nextInt(0, 50)) { Random.nextInt() } },
        property = { list -> sort(list).size == list.size }
    )
    println("✓ sort(x).size == x.size")

    // 속성 3: 정렬된 리스트는 순서 유지
    forAll(
        generator = { List(Random.nextInt(1, 30)) { Random.nextInt(-50, 50) } },
        property = { list ->
            val sorted = sort(list)
            sorted.zipWithNext().all { (a, b) -> a <= b }
        }
    )
    println("✓ sort(x)는 오름차순")

    println("모든 프로퍼티 테스트 통과!")
}

학습 팁

Kotest의 property testing 모듈이나 jqwik을 사용하면 shrinking(최소 반례 찾기) 기능도 제공됩니다.

주의할 점

프로퍼티 테스트의 generator가 엣지 케이스(빈 리스트, 극값 등)를 포함하도록 설계하세요. 균일 분포만으로는 부족합니다.

자주 묻는 질문

프로퍼티 기반 테스트 (Property-Based)란 무엇인가요?

무작위 입력으로 속성(불변식)을 검증하는 프로퍼티 기반 테스트입니다. 엣지 케이스를 자동으로 발견합니다.

프로퍼티 기반 테스트 (Property-Based) 학습 시 주의할 점은 무엇인가요?

프로퍼티 테스트의 generator가 엣지 케이스(빈 리스트, 극값 등)를 포함하도록 설계하세요. 균일 분포만으로는 부족합니다.