MC-DC로 복합 조건의 독립 영향 검증하기

MC-DC의 독립 조건 영향 검증 방식과 안전 중요 시스템 테스트 적용, 커버리지 설계 시 고려할 점을 정리한다.

2026-08-14 · 최초 발행 2025-05-23

조건 하나가 결과를 바꿨다는 증명

Modified Condition - Decision Coverage(MC-DC)는 복합 조건식 안의 개별 조건이 다른 조건의 영향 없이 전체 결정 결과를 바꾸는지를 확인하는 테스트 커버리지 기법이다. Condition/Decision 커버리지가 놓칠 수 있는 조건별 영향 관계를 검증하는 데 목적이 있다.

N개의 조건식에 대해 모든 조합을 시험하려면 2^N개의 테스트 케이스가 필요하다. MC-DC는 각 조건의 독립적 영향을 보여 주는 쌍을 구성해 N+1개의 테스트 케이스로 커버리지를 확보한다.

이 방식은 항공, 의료, 원자력, 자동차처럼 결함이 인명 피해로 이어질 수 있는 안전 중요 시스템에 적용된다. DO-178B/C 항공 소프트웨어 표준과 IEC 61508 산업 안전 표준 등에서도 다뤄지며, DO-178B/C에서는 Level A 시스템에 MC-DC를 요구한다.

다른 커버리지와 구분되는 지점

구문 커버리지는 모든 코드 문장이 최소 한 번 실행됐는지를 본다. 분기 커버리지는 if, case 등의 모든 분기점이 참과 거짓 경로를 모두 거쳤는지 확인한다.

조건 커버리지는 각 조건식이 참과 거짓 값을 모두 갖도록 구성하고, 결정 커버리지는 전체 조건식의 결과가 참과 거짓을 모두 갖도록 한다. 조건/결정 커버리지는 이 두 요구를 함께 만족한다.

다중 조건 커버리지는 가능한 모든 조건 조합을 테스트한다. 반면 MC-DC는 각 조건이 전체 결정에 독립적으로 영향을 미쳤는지를 증명하는 데 초점을 둔다. 조합 전체를 검사하지 않으면서도 의사결정 로직의 조건별 책임을 확인할 수 있다는 점이 차이이다.

테스트 세트는 영향 쌍으로 만든다

복합 조건식을 대상으로 MC-DC 테스트를 설계할 때는 먼저 조건을 식별한다. 이후 한 조건만 바꿨을 때 전체 결과가 달라지는 테스트 쌍을 각 조건마다 찾고, 이 쌍들을 포함하도록 테스트 케이스 세트를 구성한다. 마지막으로 실행 결과를 검증한다.

A && B || C를 예로 들면 전체 진리값은 다음과 같다.

A B C A && B || C
T T T T
T T F T
T F T T
T F F F
F T T T
F T F F
F F T T
F F F F

다음 4개 케이스는 각 조건의 독립 영향을 확인하는 데 사용된다.

Test A B C Result Demonstrates
1 T T F T A independently affects result (compare with Test 4)
2 T F F F B independently affects result (compare with Test 1)
3 F F T T C independently affects result (compare with Test 4)
4 F F F F Base case

조건 A는 Test 1(TTF→T)과 Test 4(FFT→F)를 비교해 확인한다. 조건 B는 Test 1(TTF→T)과 Test 2(TFF→F)를, 조건 C는 Test 3(FFT→T)과 Test 4(FFF→F)를 비교한다.

안전 중요 로직에 적용하는 방식

항공기 착륙 시스템의 의사결정 로직은 다음과 같이 표현할 수 있다.

if ((altitude < THRESHOLD) && (landing_gear_down == TRUE) &&
   (airspeed < SAFE_LANDING_SPEED || emergency_landing == TRUE)) {
    authorize_landing();
} else {
    continue_flight();
}

이 로직에는 4개의 조건이 있으며, MC-DC를 위해 5개의 테스트 케이스가 필요하다.

  1. altitude < THRESHOLD = TRUE, landing_gear_down = TRUE, airspeed < SAFE_LANDING_SPEED = TRUE, emergency_landing = FALSE → authorize_landing()
  2. altitude >= THRESHOLD, landing_gear_down = TRUE, airspeed < SAFE_LANDING_SPEED = TRUE, emergency_landing = FALSE → continue_flight()
  3. altitude < THRESHOLD, landing_gear_down = FALSE, airspeed < SAFE_LANDING_SPEED = TRUE, emergency_landing = FALSE → continue_flight()
  4. altitude < THRESHOLD, landing_gear_down = TRUE, airspeed >= SAFE_LANDING_SPEED, emergency_landing = FALSE → continue_flight()
  5. altitude < THRESHOLD, landing_gear_down = TRUE, airspeed >= SAFE_LANDING_SPEED, emergency_landing = TRUE → authorize_landing()

의료 장비의 인슐린 펌프 투여 조건에도 같은 방식으로 적용할 수 있다.

if ((blood_glucose > HIGH_THRESHOLD) &&
   (last_dose_time > MIN_INTERVAL) &&
   (battery_level > LOW_BATTERY || emergency_override == TRUE)) {
    deliver_insulin();
} else {
    wait_for_next_check();
}

도구와 자동화의 역할

LDRA Testbed는 안전 중요 시스템 테스트에 특화되어 있으며, DO-178B/C와 IEC 61508 등의 인증을 지원하고 MC-DC 자동 분석 및 보고서 생성을 제공한다.

VectorCAST는 임베디드 C/C++ 시스템 테스트에 특화된 도구로, MC-DC 테스트 케이스 자동 생성과 테스트 결과 시각화를 제공한다. Rapita Systems RVS는 실시간 시스템 검증을 대상으로 MC-DC 측정과 분석 기능, DO-178B/C 인증 지원을 제공한다.

Parasoft C/C++test는 정적 분석과 단위 테스트를 통합하고, MC-DC 커버리지 측정 및 테스트 케이스 자동 생성을 지원한다.

커버리지 결과를 해석할 때

조건이 많아질수록 적절한 테스트 케이스를 도출하기 어려워지고, 조건 간 의존성이 있으면 독립적 영향 자체를 증명하기 어렵다. 특정 조건 조합을 만들기 위한 테스트 환경 구축 비용도 증가하며, 하드웨어 의존 조건은 시뮬레이션이 필요할 수 있다.

MC-DC만으로 모든 결함을 찾을 수는 없다. 경계값 분석, 동등 분할, 오류 주입 같은 다른 테스트 기법과 병행해야 한다. 컴파일러 최적화로 실제 실행 코드가 원본 코드와 달라질 수 있고, 일부 조건은 단축 평가(short-circuit evaluation) 때문에 평가되지 않을 수도 있다.

복잡한 조건식은 여러 단순한 조건식으로 나누고, 함수 내 의사결정 포인트를 줄이는 편이 테스트 설계에 유리하다. 자동 생성과 실행 도구를 활용해 CI/CD 파이프라인에 MC-DC 커버리지 측정을 통합할 수 있다.

커버리지 분석 결과로 목표 미달 영역을 식별해 추가 테스트 케이스를 개발하고, 각 테스트가 어떤 조건의 독립적 영향을 검증하는지 문서화해야 한다. 테스트 케이스와 요구사항 사이의 추적성도 함께 유지해야 한다.

MC-DC소프트웨어 테스트테스트 커버리지안전 중요 시스템품질 보증