안전하고 신뢰할 수 있는 소프트웨어 개발을 위한 품질 보증 과정에서 테스트는 필수적인 요소입니다.
충분한 테스트가 없으면 소프트웨어가 안전하고 기능적으로 올바른지 평가하는 데 어려움이 있기 때문입니다. 특히 코드 커버리지(또는 테스트 커버리지) 측정은 소프트웨어의 테스트 범위를 파악하는 데 중요한 지표로 작용합니다. 코드 커버리지 는 실제로 테스트된 코드의 비율을 전체 코드와 비교하여 나타내는 지표입니다. 예를 들어 테스트 가능한 네 가지 기능 중 세 가지를 테스트했다면 코드 커버리지는 75%로 측정되며, 이는 소프트웨어가 얼마나 포괄적으로 테스트되었는지 판단할 수 있는 기준이 됩니다.
특히 안전에 중요한 소프트웨어를 개발할 때 다양한 산업 표준은 코드커버리지에 대한 정확한 요구사항을 규정하고 있기 때문에, 충분한 테스트 커버리지가 증명되지 않으면 소프트웨어 인증을 받기가 매우 어려워 집니다. 이와 관련하여 코드커버리지 측정 도구인 Testwell CTC++ 의 개발사 Verifysoft에서는 아래 10가지 항목을 코드커버리지 도구를 선택하기 위한 기준으로 제시하고 있습니다.
각 기준에 대한 조금 더 자세한 설명은 Verifysoft사의 “10 criteria for selecting a code coverage tool”에서 참조하실 수 있습니다.
- 1. 컴파일러로부터의 독립성
- 2. 사용 편의성
- 3. 커버리지 보고서의 이해성
- 4. 안전이 중요한 개발을 위한 더 높은 커버리지 레벨 지원
- 5. 유연한 통합
- 6. 낮은 계측 오버헤드
- 7. 다양한 프로그래밍 언어 지원
- 8. "창의적인" 프로그래밍 지원
- 9. 안전이 중요한 소프트웨어 개발에 적합
- 10. 평가 라이선스, 기술 지원 및 고객 참조
이중 네번째 항목의 커버리지 레벨에 대해 좀더 자세히 살펴보면, 구조적 커버리지 측정 측면에서 Testwell CTC++는 다양한 측정레벨 옵션을 제공하며, ISO-26262, DO-178C, EN-50128 등의 산업표준에서는 이중 최대 MC/DC 까지의 높은 커버리지 레벨을 규정하고 있습니다.
이 글에서는 Testwell CTC++에서 지원하는 다양한 커버리지 레벨 중 MC/DC 커버리지와 Multicondition 커버리지의 개념과 두 측정방식의 차이점에 대해 살펴보고, 테스트 담당자 입장에서 MC/DC 측정방식이 가질 수 있는 이점에 대해 살펴보겠습니다.
Multicondition Coverage
Multicondition 커버리지는 코드상의 분기점에서 발생할 수 있는 모든 경우의 수를 포함하는 방식으로, 복합 조건상에서 발생할 수 있는 모든 True-False 조합 결과를 평가하기 위한 측정 방식입니다.
예를 들어 각각 True-False결과를 가질 수 있는 a, b, c, d를 요소로 가지는 조건문 ( a || b ) %% ( c || d ) 가 있다고 가정하면 여기에서 발생할 수 있는 7가지조합을 모두 테스트해야지만 100%의 커버리지 결과를 얻을 수 있습니다.
Tip : 여기서는 Short Circuit evaluation 법칙에 따라 무시될 수 있는 결과는 배제 된다는 점을 참고해야 합니다.
Short Circuit evaluation이란 논리식 연산에서 결과가 확실히 예상될 때 뒤의 연산을 실행하지 않고 무시하는 평가방식을 의미합니다.
Short Circuit evaluation에서는 AND 연산자 앞의 연산이 False인경우 AND 뒤의 연산은 생략되고, OR연산자는 앞 연산이 True가 나오면 뒤 연산은 생략됩니다.
이렇게 생략된 연산은 위 목록에서 Underscore(_) 로 표기합니다.
전체조건식의 구조가 복잡해질수록 필요한 테스트케이스의 수는 기하급수적으로 늘어날 것이라고 예상할 수 있습니다. 결국 테스트 담당자가 Multicondition 커버리지의 측정조건에 따라 테스트를 수행하려면 위와 같이 모든 조건에 대한 조합을 모두 만족하는 많은 테스트케이스를 필요로 할 것입니다.
Tip : ctc++의 ctcreport 명령에서 multicondition 보고서를 표시하려면 다음과 같이 옵션을 사용할 수 있습니다.
> ctcreport -measures m
MC/DC 커버리지 (Modified Condition/Decision Coverage)
MC/DC 커버리지에서는 각 조건식의 각 개별 요소가 전체 조건식 결과에 영향을 주는 경우를 조합하여 커버리지를 측정하는 방식입니다.
위의 Multicondition Coverage와 동일한 조건식을 예로들어 설명하면 다음과 같습니다.
위 7가지 경우 중 개별조건식이 전체결과에 영향을 주는 경우를 추려 내보면 다음과 같습니다.
- a 조건의 결과에 따라 전체 계산식의 결과가 달라지는 경우 : 1, 2, 7
- b 조건의 결과에 따라 전체 계산식의 결과가 달라지는 경우 : 3, 4, 7
- c 조건의 결과에 따라 전체 계산식의 결과가 달라지는 경우 : 1, 3, 5, 6
- d 조건의 결과에 따라 전체 계산식의 결과가 달라지는 경우 : 2, 4, 5, 6
추려낸 결과에서 각 개별조건식을 기준으로 대응되는 계산식을 Group으로 묶습니다.
a 조건식을 예로 들면, 1번과 7번은 a조건식의 결과만 다르고 나머지 조건식들의 결과가 같아서 서로 대응된다고 말할 수 있습니다.
2번과 7번 또한 마찬가지로 a조건식 외에 나머지 조건식들의 결과가 같은 경우입니다. (이때, Underscore(_)는 T와F의 경우를 모두 포함하는 것으로 계산합니다.)
이렇게 각 조건식을 기준으로 대응되는 계산식들을 Grouping하면 다음과 같은 목록을 얻을 수 있습니다.
- a : (1, 7) (2, 7)
- b : (3, 7) (4, 7)
- c : (1, 5) (3, 6)
- d : (2, 5) (4, 6)
MC/DC 측정 방식에서는 각 조건식 별로 Grouping된 조합 중 한가지 조합에 대한 테스트만 수행하면 해당 조건식에 대한 커버리지를 만족하는 것으로 간주합니다.
d 조건식을 예로 들면 Group으로 묶여있는 2번조건과 5번조건을 테스트하면 4번과 6번은 테스트하지 않아도 커버리지를 만족하게 됩니다.
이 방식을 바탕으로 테스트를 수행해야 하는 최소한의 조합을 생각해보면 다음의 경우만 테스트 하면 100%의 커버리지를 달성할 수 있다는 것을 알 수 있습니다.
- 1, 3, 4, 6, 7 또는
- 1, 2, 3, 5, 7
Tip : ctc++의 ctcreport 명령에서 multicondition 보고서를 표시하려면 다음과 같이 옵션을 사용할 수 있습니다.
> ctcreport -measures m
MC/DC 달성을 위해 필요한 테스트케이스를 도출하는 것이 조금 복잡해 보이지만, 다양한 산업인증의 코드 커버리지 조건을 만족시키고 그와 동시에 수행해야 하는 테스트케이스의 수를 줄여주는 MC/DC 측정방식은 프로젝트 수행 시간과 비용을 줄이는 데에 핵심적인 요소가 될 수 있다고 말할 수 있습니다.
Referenced from Verifysoft
- https://www.youtube-nocookie.com/embed/On-zRCClncw?si=5Tkic5lA4DCj0FH9
- https://www.verifysoft.com/HTML-Help-CTC-v10.0.1/source/MCDC_Coverage.html
- https://www.verifysoft.com/HTML-Help-CTC-v10.0.1/source/Multicondition_Coverage.html
- https://verifysoft.com/10-criteria-for-selecting-a-code-coverage-tool.pdf