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개의 테스트 케이스가 필요하다.
- altitude < THRESHOLD = TRUE, landing_gear_down = TRUE, airspeed < SAFE_LANDING_SPEED = TRUE, emergency_landing = FALSE → authorize_landing()
- altitude >= THRESHOLD, landing_gear_down = TRUE, airspeed < SAFE_LANDING_SPEED = TRUE, emergency_landing = FALSE → continue_flight()
- altitude < THRESHOLD, landing_gear_down = FALSE, airspeed < SAFE_LANDING_SPEED = TRUE, emergency_landing = FALSE → continue_flight()
- altitude < THRESHOLD, landing_gear_down = TRUE, airspeed >= SAFE_LANDING_SPEED, emergency_landing = FALSE → continue_flight()
- 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 커버리지 측정을 통합할 수 있다.
커버리지 분석 결과로 목표 미달 영역을 식별해 추가 테스트 케이스를 개발하고, 각 테스트가 어떤 조건의 독립적 영향을 검증하는지 문서화해야 한다. 테스트 케이스와 요구사항 사이의 추적성도 함께 유지해야 한다.