테스트 커버리지 (문장, 분기, 조건, MC/DC, 경로)

🔥 매회 출제 (priority 3)

🌱 왜 배우나

“테스트를 100개 돌렸다”는 말만으로는 품질이 보장되지 않는다. 100개의 테스트가 사실은 같은 코드 몇 줄만 반복해서 실행했다면, 나머지 코드는 한 번도 검증되지 않은 셈이다. 공장에 빗대면 완성품 100개를 검사했어도 같은 생산 라인만 봤다면 다른 라인의 불량은 그대로 흘려보낸 것과 같다. 그래서 “코드의 어느 부분이 얼마나 실행됐는지”를 숫자로 보여 주는 지표가 필요하다. 그 지표가 테스트 커버리지(Test Coverage)다.

📖 핵심 개념

테스트 커버리지는 테스트가 소스 코드의 어느 부분을 실행했는지 백분율로 나타내는 지표다. 쉽게 말하면 “전체 코드 중 테스트로 확인된 비율”이다.

커버리지 기준은 5단계이고, 위로 갈수록 엄격해진다.

  1. 문장(모든 줄 실행)
  2. 분기(모든 if의 참/거짓 실행)
  3. 조건(if 안 개별 조건의 참/거짓 실행)
  4. MC/DC(각 조건이 독립적으로 결과에 영향)
  5. 경로(가능한 모든 실행 순서 실행)

엄격해질수록 필요한 테스트 케이스(입력값과 예상 결과의 조합) 수가 늘어난다. 커버리지 숫자가 높다고 품질이 자동으로 좋아지는 건 아니다. 다만 테스트가 충분한지 판단하는 기준으로 쓴다.

🔍 시각화

 커버리지 강도 (약 → 강)

  문장     분기      조건     MC/DC    경로
  ─●────────●────────●────────●────────●──→ 강도
  (약)                                 (강)

  예시 코드: if (A && B) { ... }

  [문장 커버리지]  코드 줄이 1번이라도 실행되면 OK
  [분기 커버리지]  전체 조건식(A&&B)의 참/거짓 모두 실행
  [조건 커버리지]  A의 참/거짓 + B의 참/거짓 각각 실행
  [MC/DC]         각 조건(A, B)이 단독으로 결과를 바꾸는 케이스 실행
  [경로 커버리지]  가능한 모든 실행 경로 실행 (경우의 수 폭발 주의)

↔️ 이웃 개념 구분

  • 분기 커버리지 vs 조건 커버리지: 분기 커버리지는 if (A && B) 전체 조건식의 참/거짓을 모두 만드는 것. 조건 커버리지는 조건식 안의 개별 변수 A와 B가 각각 참/거짓을 모두 갖도록 만드는 것. 조건 커버리지를 만족해도 전체 조건식의 참/거짓이 전부 나오지는 않을 수 있다.
  • MC/DC vs 경로 커버리지: MC/DC는 각 조건이 독립적으로 결과를 바꾸는지를 확인하는 방식으로, 현실적인 목표로 쓸 만하다. 경로 커버리지는 모든 실행 경로를 다 돌려야 해서 경우의 수가 폭발하기 쉽고, 사실상 달성 불가능한 경우가 많다.

🔑 핵심 용어

  • 문장 커버리지 (Statement Coverage): 실행 가능한 모든 코드 줄을 최소 1회 실행한다. 가장 약한 기준
  • 분기 커버리지 (Branch / Decision Coverage): 모든 조건문(if, switch 등)의 참·거짓 분기를 모두 실행한다
  • 조건 커버리지 (Condition Coverage): 조건식을 이루는 개별 조건(Boolean 표현식) 각각이 참·거짓을 모두 취하도록 실행한다. 분기 커버리지를 자동으로 포함하지는 않는다
  • MC/DC (Modified Condition/Decision Coverage, 변경 조건/결정 커버리지): 각 개별 조건이 독립적으로 전체 결정 결과를 바꾼다는 사실을 증명하는 기준. 항공 소프트웨어 표준 DO-178C에서 요구
  • 경로 커버리지 (Path Coverage): 프로그램의 모든 가능한 실행 경로를 실행한다. 가장 강력하지만 반복문이 포함되면 경우의 수가 거의 무한대로 늘어 달성이 어렵다

✅ 스스로 가르쳐보기

if (A && B)라는 코드가 있다고 가정하고, 분기 커버리지와 조건 커버리지를 각각 만족시키려면 어떤 테스트 케이스가 필요한지 본인 말로 설명해 보세요. 표 대신 말로 풀어서 설명할 수 있으면 이해한 겁니다.

체크포인트:

  • 커버리지 강도 순서(문장 < 분기 < 조건 < MC/DC < 경로)를 막힘 없이 말할 수 있나요?
  • 분기 커버리지가 “전체 조건식”의 참/거짓을, 조건 커버리지가 “개별 조건”의 참/거짓을 다룬다는 차이를 설명할 수 있나요?
  • MC/DC가 어떤 산업 분야에서 요구되는지 한 줄로 말할 수 있나요?

🎯 기출 포인트

2025-2회: if (A && B) 조건에서 분기 커버리지와 조건 커버리지의 테스트 케이스 수 비교가 출제됐다. 분기 커버리지는 전체 조건식의 T/F를 만들어야 하므로 최소 2개(예: A=T,B=T / A=F,B=F). 조건 커버리지는 개별 조건 A, B 각각 T/F를 만들면 되지만 분기 커버리지가 보장되지는 않는다. 단락평가(Short-circuit)에서 A=F이면 B는 평가되지 않는다는 점도 함께 알아두자. 2025-3회: 조건 커버리지의 정의와 분기 커버리지의 차이점을 서술하는 문제가 출제됐다. 분기 커버리지는 조건식 전체의 T/F, 조건 커버리지는 개별 조건의 T/F. 이 차이를 분명히 구분하자. MC/DC는 분기와 조건 커버리지를 동시에 만족시키면서 조건 간 독립성까지 보장한다.

🔗 연결 개념