배너
닫기

테크노트

배너

[기고] 코드 커버리지

  • 등록 2019.06.01 22:28:42
URL복사

[첨단 헬로티]



코드 커버리지(Code Coverage)는 일반적으로 소프트웨어를 테스트할 때 수행한 테스트가 어느 정도 코드를 커버하고 있고 충분한 테스트가 되었는가의 지표로 참고할 수 있는 정보이다. IAR Embedded Workbench의 C-SPY 디버거에는 코드 커버리지를 측정할 수 있는 기능이 포함돼 있다. 이번 글에서 C-SPY를 사용하여 코드 커버리지의 측정 방법을 알아본다.


코드 커버리지는 측정 기준에 따라 구문, 조건, 결정, MC/DC 등 다양하게 구분된다.

개발자의 단위 테스트에서 일반적으로 가장 많이 사용하는 커버리지는 구문 커버리지이다. 말 그대로 해당 코드가 수행 되었는지 확인할 수 있는 커버리지이다. 코드의 테스트를 수행한 후 테스트가 얼마만큼의 코드를 커버하는지, 테스트 중 테스트 대상의 코드들이 모두 수행 되었는지 등의 커버리지 정보를 가지고 테스트의 정상 수행 여부를 판단할 수 있다.


코드 커버리지는 코드를 수행하며 측정되기에 정적 분석으로 측정할 수 없다. 반드시 동적 검사가 필요하며, 일반적으로 고급 디버거에 코드 커버리지 기능이 포함돼 있다. 코드 커버리지 외에 조건, 결정, MC/DC 등 복잡한 커버리지 측정은 디버거가 아닌 전문화된 도구를 사용하여 측정이 가능하다.


C-SPY의 코드 커버리지 측정 기능

C-SPY의 코드 커버리지 측정 기능을 사용하기 위하여 몇 가지 요구사항과 제약사항이 있다. 우선 디버거 드라이버를 시뮬레이터(Simulator)로 사용하면 요구사항과 제약사항이 없다. 하지만 디버깅 프로브를 이용해 타깃에 연결된 상태에서는 다음과 같이 고려해야할 사항이 있다.


디버깅 프로브의 연결은 SWD 인터페이스 연결과 SWO핀의 연결이 필요하다. 또는 트래이스(Trace) 장비의 경우 Trace 기능 사용을 위한 Trace 관련 핀 연결이 필요하다.


SWO를 이용해 코드 커버리지를 측정하는 경우, PC 샘플러(Sampler)를 이용해 커버리지를 측정한다. 이러한 경우 모든 코드 수행 이력을 확인할 수 없어서 100% 신뢰할 수 있는 커버리지 측정이 되지 않는다. 참고 용도의 자료로만 사용이 가능하다.

Trace 데이터 수집이 가능한 경우 모든 실행 이력의 확인 가능해 정확한 커버리지 측정이 가능하다.


코드 커버리지 측정이 가능한 디버거 드라이버는 아래와 같다.

The C-SPY Simulator

The C-SPY I-jet/JTAGjet driver

The C-SPY J-Link/J-Trace driver

The C-SPY CMSIS-DAP driver

The C-SPY ST-LINK driver

The C-SPY TI XDS driver.

코드 커버리지 측정을 위해 프로젝트 옵션 설정의 확인이 필요하다.

프로젝트 옵션에서 다음의 기능이 활성화 돼 있는지 확인해야 한다.


[그림 1]


[그림 2]

참고로 위의 체크 항목들은 기본 설정값으로 활성화 돼 있다.

C-SPY 디버거에서 View -> Code Coverage 메뉴로 Code Coveragre 창을 실행한다. 이 후 마우스 오른쪽 버튼 또는  버튼으로 Code Coverage 측정을 활성화 한다. 이 후 코드를 수행하고 Refresh 또는 Auto-Refresh를 하면 코드 커버리지가 측정돼 결과를 출력한다.

다음 그림은 코드 커버리지 측정한 결과 출력의 예이다.


[그림 3]


Code Coverage창의 결과 내용은 프로젝트, 모듈, 함수, 그리고 문장 순서의 트리구조로 표시된다. 해당 윈도우에는 디버그 정보와 함께 컴파일된 소스코드만을 표시한다.따라서 startup 코드, exit 코드 및 라이브러리 코드는 이 윈도우에서 표시되지 않는다. 또한, 인라인 함수의 문장에 대한 커버리지 정보도 표시되지 않는다. 단지 인라인 함수 호출을 포함하는 문장만이 실행된 것으로 표시된다. 출력된 정보 중 아이콘들은 현재 상태를 요약한 내용이다. 아이콘의 의미는 다음과 같다.


- 적색 다이아몬드 : 모듈 또는 함수의 실행이 0%인 것을 의미한다.

- 녹색 다이아몬드 : 모듈 또는 함수의 실행이 100%인 것을 의미한다.

- 적색과 녹색 다이아몬드 : 모듈 또는 함수의 실행이 일부인 것을 의미한다.

- 노란색 다이아몬드 : 실행되지 않은 문을 의미한다.프로젝트, 모듈, 그리고 함수라인의 끝에 표시되는 비율은 지금까지 수행된 코드 구문의 양을 보여준다. 실행되지 않은 구문에 대해(노란색 다이아몬드), 표시되는 정보는 소스 윈도우에서 문장의 열 번호범위와 행 번호이다. 더블클릭 하면 해당 소스코드 위치를 에디터에서 확인이 가능하다. 에디터에서 또한 수행된 코드에는 회색의 음영 처리가 돼 쉽게 수행여부 확인이 가능하다.


[그림 4]Code Coverage 창에서 마우스 오른쪽 버튼을 누르면 컨텍스트 메뉴가 나타나며, 해당 메뉴의 기능은 다음과 같다.


[그림 5]


- Activate (활성화) : 실행하는 동안 켜고 코드범위를 전환한다.

- 지움 (Clear) : 코드 커버리지 정보를 삭제한다. 모든 단계포인트(step point)는 실행하지 않음으로 표시된다.

- 새로고침 (Refresh) : 코드 커버리지 정보를 업데이트하고 윈도우를 새로 고쳐 표시한다. 마지막 새로고침 이후 실행된 모든 단계포인트는 트리에서 제거된다.

- 자동 새로고침 (Auto-refresh) : 코드 커버리지 정보의 자동 새로고침을 키거나 끈다. 기능을 활성화하면, C-SPY가 브레이크 포인트에서, 단계 포인트에서, 그리고 프로그램 종료에 멈추는 경우 코드 커버리지 정보는 자동으로 다시 로드된다.

- 다른 이름으로 저장 (Save As) : 텍스트 파일 형태로 현재 코드 커버리지 결과를 저장한다.

- 세션 저장 ( Save session) : 코드 커버리지 세션 데이터를 *.dat 파일로 저장한다. 어떤 이유로 디버그 세션을 중지해야 하지만, 나중에 이 세션을 계속 하려는 경우에 유용하다. 이 명령은 도구모음에서 사용할 수 있다.

- 세션 복원 (Restore session) : 이전에 저장한 코드 커버리지 세션 데이터를 복원한다. 어떤 이유로 디버그 세션을 중지해야 했지만, 나중에 이 세션을 계속하려는 경우에 유용하다. 이 명령은 도구모음에서 사용할  수 있다.코드 커버리지는 C/C++ 코드 레벨에서 수행 여부를 확인할 뿐 아니라 어셈블리어 레벨에서도 커버리지를 확인할 수 있다. C-SPY 디버거의 Disassembly 창에서 마우스 오른쪽 버튼 클릭 후 나타나는 컨텍스트 메뉴 중 Code Coverage 항목에서 Enable, Show를 한다.


[그림6]

위의 예와 같이 설정하면 Disassembly창에 수행된 명령어 앞에는 녹색 마름모의 아이콘이 생기고 수행되지 않은 명령어에는 아무 표시가 되지 않는다.

다음은 명령어 레벨에서의 코드 커버리지 측정 예이다.


[그림 7]


맺음말

코드의 품질 향상을 위해 개발되는 코드의 테스트는 지속적으로 강화 되어가고 있다. 또한, 코드 품질 뿐만 아니라 코드의 테스트 품질을 위해 여러가지 노력이 필요하다. 테스트의 품질이 좋아지면 코드의 품질 향상과 개발 기간과 비용의 단축으로 이어질 수 있다. 

코드 커버리지는 개발자의 단위 테스트 또는 통합 테스트에서 테스트의 평가 지표로 사용할 수 있다. 개발 도구의 최대한의 활용으로 개발의 품질을 높이길 바란다.


글 / 이현도 IAR Systems 과장



















주요파트너/추천기업