테스트 커버리지(test coverage)는 테스트가 정해진 커버리지 항목을 얼마나 실행했는지를 백분율로 나타낸 정도다.[1][2] ISTQB 용어집은 커버리지 항목을 테스트 기법으로 하나 이상의 테스트 조건에서 끌어낸 속성이나 속성의 조합으로 정의한다.[3] ISTQB CTFL 강의계획서에 따르면 달성한 커버리지는 테스트가 얼마나 철저한지 재는 척도이고, 테스트를 끝낼지 정하는 흔한 종료 기준 가운데 하나다.[4]
기법마다 다른 커버리지 항목
커버리지 항목은 테스트 기법마다 다르다. 동치 분할은 분할을, 경계값 분석은 경계값을, 구문 테스트는 구문을, 분기 테스트는 분기를 커버리지 항목으로 삼는다. 이 강의계획서가 다루는 블랙박스 기법은 명세된 동작에서 고른 항목으로 커버리지를 재고, 화이트박스 기법인 구문 테스트와 분기 테스트는 코드의 구문과 분기로 커버리지를 잰다. 코드와 상관없는 커버리지를 쓰는 화이트박스 기법도 있다.[4]
이 강의계획서에 따르면 추적성은 커버리지 평가를 돕는다.[4]
ISTQB CT-AuT 강의계획서에 따르면 요구사항 기반 테스트의 요구사항 커버리지 는 적어도 한 테스트 케이스가 다룬 원자 요구사항의 수 와 전체 원자 요구사항의 수 로 다음과 같이 잰다.[5]
ISTQB 용어집은 구조적 커버리지(structural coverage)를 구성 요소나 시스템의 내부 구조에 바탕을 둔 커버리지 척도로 정의한다.[6]
조건과 결정
ISO/IEC/IEEE 24765 용어집은 조건(condition)을 불 연산자를 담지 않은 불 식으로, 결정(decision)을 둘 이상의 가능한 결과 사이의 선택이 어떤 동작들이 일어날지를 정하는 문의 종류로, 결정 결과(decision outcome)를 실행할 분기를 정하는 결정의 결과로 정의한다.[2]
구조적 커버리지 기준
구조적 커버리지 기준마다 이루어야 하는 상태는 다음과 같다. 구문, 결정, 조건, 다중 조건 커버리지는 ISTQB의 CTFL 강의계획서와 용어집이 정의한 대로 적는다.
| 기준 | 이루어야 하는 상태 |
|---|---|
| 구문 커버리지(statement coverage) | 실행 가능한 구문이 모두 적어도 한 번 실행되었다.[4] |
| 결정 커버리지(decision coverage) | 각 결정이 가능한 모든 결과를 적어도 한 번씩 가졌다.[7] |
| 조건 커버리지(condition coverage) | 각 결정 안의 각 조건이 가능한 모든 값을 적어도 한 번씩 가졌다.[8] |
| MC/DC | 결정 커버리지와 조건 커버리지에 더해, 각 조건이 결정의 결과에 독립적으로 영향을 준다는 것을 보였다.[9] |
| 다중 조건 커버리지(multiple condition coverage) | 각 결정 안 조건 값의 모든 조합이 실행되었다.[10] |
llvm-cov의 커버리지 요약에서 함수 커버리지(function coverage)는 적어도 한 번 실행된 함수의 비율이다.[11]
포함 관계
CTFL 강의계획서는 어떤 커버리지를 100% 이룬 테스트 케이스 집합이 언제나 다른 커버리지도 100% 이루는 관계를 포함한다(subsume)고 부른다. 이 강의계획서에 따르면 분기 커버리지는 구문 커버리지를 포함한다. 분기 커버리지 100%를 이룬 테스트 케이스 집합은 구문 커버리지도 100% 이루지만, 그 역은 성립하지 않는다.[4]
MC/DC는 결정 커버리지와 조건 커버리지의 요구를 모두 담으므로 두 커버리지를 포함한다. 다중 조건 커버리지는 결정 입력의 모든 조합을 실행하므로 대개 각 조건의 독립적인 영향도 보이게 된다. 그러나 이를 명시적으로 요구하지는 않고, 어떤 조건도 독립적인 영향을 가질 수 없는 논리식도 있다.[9]
결정 커버리지와 분기 커버리지
ISTQB 용어집은 결정 커버리지를 결정 결과의 커버리지로, 분기 커버리지(branch coverage)를 제어 흐름 그래프의 분기의 커버리지로 따로 정의한다.[7][12]
NIST SP 500-235에 따르면 분기 커버리지 방식에서는 테스트 중에 모든 결정 결과를 실행해야 한다.[13] ISO/IEC/IEEE 24765 용어집은 분기 테스트(branch testing)를 프로그램의 각 결정 지점의 각 결과를 실행하도록 설계한 테스트로 정의한다.[2]
ISO 26262-6
ISO 26262-6:2018은 소프트웨어 유닛 검증을 9절에, 소프트웨어 통합과 검증을 10절에 둔다. 소프트웨어 유닛 수준의 구조적 커버리지 척도는 표 9에서, 소프트웨어 아키텍처 수준의 구조적 커버리지는 표 12에서 다룬다.[14]