페어와이즈 테스트란 복수의 파라미터 조합을 「임의의 2개 파라미터가 최소 1회씩 테스트된다」는 것을 보증하면서 테스트 케이스 수를 대폭 줄이는 테스트 설계 기법입니다. OS·브라우저·설정 항목의 조합 폭발을 효율적으로 해소할 수 있습니다.
💡 한 마디로 말하면
페어와이즈 테스트 = 「전체 조합을 테스트하지 않고 페어의 망라성으로 버그를 효율적으로 발견하는 기법」
페어와이즈 테스트를 사용하면 「모든 패턴을 테스트해야 한다」는 압박에서 해방되어 적은 테스트 케이스로 높은 버그 검출률을 실현할 수 있습니다. 연구에 따르면 대부분의 버그는 2개의 파라미터 상호 작용에서 발생하기 때문입니다.
📌 이런 분께 추천합니다
- 페어와이즈 테스트를 처음 배우는 QA 엔지니어·개발자
- 조합 테스트의 케이스 수가 너무 많아 곤란한 분
- OS·브라우저·설정 항목의 조합 테스트를 효율화하고 싶은 분
- 디시전 테이블에서는 조건이 너무 많은 장면을 해결하고 싶은 분
✅ 이 글을 읽으면 얻을 수 있는 것
- 페어와이즈 테스트의 사고방식과 테스트 케이스 삭감의 구조를 알 수 있다
- allpairspy를 사용한 Python으로의 테스트 케이스 자동 생성 방법을 알 수 있다
- pytest의 parametrize와의 조합으로 자동 테스트에 활용할 수 있다
👤 이 글을 쓴 사람
QA 엔지니어·테스트 자동화 엔지니어로서 15년 이상의 실무 경험을 가진 Yoshi가 집필. 페어와이즈 테스트는 설정 항목이 많은 시스템이나 크로스 브라우저 테스트에서 실제로 활용하고 있는 기법입니다. 구현 코드는 GitHub에 공개 중입니다: github.com/YOSHITSUGU728/automated-testing-portfolio
「OS 3종류 × 브라우저 4종류 × 언어 설정 2종류 = 24패턴」——설정 항목이 늘어날수록 테스트 수가 지수적으로 증가하고 있지 않으신가요?
- 조건이 늘어날수록 전체 조합이 폭발적으로 증가하여 테스트가 따라가지 못한다
- 전체 패턴을 실행할 시간도 리소스도 없다
- 그렇다고 테스트를 너무 줄이면 누락이 걱정된다
페어와이즈 테스트는 이런 문제를 해결하는 기법입니다. 이 글에서는 개념부터 구체적인 테스트 케이스 생성·pytest 응용까지 한 번에 해설합니다.
📌 결론
- 「임의의 2개 파라미터 조합이 최소 1회 테스트된다」는 것을 보증하는 테스트 설계 기법
- 3파라미터×3값=27패턴을 9〜12패턴 정도로 삭감할 수 있다
- Python의
allpairspy로 테스트 케이스를 자동 생성하여parametrize에 전달하면 자동 테스트로 즉시 변환할 수 있다
페어와이즈 테스트란?
페어와이즈 테스트(Pairwise Testing)란 「복수의 파라미터 중에서 임의의 2개 페어가 반드시 1회 이상 테스트되는」 최소한의 테스트 케이스 세트를 생성하는 테스트 설계 기법입니다. 「2인자 간 망라」「올 페어법」이라고도 불립니다.
왜 「2개의 페어」로 충분한가 하면 연구에 의해 대부분의 버그는 1〜2개의 파라미터 조합에 의해 발생한다는 것이 밝혀졌기 때문입니다. 3개 이상의 파라미터가 동시에 특정 값이 될 때 비로소 발생하는 버그는 매우 드뭅니다.
| 테스트 기법 | 3파라미터×3값의 경우 | 특징 |
|---|---|---|
| 전체 조합 | 27패턴 | 완전한 망라성·현실적이지 않음 |
| 페어와이즈 테스트 | 9〜12패턴 | 페어 망라성·높은 버그 검출률 |
| 랜덤 샘플링 | 임의 | 재현성 없음·망라성 보증 없음 |
페어와이즈 테스트의 구조란?
페어와이즈 테스트가 어떻게 테스트 케이스를 삭감하는지 구체적인 예시로 확인합니다.
예시:웹 앱의 크로스 환경 테스트
다음 3가지 파라미터를 가진 시스템을 테스트하는 경우를 생각해봅니다.
📋 테스트 파라미터
| 파라미터 | 값① | 값② | 값③ |
|---|---|---|---|
| OS | Windows | macOS | Linux |
| 브라우저 | Chrome | Firefox | Safari |
| 언어 설정 | 한국어 | 일본어 | 영어 |
전체 조합:3 × 3 × 3 = 27패턴 → 페어와이즈:9패턴 정도로 삭감
페어와이즈법으로 생성된 9패턴
| # | OS | 브라우저 | 언어 설정 |
|---|---|---|---|
| 1 | Windows | Chrome | 한국어 |
| 2 | Windows | Firefox | 일본어 |
| 3 | Windows | Safari | 영어 |
| 4 | macOS | Chrome | 일본어 |
| 5 | macOS | Firefox | 영어 |
| 6 | macOS | Safari | 한국어 |
| 7 | Linux | Chrome | 영어 |
| 8 | Linux | Firefox | 한국어 |
| 9 | Linux | Safari | 일본어 |
이 9패턴으로 「OS×브라우저」「OS×언어 설정」「브라우저×언어 설정」의 모든 조합이 최소 1회 커버됩니다. 27패턴에서 67% 삭감하면서 2파라미터 간 망라성은 완전하게 유지됩니다.
디시전 테이블과의 차이란?
같은 「조합 테스트」 계열의 기법이어도 디시전 테이블과 페어와이즈 테스트는 사용 구분해야 하는 장면이 명확히 다릅니다.
| 비교 항목 | 디시전 테이블 | 페어와이즈 테스트 |
|---|---|---|
| 조건 수 | 2〜5개 정도 | 5개 이상도 대응 가능 |
| 망라성 | 전체 조합을 망라 | 2파라미터 간의 페어를 망라 |
| 잘하는 장면 | 업무 로직·권한 관리 | 환경 설정·파라미터 조합 |
| 조건 간 의존 | 의존 관계를 명시할 수 있다 | 독립된 파라미터에 적합 |
💡 판단 기준
- 조건이 2〜5개·업무 로직 검증 → 디시전 테이블
- 조건이 5개 이상·환경이나 파라미터 조합 → 페어와이즈 테스트
- 조건 간에 강한 의존 관계가 있다 → 디시전 테이블이 더 안전
allpairspy를 사용한 테스트 케이스 자동 생성
페어와이즈 테스트의 케이스를 수동으로 설계하는 것은 어렵기 때문에 실무에서는 allpairspy(Python)등의 도구로 자동 생성합니다.
설치
pip install allpairspy테스트 케이스의 자동 생성
from allpairspy import AllPairs
# 파라미터를 정의
parameters = [
["Windows", "macOS", "Linux"], # OS
["Chrome", "Firefox", "Safari"], # 브라우저
["한국어", "일본어", "영어"], # 언어 설정
]
# 페어와이즈 테스트 케이스를 자동 생성
test_cases = [case.test_parameters for case in AllPairs(parameters)]
for i, case in enumerate(test_cases, 1):
print(f"케이스{i}: OS={case[0]}, 브라우저={case[1]}, 언어={case[2]}")실행 결과(출력 예시)
케이스1: OS=Windows, 브라우저=Chrome, 언어=한국어
케이스2: OS=Windows, 브라우저=Firefox, 언어=일본어
케이스3: OS=Windows, 브라우저=Safari, 언어=영어
케이스4: OS=macOS, 브라우저=Chrome, 언어=일본어
케이스5: OS=macOS, 브라우저=Firefox, 언어=영어
케이스6: OS=macOS, 브라우저=Safari, 언어=한국어
케이스7: OS=Linux, 브라우저=Chrome, 언어=영어
케이스8: OS=Linux, 브라우저=Firefox, 언어=한국어
케이스9: OS=Linux, 브라우저=Safari, 언어=일본어
# 27패턴 → 9패턴으로 삭감!allpairspy가 자동으로 최적의 테스트 세트를 계산합니다. 4파라미터×3값=81패턴도 12〜15패턴 정도로 삭감할 수 있습니다.pytest의 parametrize와의 조합
생성한 테스트 케이스를 그대로 pytest의 @pytest.mark.parametrize에 전달하면 자동 테스트로 즉시 변환할 수 있습니다.
import pytest
from allpairspy import AllPairs
# 파라미터를 정의
parameters = [
["Windows", "macOS", "Linux"],
["Chrome", "Firefox", "Safari"],
["한국어", "일본어", "영어"],
]
# allpairspy로 테스트 케이스를 생성
pairwise_cases = [case.test_parameters for case in AllPairs(parameters)]
# 그대로 parametrize에 전달
@pytest.mark.parametrize("os, browser, language", pairwise_cases)
def test_web_app_cross_env(os, browser, language):
"""페어와이즈 테스트:크로스 환경에서 웹 앱이 정상 동작하는지 확인"""
print(f"테스트 환경: {os} / {browser} / {language}")
# 여기에 실제 테스트 로직을 기술
# 예:Playwright로 브라우저를 실행하여 검증 등
assert True # 구현 시에는 여기에 검증 코드를 추가실행 결과 샘플
$ pytest test_pairwise.py -v
collected 9 items
test_pairwise.py::test_web_app_cross_env[Windows-Chrome-한국어] PASSED
test_pairwise.py::test_web_app_cross_env[Windows-Firefox-일본어] PASSED
test_pairwise.py::test_web_app_cross_env[Windows-Safari-영어] PASSED
test_pairwise.py::test_web_app_cross_env[macOS-Chrome-일본어] PASSED
test_pairwise.py::test_web_app_cross_env[macOS-Firefox-영어] PASSED
test_pairwise.py::test_web_app_cross_env[macOS-Safari-한국어] PASSED
test_pairwise.py::test_web_app_cross_env[Linux-Chrome-영어] PASSED
test_pairwise.py::test_web_app_cross_env[Linux-Firefox-한국어] PASSED
test_pairwise.py::test_web_app_cross_env[Linux-Safari-일본어] PASSED
========================== 9 passed in 0.08s ===========================allpairspy로 생성한 케이스를 그대로 parametrize에 전달하는 설계로 해두면 파라미터가 추가·변경되어도 코드 수정이 최소화됩니다. 파라미터 리스트를 설정 파일이나 픽스처로 관리하면 유지보수성이 더욱 높아집니다.페어와이즈 테스트가 특히 유효한 장면
페어와이즈 테스트가 실무에서 특히 효과를 발휘하는 장면을 정리합니다.
| 장면 | 파라미터 예시 | 삭감 효과 |
|---|---|---|
| 크로스 브라우저·OS 테스트 | OS × 브라우저 × 화면 크기 | 27→9패턴(67% 삭감) |
| 설정 화면 테스트 | 테마 × 폰트 크기 × 언어 × 알림 설정 | 81→12패턴(85% 삭감) |
| API 파라미터 테스트 | 정렬 순서 × 필터 조건 × 페이지 크기 × 포맷 | 대폭 삭감 가능 |
| Playwright 디바이스 테스트 | 디바이스 × 네트워크 속도 × 로케일 | 27→9패턴(67% 삭감) |
⚠️ 페어와이즈 테스트에서 자주 있는 실패 패턴 4선
실무에서 페어와이즈 테스트를 적용할 때 빠지기 쉬운 실패를 소개합니다.
① 강한 의존 관계가 있는 파라미터에 페어와이즈를 적용한다
예를 들어 「iOS에서만 Safari가 동작한다」는 의존 관계가 있는 경우 페어와이즈 테스트가 「Windows × Safari」라는 실제로는 발생할 수 없는 조합을 생성해버립니다. 파라미터 간에 강한 의존 관계가 있는 경우에는 디시전 테이블이 더 적절합니다.
② 3개 이상의 파라미터 상호 작용이 중요한 시스템에 적용한다
페어와이즈 테스트는 「2파라미터 간의 페어」를 망라하지만 「3파라미터가 특정 값의 조합일 때 발생하는 버그」는 놓칠 가능성이 있습니다. 안전성이 요구되는 시스템이나 3인자 이상의 상호 작용이 중요한 경우에는 3-wise·4-wise 등 더 높은 망라도를 검토하세요.
③ 페어와이즈 테스트만으로 모든 테스트를 대체하려 한다
페어와이즈 테스트는 조합 테스트를 효율화하는 기법이며 단위 테스트·동등 분할·경계값 분석의 대신이 될 수 없습니다. 「조합의 망라」에는 페어와이즈, 「값의 범위 검증」에는 동등 분할·경계값 분석처럼 목적에 따라 기법을 사용 구분하세요.
④ 도구 맡김으로 테스트 케이스의 내용을 확인하지 않는다
allpairspy 등의 도구가 생성한 테스트 케이스를 확인하지 않고 그대로 사용해버리는 케이스입니다. 불가능한 조합(예:macOS × Internet Explorer)이 포함되지 않았는지, 중요한 페어가 빠져 있지 않은지를 반드시 육안으로 확인하고 나서 자동 테스트에 포함시키세요.
FAQ
Q. 페어와이즈 테스트는 언제 사용해야 하나요?
파라미터가 5개 이상 있어 전체 조합 테스트가 비현실적인 경우에 사용합니다. OS·브라우저·디바이스·언어 설정·화면 크기 등 독립된 파라미터가 많은 환경 설정 계열 테스트에 특히 유효합니다. 조건이 2〜4개 정도이고 파라미터 간에 의존 관계가 있는 경우에는 디시전 테이블이 더 적합합니다.
Q. 페어와이즈 테스트와 디시전 테이블은 어떻게 사용 구분하나요?
디시전 테이블은 「조건이 2〜5개·업무 로직·조건 간에 의존 관계 있음」인 경우에 사용합니다. 페어와이즈 테스트는 「파라미터가 5개 이상·환경 설정·파라미터가 독립적」인 경우에 사용합니다. 실무에서는 양쪽을 조합하는 경우도 있어 업무 로직은 디시전 테이블, 크로스 환경 테스트는 페어와이즈라는 사용 구분이 일반적입니다.
Q. 버그를 100% 찾을 수 있나요?
아니오. 페어와이즈 테스트는 「전체 조합 테스트보다 효율적으로 많은 버그를 찾는」 기법이며 100%의 보증은 할 수 없습니다. 3개 이상의 파라미터가 특정 값이 될 때 비로소 발생하는 버그는 놓칠 가능성이 있습니다. 중요도·리스크에 따라 전체 조합 테스트나 더 높은 인자 수의 테스트와 조합하는 것을 검토하세요.
Q. ISTQB에서 페어와이즈 테스트는 출제되나요?
ISTQB Foundation Level에서는 페어와이즈 테스트(2인자 간 망라)의 개념이 출제 범위에 포함되어 있습니다. 「전체 조합 테스트와의 차이」「2인자 간 망라의 의미」「적용 장면」을 이해해 두면 대응할 수 있습니다. 상위 자격인 Advanced Level에서는 더 상세한 지식이 요구됩니다.
📖 관련 글
실무에서는 크로스 브라우저 테스트 설계에 allpairspy로 테스트 케이스를 생성하고 Playwright × pytest의 parametrize에 전달하는 워크플로우를 자주 사용하고 있습니다. 파라미터의 추가·변경이 파라미터 리스트의 업데이트만으로 되기 때문에 테스트 설계와 구현의 유지보수 비용을 대폭 줄일 수 있습니다.
📋 이 글의 정리
- 페어와이즈 테스트는 「임의의 2파라미터의 페어가 최소 1회 테스트된다」를 보증하는 테스트 설계 기법
- 3파라미터×3값=27패턴 → 9패턴 정도로 삭감하면서 페어 망라성을 유지
- Python의
allpairspy로 테스트 케이스를 자동 생성하여parametrize에 전달하면 즉시 자동 테스트화 - 파라미터가 독립적이고 5개 이상인 경우에 특히 유효(의존 관계가 있는 경우에는 디시전 테이블을 검토)
- 3파라미터 이상의 상호 작용이 중요한 경우에는 더 높은 인자 수의 테스트와의 병용을 검토
페어와이즈 테스트는 「전부 테스트하고 싶지만 시간이 없다」는 딜레마를 해결하는 현실적인 기법입니다. 먼저 allpairspy를 설치하여 손 가까이의 설정 항목이나 크로스 환경 테스트에 적용해 보세요. 27패턴이 9패턴이 되는 순간 테스트 설계에 대한 시각이 바뀝니다.

