426. 변경 조건/결정 커버리지 (MC/DC)

핵심 인사이트 (3줄 요약)

  1. 본질: 변경 조건/결정 커버리지(Modified Condition/Decision Coverage, MC/DC)란 화이트박스 테스트에서 각 개별 조건이 전체 결정 결과에 독립적으로 영향을 미침을 증명하는 테스트 커버리지 지표이다. N개의 조건에 대해 최소 N+1개의 테스트로 모든 조건의 독립적 영향을 검증한다.
  2. 가치: 단순히 모든 조합을 테스트하는 것보다 효율적이면서도, 각 조건의 독립적인 영향력을 증명함으로써, 단일 조건 결함과 조건 간 상호작용 결함을 모두 발견할 수 있다.
  3. 융합: DO-178C에서 Level A (가장 높은 안전 수준)의 항공기 소프트웨어에 필수적으로 요구되며, 항공기 자동비행, 원자력 발전소 제어 등 극히 안전한 시스템 검증에 활용된다.

Ⅰ. 개요 및 필요성 (Context & Necessity)

  • 개념: MC/DC는 각 개별 조건이 전체 결정 결과에 독립적으로 영향을 미치는지 증명하는 커버리지 지표이다. N개의 조건으로 구성된 결정에서 각 조건을 독립적으로 변경하면서 전체 결과가 변경되는지를 확인한다. 이를 통해 조건 간 상호의존성이나 특정 조건의 잘못된 구현을 발견할 수 있다.

  • 필요성: 조건 커버리지나 결정 커버리지는 개별 조건이나 전체 결정의 참/거짓取值만을 검증하지만, "각 조건이 전체 결과에 독립적으로 기여하는지"는 검증하지 않는다. MC/DC는 이러한 조건 간 독립성을 증명함으로써, 예를 들어 "A and B"라는 조건에서 A의 값이 변경될 때 전체 결과가 반드시 변경되어야 한다는 것을 검증한다.

  • 독립적 영향(Independent Effect)의 정의: 하나의 조건을 변경했을 때(다른 조건들은 고정된 상태에서), 전체 결정의 결과가 반드시 변경되는 경우, 해당 조건은 전체 결정에 독립적으로 영향을 미친다고 한다.

  • 비유: MC/DC는 **'오케스트라 악기별 기여도 분석'**과 같다. 오케스트라에서 비올라(조건1)의 음량을 변경했을 때 전체 오케스트라 소리(결정)가 반드시 달라져야 비올라가 전체 소리에 독립적으로 기여하는 것이다. 만약 비올라를 묵 Automobile어도 전체 소리가 동일하다면, 비올라는 의미 없는 조건이다.

  • 등장 배경 및 발전 과정:

    1. 1980년대: NASA와 항공 업계에서 개발, DO-178B 초안에서 개념 정립
    2. 1990년대: DO-178B 표준에서 Level A 시스템에 MC/DC 필수 요구
    3. 현재: 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는 각 조건이 전체 결정에 독립적으로 영향을 미치는지 체계적으로 증명한다. 만약 어떤 문항이 전체 결과에 영향을 주지 않는다면, 그 문항은 불필요하거나 잘못된 것이며修正해야 한다.

최신 동향

  1. 도구 자동화: LDRA, QA-Systems 등의 상용 도구가 MC/DC 테스트 케이스를 자동으로 생성하고, 커버리지를 측정하여 인증서를提供
  2. AI 기반 분석: AI가 코드의 조건 구조를 분석하여 MC/DC 달성을 위한 최적의 테스트 케이스 조합을 제안하는 도구开发
  3. 항공 외 적용 확대: 항공기뿐 아니라 자동차(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자 이상의实质 내용