MC/DC (Modified Condition/Decision Coverage) - 미션 크리티컬 소프트웨어 안전 표준
핵심 인사이트 (3줄 요약)
- 본질: MC/DC(변경 조건/결정 커버리지)는
if (A && B || C)와 같은 복잡한 다중 조건문에서, **"다른 변수들은 고정해 둔 채 오직 하나의 변수(Condition)만 True/False로 변경했을 때, 그 단 하나의 변수가 전체 결과(Decision)를 뒤집을 수 있음을 독립적으로 증명"**하는 가장 치밀하고 정교한 화이트박스 테스트 기법이다.- 가치: 변수가 N개일 때 모든 경우의 수를 테스트하는 다중 조건(Multiple Condition) 커버리지는 $2^N$ 개의 테스트가 필요해 변수가 10개만 되어도 1,024개로 폭발하지만, MC/DC는 이 복잡한 로직을 단 $N+1$ 개(11개)의 케이스로 압축해 내면서도 다중 조건에 버금가는 100%의 결함 검출력을 보장하는 수학적 '가성비 최강의 궁극기'다.
- 융합: 버그 하나가 수백 명의 인명 피해로 직결되는 항공기 제어(DO-178B/C Level A), 자동차 전장(ISO 26262 ASIL D), 원자력/의료기기 등 최고 등급의 미션 크리티컬(Mission Critical) 산업 표준에서 법적으로 강제하는 최상위 커버리지 아키텍처로 융합되어 있다.
Ⅰ. 개요 및 필요성 (Context & Necessity)
-
개념: 일반적인 분기(Branch) 커버리지는
if문 전체가 참/거짓인 길만 걸어본다. 조건(Condition) 커버리지는if문 안의 개별 변수 A, B가 참/거짓인 길을 걸어본다. MC/DC는 이 둘을 합친 것을 넘어, **"A라는 변수 혼자서 전체 if문의 운명을 결정짓는 순간(Independence Effect)"**을 반드시 찾아내어 테스트하도록 강제하는 기법이다. -
필요성: 자율주행 자동차의 브레이크 로직이
if (장애물_있음 && 속도 > 100 && 브레이크_고장 == False)라고 치자. 단순히 참/거짓만 1번씩 테스트하고 넘어가면, 개발자가 코딩을 실수해서&&를||로 잘못 적어놨을 때 발견할 수가 없다. "장애물이 없음에도 속도가 100이 넘는다는 이유 하나만으로 브레이크가 콱 밟히는" 고속도로 대참사가 발생한다. 즉, **"A, B, C 각각의 변수가 다른 변수에 묻혀서(마스킹되어) 오작동하는 것을 완벽히 방지"**하기 위해서는 각 변수의 '독립적인 영향력'을 현미경으로 뜯어보는 MC/DC 검증이 인류의 목숨을 위해 반드시 필요했다. -
💡 비유: 팀장(A), 과장(B), 대리(C) 3명이 결재를 해야 프로젝트가 통과(결과)되는 룰이 있다고 합시다.
- 다중 조건 (모든 경우의 수): 3명이 찬성/반대하는 8가지 조합을 전부 시켜봅니다. (시간 낭비)
- MC/DC (독립적 영향력 증명): "팀장(A) 혼자서 이 프로젝트를 뒤집을 수 있는가?"를 증명하려면, 과장(B)과 대리(C)는 무조건 '찬성'으로 고정해 둡니다. 그 상태에서 팀장(A)만 찬성 ─▶ 반대로 바꿔봅니다. 그랬더니 최종 결과가 합격 ─▶ 불합격으로 똑같이 뒤집혔습니다! 이로써 "팀장 A의 권한(로직)은 정상적으로 작동함!"이 완벽히 증명됩니다. B와 C에 대해서도 이 짓을 한 번씩만 반복하면 총 4번($3+1$)의 테스트만으로 3명의 권한을 100% 입증할 수 있습니다.
-
등장 배경 및 발전 과정:
- 다중 조건 커버리지의 한계 (Combinatorial Explosion): 1980년대, 로직의 완벽한 검증을 위해 $2^N$ 번 테스트를 시켰으나, 변수가 20개인 우주선 코드에서는 100만 번의 테스트가 필요해 개발 자체가 불가능해졌다.
- NASA와 FAA의 고민 (1994년): 보잉/에어버스 항공기 제어 소프트웨어 인증 규격인 DO-178B를 제정하면서, 완벽한 검증력과 현실적인 테스트 횟수 사이의 타협점이 절실했다.
- MC/DC의 정립: NASA 라일리 연구센터의 켈리(Kelly) 등이 "각 조건이 독립적으로 결과에 영향을 미치는 쌍(Pair)"만 골라내면 테스트 횟수가 $N+1$ 개로 줄어든다는 수학적 증명을 해내며, 항공/자동차 글로벌 안전 표준으로 못 박혔다.
-
📢 섹션 요약 비유: 크리스마스 트리에 꼬마전구(변수) 100개가 직렬/병렬로 복잡하게 꼬여있습니다. 전구 하나가 끊어졌을 때 트리 전체가 어떻게 꺼지는지(버그) 확인하려고 100개의 전구를 일일이 다 빼보는($2^{100}$) 바보 같은 짓을 멈추고, 다른 전구들은 가만히 놔둔 채 의심되는 전구 딱 1개만 껐다 켰다 하면서 전체 트리의 불빛이 연동되어 깜빡이는지 확인하는 단 101번의 효율적인 족집게 점검법입니다.
Ⅱ. 아키텍처 및 핵심 원리 (Deep Dive)
MC/DC 테스트 케이스 도출 매커니즘 (쌍 추출 알고리즘)
가장 대표적인 로직 Z = A and B (A && B)를 예로 들어 MC/DC의 $N+1$ 압축 마술을 뜯어보자. 전체 조합은 $2^2 = 4$개다.
┌───────────────────────────────────────────────────────────────┐
│ MC/DC (Modified Condition/Decision Coverage) 도출 원리 │
├───────────────────────────────────────────────────────────────┤
│ [ 대상 로직: 결과(Z) = A AND B ] │
│ │
│ [ 진리표 (전체 조합) ] │
│ TC 번호 | 조건 A | 조건 B | 최종 결과 Z | │
│ -------------------------------------- │
│ 1 | T | T | T | │
│ 2 | T | F | F | │
│ 3 | F | T | F | │
│ 4 | F | F | F | │
│ │
│ [ 1단계: 변수 A의 독립적 영향력 증명 (A-Pair 찾기) ] │
│ - 룰: "B는 똑같은 값으로 고정하고, A만 T/F로 바꿨는데 Z가 뒤집히는 쌍!" │
│ ▶ TC 1번(T,T ─▶ T)과 TC 3번(F,T ─▶ F)을 고른다! │
│ (B는 T로 고정되어 방해하지 않음. 오직 A의 변화가 Z를 뒤집었음 증명) │
│ │
│ [ 2단계: 변수 B의 독립적 영향력 증명 (B-Pair 찾기) ] │
│ - 룰: "A는 똑같은 값으로 고정하고, B만 T/F로 바꿨는데 Z가 뒤집히는 쌍!" │
│ ▶ TC 1번(T,T ─▶ T)과 TC 2번(T,F ─▶ F)을 고른다! │
│ (A는 T로 고정되어 방해하지 않음. 오직 B의 변화가 Z를 뒤집었음 증명) │
│ │
│ [ 3단계: 중복 제거 및 최종 TC 도출 ] │
│ ▶ A를 위해 (1, 3) 필요. B를 위해 (1, 2) 필요. │
│ ▶ 중복되는 1번을 합치면 ─▶ 최종적으로 [1, 2, 3] 단 3개의 TC만 돌리면 됨!│
│ (변수 N=2개 일때, N+1 = 3개의 최소 테스트 케이스로 100% MC/DC 달성!)│
└───────────────────────────────────────────────────────────────┘
[다이어그램 해설] 만약 4번 케이스(F,F ─▶ F)를 골랐다고 치자. 3번(F,T ─▶ F)과 비교해 보면 B가 T에서 F로 변했는데 최종 결과 Z는 여전히 F다. B가 결과에 아무런 영향을 주지 못한 것이다! 이것을 마스킹(Masking) 현상이라고 한다. MC/DC의 핵심은 "다른 놈이 결과를 막아버리는(Masking) 케이스를 철저히 배제하고, 내가 100% 캐리(독립적 영향)하는 순수한 쌍(Pair)만 핀셋으로 뽑아내는" 위대한 수학적 최적화에 있다.
Ⅲ. 실무 적용 및 기술사적 판단
실무 시나리오
-
시나리오 — 항공기 제어 S/W(DO-178C) 감리 인증의 통과 조건: 무인 드론 비행 제어 회사가 미국 연방항공청(FAA)의 DO-178C Level A 인증을 받으려 한다. 코드 중에
if (engineFail || (alt < 100 && speed < 50))라는 복잡한 조건문이 수천 개 있다. 주니어 테스터가 분기 커버리지(if문 참/거짓) 100%를 달성한 리포트를 가져갔으나, FAA 심사관이 리포트를 보자마자 쓰레기통에 던져버렸다.- 판단: DO-178C Level A (고장 나면 비행기가 추락해 탑승자 전원 사망하는 최상위 등급)에서는, 분기 커버리지 따위의 나약한 테스트는 법적으로 아예 인정받지 못한다.
- 해결책: 반드시 MC/DC 100% 커버리지 리포트를 뽑아야 한다. VectorCAST/C++, LDRA 같은 초고가(수천만 원대)의 정적/동적 분석 도구를 파이프라인에 물려야 한다. 이 도구들은 소스 코드를 분석해 "이 if문을 통과하려면 당신은 1번, 4번, 5번, 8번 데이터 조합을 넣어야 MC/DC를 100% 달성할 수 있다"고 답안지(TC)를 역으로 제안해 준다. 개발자는 이 도구가 지시한 대로 테스트 스크립트를 짜서 100% 숫자를 찍어낸 뒤, 그 로그를 심사관에게 제출해야 비로소 드론을 하늘에 띄울 법적 권리를 획득한다.
-
시나리오 — Short-Circuit Evaluation(단락 평가)로 인한 MC/DC 측정 실패: C언어 코드에서
if (A != NULL && A->value == 10)이라는 방어적 프로그래밍을 짰다. MC/DC 100%를 채우기 위해 A=NULL, A->value=10 인 경우 등을 섞어 테스트를 돌렸는데, A=NULL 일 때 뒤의A->value는 아예 실행조차 되지 않았다(Short-circuit). 커버리지 측정 도구는 "A->value 변수가 테스트되지 않았다"며 빨간불(Coverage Fail)을 띄웠다.- 판단: 대다수 프로그래밍 언어의 런타임 최적화인 단락 평가(Short-circuit)와, 모든 변수의 독립적 영향을 보려는 MC/DC의 수학적 모델이 물리적으로 충돌한 전형적 에지(Edge) 케이스다.
- 해결책: C/C++ 미션 크리티컬 코딩 표준(MISRA-C)에서는 이런 충돌을 막기 위해 **"논리 연산자(&&, ||) 안에 함수 호출이나 복잡한 포인터 체인을 엮지 마라"**고 강제한다. 로직을 쪼개어,
bool isA_Valid = (A != NULL); bool isValue_10 = ...처럼 단일 변수로 뽑아낸 뒤 if문을 2단으로 분리하거나, MC/DC 도구(LDRA 등)의 최신 Short-circuit 묵인(Masking MC/DC) 분석 옵션을 켜서 언어의 런타임 특성과 타협하는 아키텍처 튜닝이 필수적이다.
도입 체크리스트
- 비즈니스 리스크 도메인: 우리 회사가 쇼핑몰 장바구니나 SNS 앱을 만드는데 MC/DC를 100% 맞추겠다고 선언하는가? 이것은 회사를 망하게 하는 '테스팅 오버엔지니어링'이다. MC/DC는 스크립트 하나 짜는 데 수 시간이 걸린다. 생명이 직결된 의료기기, 자율주행(ASIL-D), 원자력 제어, 항공/우주 도메인에 한해서만 국소적(Pin-point)으로 도입해야 하며, 일반 IT 앱은 분기(Branch) 커버리지 70~80% 수준에서 타협하는 것이 아키텍트의 경제학적 소양이다.
Ⅳ. 기대효과 및 결론
정량/정성 기대효과
| 구분 | 다중 조건 (Multiple Condition) | MC/DC (변경 조건/결정) | 개선 효과 및 ROI |
|---|---|---|---|
| 정량 (TC 개수 폭발) | 변수 10개 시 $2^{10} = 1,024$ 번 테스트 | 변수 10개 시 $N+1 = 11$ 번 테스트 | 완벽한 검증력 유지하면서 비용/시간 99% 삭감 |
| 정량 (버그 검출률) | 시간이 없어 대충 10번만 찌르고 배포(누수) | 11번의 케이스에 논리적 사각지대 전무 | 복잡한 Boolean 연산 버그 100% 원천 색출 |
| 정성 (국제 인증) | ISO 26262 등급 심사 서류 미달로 탈락 | MC/DC 도구 측정 리포트로 즉시 통과 | 미션 크리티컬(생명 직결) 산업의 글로벌 진출 티켓 확보 |
MC/DC는 소프트웨어 테스팅 역사상 인류가 만들어낸 가장 아름다운 수학적 압축 공식이다. 조건이 20개로 엮인 우주왕복선의 메인 엔진 코드(100만 번의 테스트 필요)를 단 21번의 테스트만으로 완벽하게 입증해 낸 이 마법 덕분에, 우리는 오늘날 안심하고 자율주행 자동차와 비행기에 몸을 실을 수 있다. 기술사는 무조건 100% 덮어놓고 테스트하겠다는 무식한 브루트 포스(Brute-force) 전략을 폐기하고, "무엇이 결과를 뒤집는가?"라는 독립성의 철학(Independence Effect)을 꿰뚫어 보며 완벽한 품질과 비용 절감을 동시에 쟁취하는 공학적 연금술사가 되어야 한다.
📌 관련 개념 맵 (Knowledge Graph)
| 개념 명칭 | 관계 및 시너지 설명 |
|---|---|
| 분기 커버리지 (Branch Coverage) | MC/DC의 하위 호환. 단순히 if 문이 참일 때, 거짓일 때 딱 2번만 걸어가 보는 헐렁한 그물망. 일반 웹 개발의 표준 커버리지 지표다. |
| 다중 조건 커버리지 (Multiple Condition) | MC/DC의 상위 호환. 변수가 가질 수 있는 모든 $2^N$ 개의 T/F 콤보를 무식하게 다 테스트하는 방식. 완벽하지만 시간이 너무 들어 실무에선 버려졌다. |
| 마스킹 효과 (Masking Effect) | 변수 A가 아무리 변해도, 변수 B가 굳건하게 앞에서 막아버려서 결과값이 절대 뒤집히지 않는 현상. MC/DC는 이 마스킹이 일어나는 쓰레기 케이스를 철저히 버리고 순수한 쌍(Pair)만 취한다. |
| DO-178C & ISO 26262 | 각각 항공기와 자동차 전장 S/W가 하늘을 날거나 도로를 달리기 위해 반드시 따야 하는 국제 안전 면허증. 이 면허증 최고 등급의 필수 요건이 바로 MC/DC 100%다. |
| Short-circuit Evaluation (단락 평가) | A && B 에서 A가 이미 False면, 컴퓨터가 속도를 위해 B는 아예 쳐다보지도 않고 무시해 버리는 컴파일러의 본능. 이 본능이 종종 MC/DC 측정을 방해하는 주범이 된다. |
👶 어린이를 위한 3줄 비유 설명
- 자전거를 출발시키려면 (안장에 앉고) AND (페달을 밟고) AND (브레이크를 푼다) 3가지 조건이 모두 완벽히 맞아야 해요.
- 페달 부품이 정상인지 확실하게 검사(테스트)하려면 어떻게 할까요? 다른 부품(안장, 브레이크)은 완벽한 상태로 딱 고정해 두고, 오직 '페달'만 밟았다 뗐다 해보는 거예요. 그때 자전거가 움직였다 멈췄다 하면 "아하! 페달은 완벽하게 작동하는구나!"라고 100% 증명되죠!
- 이렇게 100가지 부품이 섞여 있어도 다른 건 가만히 두고 딱 1개의 부품만 바꿔가며 그 부품 혼자서 자전거를 멈출 수 있는지 차례대로 점검하는 가장 똑똑한 검사법을 'MC/DC'라고 부른답니다!