426. 변경 조건/결정 커버리지 (MC/DC)
핵심 인사이트 (3줄 요약)
- 본질: 변경 조건/결정 커버리지(Modified Condition/Decision Coverage, MC/DC)란 화이트박스 테스트에서 각 개별 조건이 전체 결정 결과에 독립적으로 영향을 미침을 증명하는 테스트 커버리지 지표이다. N개의 조건에 대해 최소 N+1개의 테스트로 모든 조건의 독립적 영향을 검증한다.
- 가치: 단순히 모든 조합을 테스트하는 것보다 효율적이면서도, 각 조건의 독립적인 영향력을 증명함으로써, 단일 조건 결함과 조건 간 상호작용 결함을 모두 발견할 수 있다.
- 융합: DO-178C에서 Level A (가장 높은 안전 수준)의 항공기 소프트웨어에 필수적으로 요구되며, 항공기 자동비행, 원자력 발전소 제어 등 극히 안전한 시스템 검증에 활용된다.
Ⅰ. 개요 및 필요성 (Context & Necessity)
-
개념: MC/DC는 각 개별 조건이 전체 결정 결과에 독립적으로 영향을 미치는지 증명하는 커버리지 지표이다. N개의 조건으로 구성된 결정에서 각 조건을 독립적으로 변경하면서 전체 결과가 변경되는지를 확인한다. 이를 통해 조건 간 상호의존성이나 특정 조건의 잘못된 구현을 발견할 수 있다.
-
필요성: 조건 커버리지나 결정 커버리지는 개별 조건이나 전체 결정의 참/거짓取值만을 검증하지만, "각 조건이 전체 결과에 독립적으로 기여하는지"는 검증하지 않는다. MC/DC는 이러한 조건 간 독립성을 증명함으로써, 예를 들어 "A and B"라는 조건에서 A의 값이 변경될 때 전체 결과가 반드시 변경되어야 한다는 것을 검증한다.
-
독립적 영향(Independent Effect)의 정의: 하나의 조건을 변경했을 때(다른 조건들은 고정된 상태에서), 전체 결정의 결과가 반드시 변경되는 경우, 해당 조건은 전체 결정에 독립적으로 영향을 미친다고 한다.
-
비유: MC/DC는 **'오케스트라 악기별 기여도 분석'**과 같다. 오케스트라에서 비올라(조건1)의 음량을 변경했을 때 전체 오케스트라 소리(결정)가 반드시 달라져야 비올라가 전체 소리에 독립적으로 기여하는 것이다. 만약 비올라를 묵 Automobile어도 전체 소리가 동일하다면, 비올라는 의미 없는 조건이다.
-
등장 배경 및 발전 과정:
- 1980년대: NASA와 항공 업계에서 개발, DO-178B 초안에서 개념 정립
- 1990년대: DO-178B 표준에서 Level A 시스템에 MC/DC 필수 요구
- 현재: DO-178C, ISO 26262(ASIL D), IEC 61508(SIL 4) 등 최상위 안전 표준에 적용
-
섹션 요약 비유: MC/DC는 **'자동차 pedals 상호작용 분석'**과 같다. 자동차에서Accelerator(조건1)와 Brake(조건2)는 모두 차량 속도(결정)에 영향을 미친다. 그러나 Accelerator를 밟으면 속도가 증가하고, Brake를 밟으면 속도가 감소한다. 한쪽을 변경했을 때 결과가 반드시 변경되어야"독립적 영향"이 있다. MC/DC는 이러한 독립적 영향을漏らさず 검증한다.
Ⅱ. 아키텍처 및 핵심 원리 (Deep Dive)
MC/DC 원리
[MC/DC 원리]
코드:
if (C1 and C2 and C3):
action()
※ C1, C2, C3: 3개의 개별 조건
※ 전체 결정: C1 and C2 and C3
MC/DC 요구사항:
- 각 조건 C1, C2, C3에 대해:
해당 조건만 변경하고 다른 조건은 고정했을 때,
전체 결정의 결과가 변경되는 경우가 반드시 있어야 함
┌─────────────────────────────────────────────────────────────────┐
│ MC/DC 테스트 조합 예시 │
├─────────────────────────────────────────────────────────────────┤
│ │
│ TC │ C1 │ C2 │ C3 │ C1 and C2 and C3 │ 검증 대상 │
│ ──────────────────────────────────────────────────────────── │
│ TC-01 │ T │ T │ T │ T │ │
│ TC-02 │ F │ T │ T │ F │ C1 검증 ✓ │
│ TC-03 │ T │ F │ T │ F │ C2 검증 ✓ │
│ TC-04 │ T │ T │ F │ F │ C3 검증 ✓ │
│ │
│ ※ TC-01을 기준으로, TC-02는 C1만 F로 변경하여 결과가 F로 변경 │
│ ※ TC-01을 기준으로, TC-03은 C2만 F로 변경하여 결과가 F로 변경 │
│ ※ TC-01을 기준으로, TC-04는 C3만 F로 변경하여 결과가 F로 변경 │
│ ※ 4개 TC (N+1 = 3+1 = 4개)로서 MC/DC 달성 │
│ │
└─────────────────────────────────────────────────────────────────┘
[다이어그램 해설] TC-01에서 모든 조건이 참일 때 전체 결정도 참이다. TC-02에서는 C1만 거짓으로 변경하면 전체 결과가 거짓으로 변경되므로 C1의 독립적 영향이 증명된다. 마찬가지로 TC-03에서는 C2만, TC-04에서는 C3만 변경하여 각 조건의 독립적 영향을 증명한다.
MC/DC vs 다중 조건 커버리지
[MC/DC vs 다중 조건 커버리지]
코드:
if (C1 and C2):
action()
┌─────────────────────────────────────────────────────────────────┐
│ 커버리지 수준별 비교 │
├─────────────────────────────────────────────────────────────────┤
│ │
│ 다중 조건 커버리지 (MCC): │
│ - TT, TF, FT, FF: 4개 테스트 필요 (모든 조합) │
│ │
│ MC/DC: │
│ - TC-01: C1=T, C2=T → 결과=T │
│ - TC-02: C1=F, C2=T → 결과=F (C1 독립성 증명) │
│ - TC-03: C1=T, C2=F → 결과=F (C2 독립성 증명) │
│ ※ 3개 테스트 (N+1 = 2+1 = 3개) │
│ │
│ ※ MC/DC는 MCC보다 적은 테스트로 동등한 검증 효과 │
│ ※ "각 조건이 독립적으로 결과에 영향을 미친다"는 것을 증명 │
│ │
└─────────────────────────────────────────────────────────────────┘
[다이어그램 해설] MCC(Multiple Condition Coverage)는 모든 조건 조합(2^N개)을 테스트하지만, MC/DC는 N+1개의 테스트로 각 조건의 독립적 영향을 증명한다. 예를 들어 C1 and C2에서 C1의 독립성을 증명하려면 C1만 변경하여 전체 결과가 변경되는 경우를 보여주면 된다.
OR 조건에서의 MC/DC
[OR 조건에서 MC/DC]
코드:
if (C1 or C2):
action()
MC/DC 요구사항:
- C1이 독립적으로 결과에 영향을 미침을 증명
- C2가 독립적으로 결과에 영향을 미침을 증명
TC-01: C1=F, C2=F → 결과=F
TC-02: C1=T, C2=F → 결과=T (C1 독립성 증명: C1=F→T, 전체: F→T)
TC-03: C1=F, C2=T → 결과=T (C2 독립성 증명: C2=F→T, 전체: F→T)
※ 3개 테스트 (N+1 = 2+1 = 3개) 달성
Ⅲ. 구현 및 실무 응용 (Implementation & Practice)
MC/DC 테스트 케이스 도출 절차
[MC/DC 테스트 케이스 도출 절차]
1단계: 조건 분석
│
└─→ 복합 조건 내의 개별 조건들을 식별
2단계: 기본 테스트 케이스 선택
│
└─→ 모든 조건이 참인 TC 선택 (또는 모든 조건이 거짓인 TC)
3단계: 각 조건의 독립성 증명 TC 도출
│
├─→ 기준 TC에서 한 조건만 변경
└─→ 전체 결과가 변경되는 경우 선택
4단계: 최소 테스트 세트 확인
│
└─→ 중복 제거, N+1개 TC 확인
DO-178C Level A 적용
[DO-178C Level A에서 MC/DC 요구사항]
DO-178C는 항공기 소프트웨어 개발 표준:
- Level A: 파손 시 항공기와乗客에 치명적 영향 → MC/DC 필수
- Level B: 파손 시 重症 → 결정 커버리지 이상
- Level C: 파손 시 軽症 → 조건 커버리지 이상
- Level D: 파손 시 影响 거의 없음 → 구문 커버리지 이상
- Level E: 파손 시 影响 없음 → 커버리지 요구사항 없음
※ 항공기 자동비행 제어 시스템은 Level A에 해당 → MC/DC 필수
실제 사례: 항공기 비행 제어
[항공기 비행 제어 시스템 적용]
예시: 자동 착륙 시스템 진입 조건
조건:
- C1: 고도 < 1000ft
- C2: 접지 최소 속도 도달
- C3: ILS 신호 안정
결정: C1 and C2 and C3
if (C1 and C2 and C3):
initiateAutoLanding()
※ 모든 조건이 참이어야 자동 착륙 진행
※ MC/DC를 통해 각 조건의 독립적 영향 검증
※ 한 조건이라도 결함이 있으면 전체 시스템 동작에 영향
Ⅳ. 품질 관리 및 테스트 (Quality & Testing)
MC/DC 장단점
[MC/DC 장단점]
장점:
├─ 각 조건의 독립적 영향을 체계적으로 증명
├─ 다중 조건 커버리지보다 효율적 (N+1 vs 2^N)
├─ 단일 조건 결함과 조건 상호작용 결함 모두 발견
├─ 안전 중요 시스템의 엄격한 검증 요구사항 충족
└─ DO-178C, ISO 26262 등 국제 안전 표준认证에 필수
단점:
├─ 복잡한 조건문에서 테스트 케이스 도출이 어려울 수 있음
├─ N+1 원칙이 항상 적용 가능한 것은 아님 (조건 간 상호의존성)
├─ Short-Circuit 평가 환경에서 주의 필요
└─ 달성하기 위한 노력과 시간이 상당함
커버리지 수준별 총정리
[커버리지 수준 총정리]
┌─────────────────────────────────────────────────────────────────┐
│ 커버리지 수준별 비교 (N개 조건 가정) │
├─────────────────────────────────────────────────────────────────┤
│ │
│ 수준 │ 필요한 TC 수 │ 검증 내용 │
│ ──────────────────────────────────────────────────────────── │
│ 구문 (Statement) │ 가변 │ 모든 문장 실행 │
│ 결정 (Decision) │ 2 │ 분기문 전체의 T/F │
│ 조건 (Condition) │ 2 │ 개별 조건의 T/F │
│ 조건/결정 (C/DC) │ 2~3 │ 위 두 가지 모두 충족 │
│ MC/DC │ N+1 │ 각 조건의 독립적 영향 증명 │
│ 다중 조건 (MCC) │ 2^N │ 모든 조합 검증 │
│ │
│ ※ 상위 수준으로 갈수록 더 엄격하고漏らなき 테스트 │
│ ※ 안전 중요도, 프로젝트 상황에 맞는 수준 선택 필요 │
│ │
└─────────────────────────────────────────────────────────────────┘
- 섹션 요약 비유: MC/DC는 **'심리테스트 각 문항 기여도 분석'**과 같다. 심리테스트에서 각 문항(조건)이 전체 결과(결정)에 독립적으로 기여하는지 분석하는 것처럼, MC/DC는 각 조건이 전체 결정에 독립적으로 영향을 미치는지 체계적으로 증명한다. 만약 어떤 문항이 전체 결과에 영향을 주지 않는다면, 그 문항은 불필요하거나 잘못된 것이며修正해야 한다.
Ⅴ. 최신 트렌드 및 결론 (Trends & Conclusion)
최신 동향
- 도구 자동화: LDRA, QA-Systems 등의 상용 도구가 MC/DC 테스트 케이스를 자동으로 생성하고, 커버리지를 측정하여 인증서를提供
- AI 기반 분석: AI가 코드의 조건 구조를 분석하여 MC/DC 달성을 위한 최적의 테스트 케이스 조합을 제안하는 도구开发
- 항공 외 적용 확대: 항공기뿐 아니라 자동차(ISO 26262 ASIL D), 원자력( IEC 61508 SIL 4), 의료기기(IEC 62304 Class C) 등 더욱 많은 안전 중요 분야에 적용
한계점 및 보완
- 복잡한 조건문: 중첩된 조건문, 삼항 연산자, 함수 호출이 포함된 조건문에서는 MC/DC 분석이 복잡해질 수 있다.
- Short-Circuit 미평가: 일부 언어에서 Short-Circuit 평가 시 실제로 미평가되는 조건이 있을 수 있어 주의가 필요하다.
- 정적 분석 의존: 동적 실행이 어려운 시스템(하드웨어-in-the-loop 등)에서는 정적 분석 도구에 의존해야 한다.
MC/DC는 안전 중요 소프트웨어에서 필수적인 커버리지 수준으로, 각 조건의 독립적 영향력을 체계적으로 증명한다. N+1개의 테스트로 2^N개의 조합을 테스트하는 동등한 효과를 달성하면서도, 각 조건의 의미를 검증할 수 있다는 점에서 매우 효율적인 커버리지 기법이다. 기술사는 안전 수준에 따라 적절한 커버리지 수준을 설정하되, 특히 항공기, 원자력, 자동차 등의 안전 중요 시스템에서는 MC/DC를 필수적으로 적용해야 한다.
- 섹션 요약 비유: MC/DC는 **'우주왕복선 打り上げ前の全システム 검증'**과 같다. 우주왕복선 打ち上げ에서는 모든 시스템이 완벽하게 작동해야 하며, 특히 각 구성요소(조건)가 다른 시스템에 독립적으로 영향을 미치는지를漏らさず 검증해야 한다. 만약 연료 계통(조건1)에 문제가 있으면 전체 打ち上げ(결정)에 직접적 영향을 미쳐야 하고, 다른 계통은 정상임에도 打ち上げ이 불가능해야 한다. MC/DC는 이러한"독립적 영향"을 체계적으로 증명하는 검증 방법이다.
참고
- 모든 약어는 반드시 전체 명칭과 함께 표기:
API (Application Programming Interface) - 일어/중국어 절대 사용 금지 (한국어만 사용)
- 각 섹션 끝에 📢 요약 비유 반드시 추가
- ASCII 다이어그램의 세로선 │와 가로선 ─ 정렬 완벽하게
- 한 파일당 최소 800자 이상의实质 내용