엔지니어 background지식

검증 영역 커버리지

아즈마민초 2025. 6. 9. 11:10

1. 구문 커버리지 (Statement Coverage)

정의: 구문 커버리지는 소스 코드의 모든 실행 가능한 구문(Statement)이 적어도 한 번 이상 실행되었는지를 측정하는 커버리지입니다. 가장 기본적인 형태의 커버리지 측정 방법이며, 일반적으로 전체 커버리지 분석의 출발점이 됩니다.

측정 방법: 프로그램 내의 모든 독립적인 구문(예: 할당문, 함수 호출, 조건문, 반복문의 몸체 등)을 식별하고, 테스트 실행 후 얼마나 많은 구문이 실행되었는지 비율로 나타냅니다.

장점:

  • 측정하기 쉽고 이해하기 간단합니다.
  • 가장 기본적인 수준의 테스트 완료 여부를 파악할 수 있습니다.
  • 실행되지 않은 코드를 식별하여 데드 코드(Dead Code)나 불필요한 코드를 찾아내는 데 도움이 됩니다.

단점:

  • 경로(Path)나 조건(Condition)의 모든 경우를 다루지 못합니다. 예를 들어, if 문의 else 부분이 테스트되지 않아도 100% 구문 커버리지를 달성할 수 있습니다.
  • 논리적인 오류나 잠재적인 런타임 오류를 발견하는 데 한계가 있습니다.
  • 테스트의 품질을 보장하지 않습니다. 모든 구문이 실행되었다고 해서 모든 기능이 올바르게 작동하는 것은 아닙니다.

 

 

2. 분기 커버리지 (Branch Coverage 또는 Decision Coverage)

정의: 분기 커버리지는 코드 내의 모든 결정 지점(Decision Point)에서 가능한 모든 분기(Branch)가 적어도 한 번 이상 실행되었는지를 측정하는 커버리지입니다. 결정 지점은 if, else if, switch, while, for, do-while 문 등 조건에 따라 프로그램의 흐름이 달라지는 부분을 의미합니다.

측정 방법: 각 결정 지점에 대해 참(True) 분기와 거짓(False) 분기가 모두 실행되었는지 확인합니다.

 

장점:

  • 구문 커버리지보다 더 깊은 수준의 코드 검증을 제공합니다.
  • 논리적인 경로를 놓치지 않도록 도와줍니다.
  • if 문이나 반복문의 else 부분과 같이 구문 커버리지에서 놓칠 수 있는 부분을 테스트하도록 유도합니다.

단점:

  • 모든 가능한 조건 조합을 테스트하지는 않습니다. 복합 조건문(&&, ||)의 경우 개별 조건의 모든 경우를 다루지는 못합니다.
  • 경로의 모든 조합을 다루지 못합니다. (예: 다중 if-else if 문)

 

 

  • Decision Point 1 (a > 0): Branch T1, Branch F1
  • Decision Point 2 (b < 10): Branch T2, Branch F2 (단, Decision Point 1의 T1이 실행된 경우에만 해당)
  • 테스트 케이스 1: func(5, 5)
    • 실행 분기: Branch T1 (a>0), Branch T2 (b<10)
    • 미실행 분기: Branch F1, Branch F2
    • 분기 커버리지: 50% (4개 분기 중 2개 실행)
  • 테스트 케이스 2: func(-1, 5)
    • 실행 분기: Branch F1 (a>0이 거짓)
    • 미실행 분기: Branch T1, Branch T2, Branch F2
    • 분기 커버리지: 25% (4개 분기 중 1개 실행)
  • 테스트 케이스 3: func(5, 5) 와 func(5, 15) 와 func(-1, 5) 모두 호출
    • func(5, 5): T1, T2
    • func(5, 15): T1, F2
    • func(-1, 5): F1
    • 모든 분기 (T1, F1, T2, F2) 실행됨
    • 분기 커버리지: 100%

3. MC/DC 커버리지 (Modified Condition/Decision Coverage)

정의: MC/DC 커버리지는 분기 커버리지보다 더 엄격한 수준의 조건 조합 테스트를 요구합니다. 이는 항공, 자동차, 의료기기 등 안전에 매우 중요한 시스템(Safety-Critical System)의 소프트웨어 검증에 필수적으로 요구되는 커버리지 레벨입니다 (예: DO-178C Level A, ISO 26262 ASIL D).

MC/DC는 다음 세 가지 조건을 만족해야 합니다.

  1. 모든 구문(Statement)이 적어도 한 번 실행되어야 합니다. (구문 커버리지 포함)
  2. 모든 분기(Branch)가 적어도 한 번 실행되어야 합니다. (분기 커버리지 포함)
  3. 결정(Decision) 내의 각 기본 조건(Basic Condition)이 독립적으로 전체 결정의 결과에 영향을 미치는 것이 입증되어야 합니다. 즉, 다른 모든 조건은 고정된 상태에서 하나의 기본 조건만 변경했을 때 결정의 결과(참/거짓)가 바뀌는 테스트 케이스 쌍이 존재해야 합니다.

측정 방법: 복합 조건문(A && B, A || B)이 있을 때, 각 기본 조건(A, B)이 독립적으로 전체 결정에 영향을 미치도록 테스트 케이스를 설계합니다.

 

수식: 별도의 수식보다는 위의 3가지 정의를 만족하는 테스트 케이스의 존재 여부로 판단합니다. 일반적으로 최소 개의 테스트 케이스가 필요하며, 여기서 은 결정 내의 기본 조건의 수입니다. (이 필요한 일반적인 조건 커버리지보다 효율적)

장점:

  • 가장 강력하고 엄격한 커버리지 측정 방법 중 하나입니다.
  • 복합 조건문에서 발생할 수 있는 잠재적인 논리 오류를 효과적으로 발견할 수 있습니다.
  • 안전 필수 시스템의 신뢰성을 높이는 데 결정적인 역할을 합니다.
  • 테스트 케이스의 효율성을 높이면서도 높은 수준의 검증을 달성할 수 있습니다.

단점:

  • 테스트 케이스 설계가 복잡하고 어렵습니다. 모든 독립적인 영향을 입증하는 테스트 케이스를 찾아내는 것이 쉽지 않습니다.
  • 구문 커버리지나 분기 커버리지에 비해 더 많은 테스트 케이스가 필요할 수 있습니다.
  • 분석 및 측정 도구의 지원이 필수적입니다.

 

 

 

 

이 4개의 테스트 케이스를 통해 모든 기본 조건이 독립적으로 결정 결과에 영향을 미친다는 것을 입증할 수 있으며, 이는 MC/DC 커버리지를 달성했음을 의미합니다.


커버리지 간의 관계 (포함 관계)

일반적으로 커버리지 수준은 다음과 같은 포함 관계를 가집니다:

MC/DC 커버리지 분기 커버리지 구문 커버리지

  • MC/DC 커버리지를 100% 달성했다면, 이는 자동으로 분기 커버리지와 구문 커버리지도 100% 달성했음을 의미합니다.
  • 분기 커버리지를 100% 달성했다면, 이는 자동으로 구문 커버리지도 100% 달성했음을 의미합니다.
  • 하지만 역은 성립하지 않습니다. 구문 커버리지 100%가 분기 커버리지 100%를 보장하지 않고, 분기 커버리지 100%가 MC/DC 커버리지 100%를 보장하지 않습니다.

이러한 커버리지 측정은 소프트웨어 테스트의 효율성과 품질을 높이는 데 필수적인 도구로 활용됩니다.