
소프트웨어 개발 과정에서 테스트는 필수적입니다. 하지만 우리가 흔히 작성하는 단위 테스트(Unit Testing)는 개발자가 예상한 시나리오 안에서만 작동한다는 한계가 있습니다. "엣지 케이스(Edge Case)를 놓치면 어떡하지?"라는 불안감을 해소해 줄 강력한 솔루션이 바로 Property-based Testing(속성 기반 테스트)입니다. 오늘은 파이썬의 대표적인 속성 기반 테스트 라이브러리인 Hypothesis의 활용법과 그 가치에 대해 심층적으로 다루어 보겠습니다.
1. 속성 기반 테스트(Property-based Testing)란 무엇인가?
기존의 테스트 방식이 "입력값 A를 넣으면 출력값 B가 나와야 한다"라고 명시하는 방식이라면, 속성 기반 테스트는 "데이터의 성질(Property)이 항상 유지되어야 한다"는 규칙을 정의합니다. Hypothesis 라이브러리는 이 규칙을 바탕으로 수천 가지의 무작위 데이터를 생성하여 코드가 망가지는 지점을 찾아냅니다.
전통적 테스트 vs 속성 기반 테스트 비교
| 비교 항목 | 기존 단위 테스트 (Example-based) | 속성 기반 테스트 (Hypothesis) |
|---|---|---|
| 데이터 구성 | 개발자가 수동으로 입력값 결정 | 라이브러리가 무작위/범위 내 자동 생성 |
| 검증 방식 | 특정 결과값과의 일치 여부 | 데이터의 불변 속성(Property) 만족 여부 |
| 엣지 케이스 발견 | 개발자의 상상력에 의존함 | 매우 높음 (빈 문자열, 음수, 거대 숫자 등) |
| 코드 유지보수 | 입력값 변경 시 테스트 코드 수정 필요 | 속성만 명확하면 데이터 변화에 유연함 |
2. Hypothesis 라이브러리 활용 방법 3가지 핵심 전략
방법 01. 전략(Strategies)을 이용한 데이터 도메인 정의
Hypothesis의 핵심은 st.integers(), st.text(), st.lists()와 같은 전략을 사용하여 입력 데이터의 범위를 지정하는 것입니다. 이를 통해 단순히 무작위가 아닌, 의미 있는 무작위성을 부여할 수 있습니다.
방법 02. Shrinking(축소) 기능을 통한 디버깅 최적화
Hypothesis의 가장 독창적인 장점은 Shrinking입니다. 만약 1,000자의 문자열에서 오류가 발생했다면, Hypothesis는 이를 자동으로 줄여서 오류를 발생시키는 '최소한의 입력값'을 찾아내어 사용자에게 보고합니다. 이는 개발자가 버그 원인을 파악하는 시간을 획기적으로 줄여줍니다.
방법 03. 상태 기반 테스트(Stateful Testing) 적용
단순 함수 호출을 넘어, 데이터베이스나 API와 같이 상태가 변하는 시스템에서도 Hypothesis를 활용할 수 있습니다. 일련의 작업 순서를 무작위로 조합하여 특정 순서에서 발생하는 레이스 컨디션이나 상태 오류를 잡아냅니다.
3. 실전 Sample Example: 리스트 정렬 알고리즘 검증
간단한 정렬 함수를 검증하는 예제를 통해 일반 테스트와 차이점을 살펴보겠습니다.
from hypothesis import given, strategies as st
# 검증할 함수 (예: 파이썬 내장 정렬 사용)
def optimize_sort(ls):
return sorted(ls)
# Hypothesis를 이용한 속성 기반 테스트
@given(st.lists(st.integers()))
def test_sort_properties(ls):
result = optimize_sort(ls)
# 속성 1: 결과 리스트의 길이는 원본과 같아야 함
assert len(result) == len(ls)
# 속성 2: 결과 리스트는 반드시 오름차순이어야 함
for i in range(len(result) - 1):
assert result[i] <= result[i + 1]
# 속성 3: 결과 리스트의 구성 요소는 원본과 동일해야 함 (집합 비교)
assert sorted(result) == sorted(ls)
위 테스트는 우리가 [1, 2, 3] 같은 예시를 일일이 넣지 않아도, Hypothesis가 빈 리스트, 중복된 숫자가 있는 리스트, 아주 큰 숫자가 포함된 리스트 등을 자동으로 생성하여 100회 이상 테스트를 수행합니다.
4. 결론: 왜 지금 Hypothesis를 도입해야 하는가?
현대 소프트웨어는 입력값의 조합이 무한대에 가깝습니다. 사람이 모든 예외 상황을 고려하는 것은 불가능에 가깝습니다. Hypothesis는 개발자의 지능과 컴퓨터의 연산력을 결합하여 "내가 모르는 버그"를 찾아내 주는 든든한 파트너입니다. 코드의 안정성을 한 단계 높이고 싶다면, 지금 바로 프로젝트에 pip install hypothesis를 실행해 보시기 바랍니다.
참고 문헌 및 출처
- Hypothesis.
- Python Testing with pytest (Brian Okken)
- Property-based Testing with PropEr, Erlang, and Elixir (Fred Hebert)