424. 조건 커버리지 (Condition Coverage)

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

  1. 본질: 조건 커버리지(Condition Coverage)란 화이트박스 테스트에서 분기문 내의 각 개별 조건식(Subcondition)이 독립적으로 참(True)/거짓(False)을 한 번씩 갖도록 테스트 케이스를 설계하는 지표이다.
  2. 가치: 결정 커버리지가 분기문의 전체 결과만 검증하는 반면, 조건 커버리지는 복합 조건 내의 각 개별 조건이 전체 결과에 미치는 영향을 검증함으로써, 단일 조건 오류를 발견할 수 있다.
  3. 융합: 조건 커버리지는 DO-178C, ISO 26262 등 안전 중요 시스템 표준에서 MC/DC와 함께 활용되며, 특히 항공기, 자동차 등 임계 시스템 소프트웨어 검증에 필수적이다.

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

  • 개념: 조건 커버리지는 분기문의 복합 조건을 구성하는 각 개별 조건식이 독립적으로 참(True)/거짓(False) 값을 갖는지를 측정하는 지표이다. 예를 들어 "if (A > 0 and B > 0)"이라는 복합 조건에서 A > 0과 B > 0이 각각 독립적으로 참/거짓을 한 번씩 가져야 한다.

  • 필요성: 결정 커버리지는 복합 조건 전체의 결과(참/거짓)만 검증하지만, 개별 조건의独立적인 영향은 검증하지 않는다. 예를 들어 A > 0 and B > 0에서 A만 false이고 B는 true인 경우, 전체 조건은 false가 되지만, A > 0 조건 자체가 false일 때의 동작은 이미 검증된 것이다. 조건 커버리지를 통해 각 개별 조건의 참/거짓을 모두 테스트할 수 있다.

  • 조건(Condition)과 결정(Decision)의 구분:

    • 조건(Condition): 더 이상 분할할 수 없는 단일 부울 식 (예: A > 0, B == 0)
    • 결정(Decision): 하나 이상의 조건을 논리 연산자로 결합한 것 (예: A > 0 and B == 0)
  • 비유: 조건 커버리지는 **'화합물 각 성분 검증'**과 같다. 화합물이 성분 A, B, C로 구성되어 있을 때, 전체 화합물의 특성(결정)을 보는 것(결정 커버리지)뿐만 아니라 각 성분 A, B, C가 단독으로 어떠한 특성을 갖는지(조건 커버리지)도 검증해야 한다.

  • 등장 배경 및 발전 과정:

    1. 1980년대: 소프트웨어 테스트 학계에서 조건 커버리지 개념 체계화
    2. 1990년대: DO-178B에서 항공기 소프트웨어 커버리지 수준 정의
    3. 현재: 자동차(ISO 26262), 의료기기(IEC 62304) 등 안전 표준에서 활용
  • 섹션 요약 비유: 조건 커버리지는 **'레시피 각 재료별 특성 확인'**과 같다. 요리에서 "양파 + 당근 + 감자"를 넣는 레시피가 있을 때, 전체 맛(결정)만 확인하는 것이 아니라 양파만의 맛, 당근만의 맛, 감자만의 맛(각 조건)을 각각 확인하는 것이다. 이것이 조건 커버리지이다.


Ⅱ. 아키텍처 및 핵심 원리 (Deep Dive)

조건 커버리지 계산

[조건 커버리지 계산]

  코드:
  if (A > 0 and B > 0):
      result = 1
  else:
      result = 0

  ※ A > 0: 조건 1 (Condition 1)
  ※ B > 0: 조건 2 (Condition 2)
  ※ A > 0 and B > 0: 결정 (Decision)

  TC-01: A = 5, B = 5 → A > 0 = true, B > 0 = true → result = 1
  TC-02: A = -1, B = -1 → A > 0 = false, B > 0 = false → result = 0

  ┌─────────────────────────────────────────────────────────────────┐
  │                    조건 커버리지 분석                                         │
  ├─────────────────────────────────────────────────────────────────┤
  │                                                                  │
  │   조건 1 (A > 0):                                                │
  │   ✓ 참 (TC-01) → Covered                                        │
  │   ✓ 거짓 (TC-02) → Covered                                      │
  │                                                                  │
  │   조건 2 (B > 0):                                                │
  │   ✓ 참 (TC-01) → Covered                                        │
  │   ✓ 거짓 (TC-02) → Covered                                      │
  │                                                                  │
  │   조건 커버리지 = 4 / 4 × 100 = 100%                           │
  │   ※ 모든 개별 조건이 T/F를 모두取得                             │
  │                                                                  │
└─────────────────────────────────────────────────────────────────┘

[다이어그램 해설] 조건 커버리지에서는 복합 조건 내의 각 개별 조건이 독립적으로 참/거짓을 가져야 한다. TC-01에서 A > 0 = true, B > 0 = true이고, TC-02에서 A > 0 = false, B > 0 = false이다. 따라서 모든 개별 조건이 참/거짓을 모두取得하여 조건 커버리지 100%를 달성한다.

조건 커버리지 vs 결정 커버리지

[조건 커버리지 vs 결정 커버리지 비교]

  코드:
  if (A > 0 and B > 0):
      result = 1

  TC-01: A = -1, B = 5 → (A > 0 = false, B > 0 = true) → result = 1
  TC-02: A = 5, B = -1 → (A > 0 = true, B > 0 = false) → result = 1

  ┌─────────────────────────────────────────────────────────────────┐
  │                    커버리지 비교                                             │
  ├─────────────────────────────────────────────────────────────────┤
  │                                                                  │
  │   TC-01, TC-02 결과:                                             │
  │   - 결정: TC-01은 false, TC-02는 false                          │
  │   - 따라서 결정 커버리지: false만 Covered, true 미Covered → 50%     │
  │                                                                  │
  │   - 조건 1: TC-01은 false, TC-02는 true → Covered → 100%         │
  │   - 조건 2: TC-01은 true, TC-02는 false → Covered → 100%         │
  │   - 조건 커버리지: 100%                                          │
  │                                                                  │
  │   ※ 이 예에서 조건 커버리지는 100%이지만 결정 커버리지는 50%          │
  │   ※ 즉, 조건 커버리지 100%도 전체 결정의 모든 결과를 Covered하지 않음  │
  │                                                                  │
└─────────────────────────────────────────────────────────────────┘

[다이어그램 해설] 이 예시에서 TC-01과 TC-02는 A > 0와 B > 0의 각 조건에 대해 참/거짓을 모두取得하지만, 복합 조건 "A > 0 and B > 0"의 전체 결과는 항상 false이다. 따라서 조건 커버리지는 100%이지만 결정 커버리지는 50%이다.

Short-Circuit 평가와 조건 커버리지

[Short-Circuit 평가에서 조건 커버리지]

  대부분의 프로그래밍 언어에서:
  - A and B: A가 false이면 B는 평가되지 않음
  - A or B: A가 true이면 B는 평가되지 않음

  코드:
  if (A > 0 and B > 0):
      result = 1

  TC-01: A = -1, B = 5
  → A > 0 = false (Short-Circuit로 B > 0 미평가)
  → result = 0

  TC-02: A = 5, B = -1
  → A > 0 = true, B > 0 = false
  → result = 0

  TC-03: A = 5, B = 5
  → A > 0 = true, B > 0 = true
  → result = 1

  ※ TC-01에서 B > 0가 실제로 평가되지 않으므로 주의 필요
  ※ Short-Circuit 환경에서도 조건 커버리지를 달성하려면 B > 0를 평가하는
    테스트 케이스 필요

Ⅲ. 구현 및 실무 응용 (Implementation & Practice)

조건 커버리지 달성 테스트 케이스

[테스트 케이스 설계]

  코드:
  if ((C1) or (C2)):
      action1()
  else:
      action2()

  조건 커버리지 100% 위한 테스트:
  TC-01: C1 = true, C2 = ? (don't care) → action1()
  TC-02: C1 = false, C2 = true → action1()
  TC-03: C1 = false, C2 = false → action2()

  ※ TC-01과 TC-02에서 C1이 각각 true/false Covered
  ※ TC-02와 TC-03에서 C2가 각각 true/false Covered

다중 조건 커버리지와의 비교

[다중 조건 커버리지와의 비교]

  코드:
  if (A and B):
      result = 1

  ┌─────────────────────────────────────────────────────────────────┐
  │                    커버리지 수준별 비교                                         │
  ├─────────────────────────────────────────────────────────────────┤
  │                                                                  │
  │   수준                    │ 필요한 테스트 수 │ 설명                    │
  │   ────────────────────────────────────────────────────────────  │
  │   결정 커버리지            │ 2              │ A and B 전체의 T/F     │
  │   조건 커버리지            │ 2              │ A의 T/F, B의 T/F       │
  │   다중 조건 커버리지       │ 4              │ 모든 조합 (TT, TF, FT, FF)│
  │   MC/DC                   │ 3              │ 각 조건 독립적 영향 증명  │
  │                                                                  │
│   ※ 위 예에서 결정 커버리지 100%: TC(TT), TC(FF)                    │
│   ※ 조건 커버리지 100%: TC(TF), TC(FT) or TC(TT), TC(TF) 등         │
│   ※ 다중 조건 커버리지 100%: TC(TT), TC(TF), TC(FT), TC(FF)         │
  │                                                                  │
└─────────────────────────────────────────────────────────────────┘

자동차ecu 테스트 적용

[자동차 ECU 조건 커버리지 적용]

  예시: 자동 긴급 브레이크 시스템 (AEB)

  조건:
  - C1: 전방 충돌 감지 (선박 도달 거리 < 안전 거리)
  - C2: 운전자의 브레이크 조작 감지
  - C3: 차량 속도 > 임계값

  if (C1 and (not C2) and C3):
      emergencyBrake()

  ※ AEB는 C1=true, C2=false, C3=true일 때 작동해야 함
  ※ 모든 조건 조합을 테스트하면 2^3 = 8개 조합 필요
  ※ 안전을 위해 MC/DC 적용 권장

Ⅳ. 품질 관리 및 테스트 (Quality & Testing)

조건 커버리지 장단점

[조건 커버리지 장단점]

  장점:
  ├─ 개별 조건의 참/거짓을 모두 테스트하여 단일 조건 오류 발견
  ├─ 복합 조건에서 각 조건의 영향력 검증 가능
  ├─ 결정 커버리지보다 더 엄격한 테스트 수준
  └─ 안전 중요 시스템에서 필수적인 검증 수단

  단점:
  ├─ 조건 커버리지 100%도 모든 조합을 검증하지 못함
  ├─ Short-Circuit 평가 환경에서 주의 필요
  ├─ 테스트 케이스 수가 결정 커버리지보다 많을 수 있음
  └─ 더 엄격한 시스템에서는 MC/DC 필요

커버리지 수준별 관계

[커버리지 수준 포함 관계]

  구문 ⊂ 결정 ⊂ 조건 ⊂ MC/DC ⊂ 경로

  ※ 상위 수준은 하위 수준의 모든 요구사항을 포함
  ※ 즉, MC/DC 커버리지를 달성하면 조건, 결정, 구문 커버리지도 자동 달성

  ┌─────────────────────────────────────────────────────────────────┐
  │                    커버리지 수준 포함 관계                                   │
  ├─────────────────────────────────────────────────────────────────┤
  │                                                                  │
  │   구문 커버리지: 모든 문장 실행                                   │
  │       │                                                        │
  │       └── 결정 커버리지: 모든 분기 실행                            │
  │               │                                                │
  │               └── 조건 커버리지: 모든 개별 조건의 T/F 실행         │
  │                       │                                        │
  │                       └── MC/DC: 각 조건의 독립적 영향 증명         │
  │                               │                                │
  │                               └── 경로 커버리지: 모든 경로 실행     │
  │                                                                  │
└─────────────────────────────────────────────────────────────────┘
  • 섹션 요약 비유: 조건 커버리지는 **'축구팀 各 선수별 역할 확인'**과 같다. 축구에서 수비수가 공을拦截(조건1), 미드필더가パスを提供的(조건2), 스트라이커가 슈팅하는(조건3)情况进行 모두 테스트한다. 전체 팀 전략(결정)을 테스트하는 것에 더하여 각 선수(조각)의 역할(각 조건)이 정확히 작동하는지도 확인해야 한다.

최신 동향

  1. AI 기반 테스트 케이스 생성: AI가 코드의 조건문을 분석하여 자동으로 조건 커버리지를 달성하는 테스트 케이스를 생성하는 도구 등장
  2. 자동차 안전 표준의 강화: ISO 26262에서 ASIL(Automotive Safety Integrity Level)에 따라 조건 커버리지 또는 MC/DC 요구
  3. 실시간 커버리지 모니터링: CI/CD 파이프라인에서 조건 커버리지를 실시간으로 모니터링하고, 미달 시 경고 또는 빌드 실패

한계점 및 보완

  • 조건 커버리지 100%의盲点: 조건 커버리지를 달성해도 두 조건 간의 특정 조합에서 발생하는 결함은 발견되지 않을 수 있다.
  • ** Short-Circuit 미평가**: 일부 언어에서 Short-Circuit 평가를 하면 실제로 미평가되는 조건이 있을 수 있다.
  • 보다 엄격한 검증 필요: 안전 중요 시스템에서는 조건 커버리지보다 더 엄격한 MC/DC가 요구되는 경우가 많다.

조건 커버리지는 개별 조건의 참/거짓을 모두 테스트하여 단일 조건 오류를 발견하는 데 효과적인 기법이다. 그러나 조건 커버리지 100%도 모든 조합을 검증하지 못하며, 안전 중요 시스템에서는 MC/DC와 같은 더 엄격한 커버리지 수준이 요구될 수 있다. 기술사는 프로젝트의 안전 요구 수준에 따라 적절한 커버리지 수준을 설정하고 적용해야 한다.

  • 섹션 요약 비유: 조건 커버리지는 **'自動문 각 센서 검증'**과 같다. 자동문에서 적외선 센서(조건1)가 사람을 감지하고, 압력 센서(조건2)가무를 감지하며, 속도 센서(조건3)가 움직임 속도를 감지하는 상황을 생각해보자. 전체 문 동작(결정)뿐만 아니라 각 센서(조각)가 정확히 작동하는지도测试해야 자동문의 安全을 보장할 수 있다.

참고

  • 모든 약어는 반드시 전체 명칭과 함께 표기: API (Application Programming Interface)
  • 일어/중국어 절대 사용 금지 (한국어만 사용)
  • 각 섹션 끝에 📢 요약 비유 반드시 추가
  • ASCII 다이어그램의 세로선 │와 가로선 ─ 정렬 완벽하게
  • 한 파일당 최소 800자 이상의实质 내용