페어와이즈 테스트로 조합 폭발 줄이는 테스트 설계

페어와이즈 테스트의 2-wise 커버리지, 제약 조건 모델링, 생성 알고리즘과 조합 테스트 설계 활용법을 정리한다.

2026-08-14 · 최초 발행 2025-12-15

모든 조합 대신 파라미터 쌍을 확인하는 이유

Pairwise Testing은 기능 범위에 비해 테스트 세트가 지나치게 커지는 문제를 다루는 명세기반 블랙박스 테스트 기법이다. 대부분의 결함이 두 요소의 상호작용에서 발생한다는 경험 법칙을 바탕으로, 모든 파라미터 쌍의 값 조합이 적어도 한 번은 테스트에 포함되도록 설계한다.

이 방식의 목표는 전수 조합을 재현하는 데 있지 않다. 각 파라미터의 값이 다른 파라미터의 모든 값과 최소 한 번씩 결합하게 만들어, 제한된 케이스로 상호작용 결함을 찾는 데 있다. 수학적으로는 Covering Array의 2-wise, 즉 t=2에 해당하며 Orthogonal Array로도 최소 세트를 근사할 수 있다. t를 3 이상으로 늘리면 n-wise 조합 테스트로 확장된다.

페어와이즈 설계에서는 두 요소의 개별 조합을 기준으로 삼는다. 각 요소의 값은 중복 없이 배열하고, 나머지 요소의 값도 기존 파라미터 값과 순차적으로 중복되지 않도록 배정한다.

테스트 대상은 값 목록과 제약으로 모델링한다

먼저 기능, 플래그, 설정값을 파라미터와 값 도메인으로 바꿔야 한다. 이 단계에서 등가분할과 경계값 분석을 적용하면 값 개수를 줄이면서도 의미 있는 대표값을 선정할 수 있다.

금지 조합, 종속 관계, 파생 규칙도 함께 명세해야 한다. 조합 생성기가 유효하지 않은 케이스까지 만들지 않도록 막는 장치이며, 테스트 스위트의 실행 가능성을 좌우한다.

2-wise 커버리지는 모든 파라미터 쌍에서 가능한 값 조합이 최소 1회 이상 나타난 상태다. 파라미터 i와 j의 값 개수가 각각 |Vi|, |Vj|라면 해당 페어 수는 |Vi|×|Vj|이고, 전체 페어 수는 모든 i<j에 대한 합으로 계산한다. 하나의 테스트 케이스가 여러 페어를 동시에 충족하기 때문에 전체 케이스 수는 급격히 감소한다.

생성 결과는 위험도와 변경까지 고려해 관리한다

Orthogonal Array를 쓰는 정규 설계는 균형성과 분석 용이성을 확보할 수 있지만 열 수와 수준 수 제약이 있다. 대규모이거나 도메인 구성이 서로 다른 경우에는 IPOG/IPOG-D, In-Parameter-Order, Greedy, AETG 같은 휴리스틱이 적합하다. 제약 조건이 복잡하면 SAT, SMT, 백트래킹을 결합해 유효한 케이스만 생성한다.

생성 결과만 받아들이지 말고, 고위험 조합을 앞에 배치하는 시드와 우선순위를 반영할 수 있다. 생성 후에는 페어 커버리지 매트릭스로 누락된 조합을 확인한다. 파라미터가 바뀌었을 때는 증분 생성과 기존 회귀 스위트 재사용으로 대응한다.

조합이 빠르게 늘어나는 환경에서의 적용

플랫폼과 브라우저 매트릭스에서는 OS, 브라우저, 렌더러, 언어 설정처럼 여러 축이 겹친다. 페어와이즈 방식은 이 조합을 줄이면서 핵심 호환성 결함을 다수 탐지하는 데 쓸 수 있다.

Feature Flag와 설정을 검증할 때도 플래그 on/off, 정책 레벨, 스토리지 백엔드의 조합을 다룰 수 있다. 릴리스 전에 리스크가 높은 상호작용을 확인하는 목적에 맞는다.

임베디드와 디바이스 환경에서는 통신 프로토콜 모드, 전원 상태, 센서 캘리브레이션 조합을 최적화할 수 있다. 장시간 또는 고비용 실험 환경에서 테스트 케이스 수를 대폭 줄이는 데 유리하다.

생성부터 커버리지 확인까지의 흐름

입력은 요구사항과 명세, 파라미터 및 값 도메인, 제약 조건, 목표 커버리지(2-wise)로 구성된다. 모델링과 제약 검증을 거친 뒤 생성 알고리즘을 선택하고 시드와 우선순위를 반영한다. 이후 제약 위반 후보를 제외하면서 미충족 페어를 보강해 테스트 스위트, 커버리지 리포트, 파라미터·결함 매핑 트레이스를 만든다.

아니오아니오아니오요구사항·명세 입력파라미터·값 도메인 정의제약 조건 정의(금지 조합·종속규칙)목표 커버리지 설정('2-wise')생성 알고리즘선택('IPOG'/'Greedy'/'OA')케이스 후보 생성제약 위반 발생?후보 폐기·백트래킹 또는 'SAT'재탐색테스트 스위트에 추가커버리지 100% 달성?테스트 스위트 확정·리포트산출불만족 제약(해 불가)?규칙 수정·도메인 축소·완화

재생·볼륨·이퀄라이저 조합으로 보는 커버리지

재생은 play와 stop, 볼륨은 up과 down, 이퀄라이저는 on과 off 값을 갖는다고 하자. 전체 조합은 2×2×2=8개이며, 목표는 모든 2-요소 값 조합을 커버하는 것이다.

다음 4개 케이스는 권장 테스트 세트의 예다.

  • TC1: 재생=play, 볼륨=up, 이퀄라이저=on
  • TC2: 재생=play, 볼륨=down, 이퀄라이저=off
  • TC3: 재생=stop, 볼륨=up, 이퀄라이저=off
  • TC4: 재생=stop, 볼륨=down, 이퀄라이저=on

총 페어 수는 (재생×볼륨=4) + (재생×이퀄라이저=4) + (볼륨×이퀄라이저=4) = 12다. 각 테스트는 3개 페어를 충족하므로 4개 테스트로 12개 페어 전체를 커버할 수 있다. 전수 8개와 비교하면 50% 절감하면서 2-wise 커버리지 100%를 확보한다.

allpairspy로 생성하는 테스트 케이스

환경은 Python 3.10+, pip, allpairspy 2.x를 사용하며 설치 명령은 pip install allpairspy다.

# 실행 전제: Python 3.10+, pip install allpairspy
from allpairspy import AllPairs

parameters = [
    ("재생", ["play", "stop"]),
    ("볼륨", ["up", "down"]),
    ("이퀄라이저", ["on", "off"]),
]

names = [n for n, _ in parameters]
domains = [v for _, v in parameters]

# 제약이 있을 경우 filter_func에 조건 추가 가능
for i, combo in enumerate(AllPairs(domains), start=1):
    print(f"TC{i}: " + ", ".join(f"{n}={v}" for n, v in zip(names, combo)))

출력 예에서는 4개 테스트 케이스가 생성된다. 제약 조건이 있다면 필터 함수로 금지 조합을 배제할 수 있다.

전수 조합과 n-wise 선택의 차이

구분 테스트 수 증가율 커버리지 수준 결함 검출력(현업 체감) 생성 난이도 운영 편의
전수(Exhaustive) 지수적 증가 100% 모든 n-wise 최고, 비용 과다 낮음 낮음
페어와이즈(2-wise) 완화(준선형~아핀) 모든 2-wise 100% 높음(다수 결함 포착) 중간 높음
3-wise 급증(2-wise 대비 2~5배) 모든 3-wise 100% 매우 높음 높음 중간

실제 테스트 수는 파라미터 수, 수준 수, 제약 조건에 따라 달라진다. 3수준 5파라미터의 2-wise는 대개 9~13개 범위에서 생성되며, 정확한 수는 CA 구성에 의존한다.

비용을 줄이면서 상호작용 결함을 다루는 방식

도메인과 제약에 따라 테스트 케이스 수는 50~90% 절감할 수 있고, 준비·실행 시간 및 인프라 비용도 동일 비율로 줄어든다. 상호작용 기반 결함을 조기에 발견하고 회귀 테스트를 안정화하는 효과도 기대할 수 있다.

파라미터 모델과 커버리지 기준이 명시되므로 테스트 설계를 표준화하고 커버리지를 가시화하기 쉽다. 증분 생성과 시드 재사용은 변경에 대응하는 데 도움이 된다. 고위험 영역에는 3-wise 보강을 혼합 적용해 품질과 비용의 균형을 조정한다.

페어와이즈 테스트조합 테스트블랙박스 테스트테스트 설계커버링 배열