개념
명세 기반 기법 지도
명세 기반 테스트는 소스 코드를 보지 않고 명세에서 TC를 정한다. 무작위 입력을 생성하는 임의 (Random) 테스트도 코드를 쓰지 않으므로 명세 기반이다. 가이드가 꼽는 기법은 동등 분할·분류 트리· 경곗값 분석·신택스·조합·상태 전이·인과 그래프·결정표·시나리오 테스트다. 이 레슨은 계산이 나오는 다섯 가지를 깊게, 나머지는 정의만 본다.
동등 분할 — 클래스를 나누고 대표값을 고른다
같은 처리를 받을 것으로 기대되는 입력을 한 클래스로 묶고 클래스마다 대표값 하나를 고른다.
| 명세 형태 | 유효 클래스 | 무효 클래스 |
|---|---|---|
범위 10 ≤ X ≤ 20 | 1 (10~20) | 2 (X < 10, X > 20) |
| 값의 집합(카드·계좌·포인트) — 각각 다르게 처리 | 값마다 1 = 3 | 1 (그 밖의 값) |
| 반드시 ~이어야 함 (첫 글자가 영문) | 1 | 1 |
| 개수 1~5개 | 1 | 2 (0개, 6개 이상) |
TC를 묶을 때 규칙 두 가지가 있다.
- 유효 클래스는 한 TC에 여러 개 합쳐도 된다 (최소화 방식)
- 무효 클래스는 한 TC에 하나만 넣는다. 무효 값 둘을 함께 넣으면 첫 번째 검사에서 거절되어 두 번째 무효 처리가 실행되었는지 알 수 없다(결함 마스킹)
예: 나이(18~65)와 등급(일반·VIP) 두 입력. 유효 클래스 1 + 2 = 3, 무효 클래스 2 + 1 = 3. 최소 TC는 유효 클래스를 묶은 2개(나이 30·일반, 나이 40·VIP) + 무효 클래스마다 1개씩 3개 = 5개 다.
경곗값 분석 — 29119의 2-value·3-value
결함은 경계에서 잘 난다(> 와 >= 혼동). 가이드는 29119-4를 따라 경계 양쪽 클래스의 끝값을
모두 경곗값으로 본다. 정수 10 ≤ X ≤ 20 이면 경곗값은 9, 10, 20, 21 네 개다(16비트 정수라면
표현 한계 −32768, 32767도 경곗값으로 볼 수 있다).
| 방식 | 경곗값 하나마다 고르는 값 | 10 ≤ X ≤ 20 의 테스트 입력 |
|---|---|---|
| 2-value | 경곗값 + 경계 건너편 의 가장 가까운 값 | 9, 10, 20, 21 → 4개 |
| 3-value | 경곗값 + 양옆 가장 가까운 값 | 8, 9, 10, 11, 19, 20, 21, 22 → 8개 |
3-value에서 경곗값 9의 세트는 (8, 9, 10), 10의 세트는 (9, 10, 11)이다. 세트끼리 겹치는 값을 하나로 세면 위와 같다. 문제가 "경곗값마다 TC를 따로 구성(One-to-One)"이라고 하면 중복을 지우지 않고 세는지 반드시 읽는다.
경곗값이 잡는 결함을 보자. 명세 10 ≤ X ≤ 20 이
10 < X ≤ 20으로 구현되면 → X = 10에서 드러난다9 ≤ X ≤ 20으로 구현되면 → X = 9에서 드러난다X ≤ 20(아래 경계 누락)이면 → X = 9에서 드러난다
동등 분할 대표값(예: 0, 15, 50)은 이 셋을 모두 놓친다. 그래서 둘을 함께 쓴다.
입력이 둘 이상일 때 — 가이드 예제처럼 나이 20 ≤ 나이 ≤ 50, 신장 155 ≤ 신장 ≤ 190 이면
2-value로 나이 경곗값 4개(19, 20, 50, 51), 신장 4개(154, 155, 190, 191)다. One-to-One 방식은
한 변수를 경곗값으로 두고 다른 변수는 유효한 보통 값 으로 고정해 TC 8개를 만든다.
실수형·소수점 은 "가장 가까운 값"이 정밀도에 따라 달라진다. 소수 둘째 자리까지면 10.00의 바깥 값은 9.99다.
조합 테스트 — 네 가지 기준의 개수 공식
입력 인자가 여럿이고 각각 몇 개의 클래스(값)를 가질 때 쓴다. 인자 3개가 각각 3·4·2개 값을 가진다고 하자.
| 기준 | 정의 | 개수 | 예 |
|---|---|---|---|
| All combinations | 모든 조합 | 곱 | 3 × 4 × 2 = 24 |
| Each choice | 모든 인자의 모든 값이 최소 한 번 | 가장 큰 값 개수 | 4 |
| 페어와이즈(Pairwise) | 서로 다른 두 인자의 모든 값 쌍 이 최소 한 번 | 최소 = 가장 큰 두 값 개수의 곱 이상 | 3 × 4 = 12 이상 |
| Base choice | 기본 조합 1개 + 한 인자씩만 다른 값으로 바꿈 | 1 + Σ(값 개수 − 1) | 1 + 2 + 3 + 1 = 7 |
페어와이즈 최소 개수는 "가장 큰 두 인자 값 개수의 곱"이 하한 이다. 실제 생성 결과는 하한보다 클 수 있다(IPO 알고리즘·PICT 등 도구가 생성). 인자 4개가 모두 3개 값이면 하한 9이고, 직교 배열 L9로 정확히 9개가 된다.
손으로 페어와이즈를 만드는 순서(인자 A·B·C 각 2값):
| TC | A | B | C |
|---|---|---|---|
| 1 | a1 | b1 | c1 |
| 2 | a1 | b2 | c2 |
| 3 | a2 | b1 | c2 |
| 4 | a2 | b2 | c1 |
A-B 쌍 4개, A-C 쌍 4개, B-C 쌍 4개가 모두 나온다. 2^3 = 8개 대신 4개다.
결정표 — 조건 조합을 규칙으로
조건(원인)과 행동(결과)을 표로 놓고 규칙(열) 마다 TC 하나를 만든다. 불리언 조건 n개면 규칙은
2^n 개다. 결과가 같은 규칙은 - (무관, don't care)로 축약한다.
예: 회원이면서(C1) 구매액 5만 원 이상(C2)이면 무료배송, 쿠폰 보유(C3)면 할인.
| R1 | R2 | R3 | R4 | R5 | R6 | R7 | R8 | |
|---|---|---|---|---|---|---|---|---|
| C1 회원 | T | T | T | T | F | F | F | F |
| C2 5만 원 이상 | T | T | F | F | T | T | F | F |
| C3 쿠폰 | T | F | T | F | T | F | T | F |
| 무료배송 | ✔ | ✔ | ||||||
| 할인 | ✔ | ✔ | ✔ | ✔ |
전체 규칙 2^3 = 8. 결정표 테스트는 "논리적으로 의존적인 모든 조건 조합 을 만드는" 기법이라는 문장이 O/X로 나온다(O). 인과 그래프는 원인·결과의 논리 관계를 그래프로 그린 뒤 결정표로 바꾸는 기법이다.
상태 전이 — 표와 스위치 커버리지
상태·이벤트·전이·행동으로 동작을 모델링한다. 전구 예: 상태 OFF·ON, 이벤트 PUSH.
상태 전이표 는 모든 (상태, 이벤트) 조합을 칸으로 만들고, 정의되지 않은 칸을 무효 전이 로 드러낸다. 다이어그램에는 안 보이는 무효 전이를 찾는 것이 표의 존재 이유다.
예: 문서 결재 — 상태 작성 중·결재 대기·승인·반려, 이벤트 상신·승인·반려·수정.
| 현재 상태 \ 이벤트 | 상신 | 승인 | 반려 | 수정 |
|---|---|---|---|---|
| 작성 중 | 결재 대기 | 무효 | 무효 | 작성 중 |
| 결재 대기 | 무효 | 승인 | 반려 | 무효 |
| 승인 | 무효 | 무효 | 무효 | 무효 |
| 반려 | 무효 | 무효 | 무효 | 작성 중 |
유효 전이는 5개(작성 중 → 결재 대기, 작성 중 → 작성 중, 결재 대기 → 승인, 결재 대기 → 반려, 반려 → 작성 중), 무효 칸은 16 − 5 = 11개 다.
| 커버리지 | 덮을 것 | 이 예에서 |
|---|---|---|
| 모든 상태 | 상태마다 1회 이상 도달 | 4개 상태 |
| 0-스위치(모든 유효 전이) | 유효 전이 하나하나 | 5개 전이 |
| 1-스위치 | 연속된 두 전이의 모든 쌍 | 상태 하나에 들어오는 전이 × 나가는 전이의 합 |
| 무효 전이 | 표의 무효 칸 | 11개 |
1-스위치 개수는 상태마다 (들어오는 전이 수 × 나가는 전이 수)를 더한다. 작성 중: 들어옴 2(수정 자기 전이, 반려 → 수정) × 나감 2(상신, 수정) = 4, 결재 대기: 1 × 2 = 2, 반려: 1 × 1 = 1, 승인: 1 × 0 = 0 → 7개 다.
그 밖의 명세 기반 기법 — 정의만
- 분류 트리 — 입력을 측면별로 분류한 트리를 그리고 잎의 조합으로 TC를 만든다(s1-m03-l06)
- 신택스 테스트 — 입력 형식 문법(BNF 등)에서 유효·무효 문자열을 생성한다
- 시나리오 테스트 — 유즈케이스의 기본·대안·예외 흐름을 따라간다(s1-m03-l04)
경험 기반 — 오류 추정과 탐색적 테스트
- 오류 추정(Error guessing) — 개발자가 범할 실수를 경험·직관으로 추정해 그 결함이 드러날 TC를
만든다.
tan(x)에 90°, 정렬 함수에 빈 목록·원소 하나·전부 같은 값·이미 정렬된 목록, 필수 입력 누락, 길이 제약 위반, 형식 위반, 명시적·묵시적 범위 위반. 동등 분할의 무효 클래스 를 정할 때 함께 쓴다 - 탐색적 테스트 — 대상 이해·TC 설계·실행을 병행 한다. 사전 명세서 없이 즉석에서 TC를 정하고 결과로 다음 테스트를 정한다. 효과는 테스터 지식에 의존한다. 간단한 차터 로 범위를 정하고, 개발 주기가 짧은 애자일·웹 시스템에 적합하다(s2-m05 모듈)
실무에서 왜 필요한가
계산 공식은 TC 수를 협상하는 언어 다. "옵션 5개가 각각 4가지 값이라 전체 조합은 1,024개지만 페어와이즈로 20개 안팎이면 두 옵션 사이 상호작용 결함은 모두 덮는다"는 설명은 일정 회의에서 바로 쓰인다. 결정표와 상태 전이표는 명세의 빈칸 을 찾는 도구이기도 하다 — 표를 그리다 "반려 상태에서 상신하면?"이라는 칸이 비어 있으면 그것은 TC가 아니라 기획 질문이다. 테스트 설계 이전에 요구 리뷰에서 그 질문을 던질 수 있다(s1-m02-l03).