구조 테스트에서 커버리지 기준으로 분기 로직 검증하기
구조 테스트의 결정·조건·조건/결정·MC/DC 커버리지를 비교하고, age와 length_id 분기식으로 테스트 케이스를 설계하는 방법을 정리한다.
2026-08-14 · 최초 발행 2025-12-15
소스코드의 분기 구조를 직접 검증하려면 입력값 자체보다 조건과 결정이 어떻게 연결되는지를 먼저 분리해야 한다. IF(age>18 OR length_id>6)를 대상으로 결정·조건·조건/결정·변경조건/결정(MC/DC) 커버리지를 적용하면, 필요한 최소 테스트 집합과 검증 범위를 구체적으로 잡을 수 있다.
분기식을 조건과 결정으로 나누기
이 예시의 조건은 다음과 같다.
- 조건 A:
age > 18 - 조건 B:
length_id > 6 - 결정 D:
A OR B
결정 커버리지는 D가 1과 0을 모두 내도록 테스트를 구성한다. 조건 커버리지는 A와 B가 각각 1과 0을 한 번 이상 갖도록 요구한다. 조건/결정 커버리지는 두 기준을 함께 충족한다.
MC/DC는 한 조건만 바뀌었을 때 결정 D도 달라지는지를 입증한다. 다른 조건을 고정한 상태에서 각 조건의 독립적인 영향을 확인하는 방식이다.
실제 입력값은 불리언 조건으로 먼저 추상화한다. 이렇게 하면 분기 공간을 줄이고 테스트 설계를 일관되게 유지할 수 있다. 필요한 최소 케이스 수는 OR, AND, XOR 같은 논리 연산자에 따라 달라진다.
A의 대표값은 age=19일 때 1, age=18일 때 0이다. B는 length_id=7일 때 1, length_id=6일 때 0으로 대응시킬 수 있다.
목표 커버리지에서 입력값까지 이어지는 과정
테스트 설계는 다음 순서로 진행한다.
A=age>18,B=length_id>6,D=A OR B를 모델링한다.- 결정, 조건, 조건/결정, MC/DC 중 목표 커버리지를 정한다.
(A,B)조합에서 최소 테스트 집합을 도출한다.age,length_id에 구체적인 대표 입력값을 매핑한다.- D의 기대값(1/0)을 확인하고 중복과 누락을 점검한다.
커버리지 기준, 테스트 케이스, 입력 데이터, 결정 결과를 연결해 두면 조건 변경 시 영향도도 추적할 수 있다.
결정 결과를 모두 통과시키는 테스트
결정 커버리지는 D가 1과 0을 모두 내는지 확인한다. 최소 케이스는 2개다.
(A,B)는 (0,0)→D=0, (1,0)→D=1로 구성할 수 있다. 또는 (0,0)→0, (0,1)→1도 가능하다.
- TC1
(0,0):age=18,length_id=6→D=0(미호출) - TC2
(1,0):age=19,length_id=6→D=1(join 호출)
각 조건의 참과 거짓을 확인하는 방법
조건 커버리지는 A와 B가 각각 1과 0을 산출하도록 구성한다. 최소 케이스는 2개다.
(0,0), (1,1) 또는 (1,0), (0,1) 조합을 사용할 수 있다.
- TC1
(0,0):age=18,length_id=6→A=0,B=0 - TC2
(1,1):age=19,length_id=7→A=1,B=1
조건과 결정의 범위를 함께 맞추기
조건/결정 커버리지는 조건 커버리지와 결정 커버리지를 동시에 만족시킨다. 이 표현식에서는 최소 2개로 구성할 수 있다.
- TC1
(0,0):age=18,length_id=6→D=0 - TC2
(1,1):age=19,length_id=7→D=1
조건 하나가 결정에 미치는 영향을 증명하는 MC/DC
MC/DC의 목표는 각 조건이 단독으로 D의 변화를 유발함을 보이는 것이다. 최소 케이스는 3개다.
A는 B를 0으로 고정한 상태에서 확인한다. (0,0)→D=0과 (1,0)→D=1을 비교하면 A의 독립 영향성을 볼 수 있다. B는 A를 0으로 고정해 (0,0)→D=0과 (0,1)→D=1을 비교한다.
통합 최소 집합은 {(0,0), (1,0), (0,1)}이다.
- TC1
(0,0):age=18,length_id=6→D=0 - TC2
(1,0):age=19,length_id=6→D=1 - TC3
(0,1):age=18,length_id=7→D=1
커버리지 기준별 선택 기준
| 커버리지 기준 | 최소 테스트 수 | 효율성(케이스 수) | 결함 탐지력(논리 결함) | 일관성/추적성 | 예시 (A,B) |
|---|---|---|---|---|---|
| 결정 | 2 | 높음 | 중간 | 중간 | (0,0), (1,0) |
| 조건 | 2 | 높음 | 중간~높음 | 중간 | (0,0), (1,1) |
| 조건/결정 | 2 | 높음 | 높음 | 높음 | (0,0), (1,1) |
| MC/DC | 3 | 중간 | 매우 높음 | 매우 높음 | (0,0), (1,0), (0,1) |
효율성은 최소 케이스 수를 기준으로 한 상대 비교다. 논리 결함 탐지력은 불리언 조합에서 각 조건의 독립 영향성을 확인할 수 있는지에 좌우된다. 요구사항부터 조건, 결정, 테스트까지 이어지는 연결을 관리할수록 일관성과 추적성도 높아진다.
조건 조합이 중요한 로직에서의 적용
보험·금융 가입 조건처럼 OR/AND 조합이 많은 로직에서는 MC/DC로 논리 누락과 우선순위 오류를 조기에 찾을 수 있다. 인증과 입력 검증에서도 길이, 포맷, 나이 같은 다중 조건이 결과에 미치는 영향을 분리해 예외 처리의 신뢰성을 확인한다.
임베디드·항공우주 등 안전 크리티컬 영역은 규제와 표준(DO-178C 등) 준수를 위해 MC/DC를 요구한다. 단순한 논리식이라도 MC/DC의 기본기를 표준 작업으로 정착시키는 이유다.
완전 조합과 테스트 범위의 균형
단순 독립 조건을 가정하면 MC/DC는 완전 조합 2^n에서 대략 n+1 수준까지 테스트를 축소할 수 있다. 이 예시에서는 2조건의 완전 조합 4개가 3개로 줄어 25% 감소한다. 회귀 테스트 시간과 사이클 타임을 줄이는 데도 연결된다.
테스트 설계가 명료해지면 누락된 조건, 잘못된 연산자, 우선순위 오해 같은 논리 결함을 더 일찍 발견할 수 있다. 신규 기능에는 조건/결정 이상을 적용하고, 안전·규제 영역에는 MC/DC를 도입하는 기준을 둘 수 있다.