Property-Based Testing
Property-Based Testing
개별 입력 케이스 대신 입력 데이터의 속성(Property)과 불변 조건을 정의하고 자동 생성된 다양한 입력으로 테스트하여 예상치 못한 버그를 발견하는 테스트 기법
목적: 광범위한 입력 테스트, 예외 케이스 발견, 불변 조건 검증, 자동화
특징: 속성 정의, 자동 입력 생성, 축소(Shrinking), 무작위성, 반례 찾기
핵심 개념: 속성(Property) - "정렬 후 길이는 변하지 않는다", "리버스 두 번은 원본", 생성기(Generator) - 랜덤 입력 생성
동작: ① 속성 정의 → ② 입력 생성기 설정 → ③ 수백~수천 개 입력 자동 생성 → ④ 속성 검증 → ⑤ 실패 시 축소(최소 반례 찾기)
축소(Shrinking): 실패한 입력을 단순화하여 최소 반례 도출, 디버깅 용이
도구: QuickCheck(Haskell), Hypothesis(Python), fast-check(JavaScript), ScalaCheck, PropEr(Erlang)
예시: reverse(reverse(list)) == list, sorted(list)가 정렬됨, parse(serialize(obj)) == obj
장점: 예상치 못한 버그 발견, 광범위한 입력 커버리지, 불변 조건 검증, 회귀 테스트
단점: 속성 정의 어려움, 실행 시간 김, 비결정적(무작위), 학습 곡선
적용사례: 파서, 직렬화, 암호화, 자료구조, 수학 함수, API 테스트
비교: Property-Based(속성/자동생성/광범위) vs Example-Based(개별케이스/수동/제한적) vs Fuzzing(무작위/보안)
연관: QuickCheck, Hypothesis, 테스트 자동화, 불변 조건, 함수형 프로그래밍