구조적 커버리지(Coverage)란 무엇인가
소프트웨어 테스트에서 구조적 커버리지(코드 커버리지)는 테스트에 의해 실행된 소스 코드의 양을 나타낸 것으로 소스 코드를 기반으로 수행하는 화이트박스 테스트를 통해 측정한다.
-구조적 커버리지 측정의 필요성-
소프트웨어는 테스트를 통해 품질을 향상시킬 수 있다.
우리는 소프트웨어가 충분히 테스트되었는지, 언제 테스트를 종료해야 하는지 판단을 할 수 있어야한다.
이때 구조적 커버리지를 측정하면 소프트웨어를 얼마나 테스트했는지 정량적으로 확인할 수 있다.
구조적 커버리지의 종류
구문 커버리지
구문 커버리지는 시험 대상의 전체 구문 중에 테스트에 의해 실행된 구문을 측정한 것이다
위 코드를 테스트한다고 가정했을 때, x = 2를 테스트 데이터로 사용할 경우, 6번 라인은 실행되지 않기 때문에 구문 커버리지는 3 / 4 * 100 = 75% 가 된다. 구문 커버리지 100%를 달성하기 위해서는 3보다 큰 값을 테스트 데이터로 사용해야 한다.
결정 커버리지
결정 커버리지는 시험 대상의 전체 분기 중 테스트에 의해 실행된 것을 측정한 값이며, 분기 커버리지(Branch Coverage)라고도 한다.
예를 들어 하나의 if문이 있을 경우, 결정 커버리지 100%를 달성하려면 true를 실행하는 테스트 데이터와 false를 실행하는 테스트 데이터가 모두 필요하다.
위 예시의 결정 커버리지를 100% 달성하려면 테스트 케이스를 어떻게 작성해야 할까?
먼저 true 분기를 실행시키기 위해서는 조건식 'x > 3' 와 'y < 6' 가 모두 true 이어야 한다. false 분기를 실행시키는 조건식 조합은 'x > 3'가 false이거나 'x > 3' 가 true이면서 'y < 6'가 false 일 때이다. 이렇게 분기를 결정하는 모든 조건식의 조합을 표로 나타내면 다음과 같다.
위 진리표로부터 결정 커버리지 100%를 만족하는 두 가지 테스트 케이스 조합을 작성하면 다음과 같다.
Combination 2를 통해 조건 커버리지 100%를 달성한 경우는 분기가 모두 false가 되기 때문에 실행하지 않는 구문이 생긴다. 따라서 조건 커버리지 100%를 만족하는 테스트는 구문 커버리지 또는 결정 커버리지 100%를 만족하는 테스트에 비해 부족할 수 있다.
조건 커버리지
조건 커버리지는 모든 조건식의 true, false 중 테스트에 의해 실행된 것을 측정한 것이다.
분기를 결정하는 전체 조건식은 여러 개의 조건식으로 구성할 수 있는데, 조건 커버리지 100%를 달성하기 위해선 모든 개별 조건식의 true, false를 실행해야 한다.
예를 들어 위의 코드에서 조건 커버리지 100%를 달성하려면, 개별 조건식 'x > 3', 'y < 6' 각각의 true, false를 모두 실행해야 한다. 이를 위한 테스트 케이스 조합을 작성하면 다음과 같다.
Combination 2를 통해 조건 커버리지 100%를 달성한 경우는 분기가 모두 false가 되기 때문에 실행하지 않는 구문이 생긴다. 따라서 조건 커버리지 100%를 만족하는 테스트는 구문 커버리지 또는 결정 커버리지 100%를 만족하는 테스트에 비해 부족할 수 있다.
조건/결정 커버리지(Condition/Decisioin Coverage)
조건/결정 커버리지는 분기를 고려하지 않는 조건 커버리지를 개선한 것으로, 실행된 개별 조건식의 true, false와 분기 모두를 측정한 값이다.
위 코드의 조건/결정 커버리지 100% 달성을 위한 테스트 케이스 조합은 한가지밖에 없으며 아래와 같다.
변형 조건/결정 커버리지 (Modified Condition/Decision Coverage)
변형 조건/결정 커버리지 (이하 'MC/DC) 는 다른 조건식과 무관하게 분기를 결정하는 개별 조건식의 true, false 중 테스트에 의해 실행된 것을 측정한 값이다. MC/DC 커버리지 100%를 달성하기 위해서는 일반적으로 개별 조건식의 수 +1 개의 테스트 케이스가 필요하다.
MC/DC 커버리지 100%를 만족하는 테스트 케이스 조합을 만들기 위해서는 먼저 모든 개별 조건식의 true, false 조합인 진리표를 작성해야 한다. 위 코드에 대한 진리표는 다음과 같다.
위 진리표로부터 MC/DC 커버리지 100%를 달성하기 위한 네 개의 테스트 케이스를 찾을 수 있으며 각각은 아래와 같다.
1) 번과 4) 번 테스트 케이스로 조건식 'x > 3'만 변경했을 때 분기가 변경되는 것을 확인할 수 있다. 마찬가지로 1) 번과 2)번으로 조건식 'y < 6' 가, 2) 번과 3) 번으로는 조건식 'z == 20' 가 독립적으로 분기를 결정하는 것을 확인할 수 있다.
다중 조건 커버리지 (Multiple Condition Coverage)
다중 조건 커버리지는 모든 개별 조건식의 true, false 조합 중 테스트에 의해 실행된 조합을 측정한 것이다. 100%를 달성하기 위해서는 모든 개별 조건식 조합을 실행해야 하기 때문에 다른 커버리지에 비해 상대적으로 많은 테스트 케이스가 필요하다.
위 코드의 다중 조건 커버리지 100%를 만족하는 테스트 케이스의 조합은 아래와 같으며 이는 진리표와 동일하다.
ISO 26262와 같은 국제 표준은 단위 시험 검증에서 구문, 분기, MC/DC 커버리지 100%를 요구하며, 통합 시험 검증에서는 함수, 호출 커버리지 100%를 추가로 요구하고 있다.
'코드검증' 카테고리의 다른 글
동적검증에서의 생성형 AI 활용 (0) | 2023.11.24 |
---|