C-SPY를 활용한 코드 커버리지 측정법
상태바
C-SPY를 활용한 코드 커버리지 측정법
  • 이현도 IAR Systems 과장
  • 승인 2019.06.14 09:00
  • 댓글 0
이 기사를 공유합니다

코드 커버리지는 일반적으로 소프트웨어를 테스트할 때 수행한 테스트가 코드를 어느 정도 커버하는지, 충분한 테스트가 됐는가를 지표로 참고할 수 있는 정보를 말한다. 코드 커버리지는 측정 기준에 따라 구문, 조건, 결정, MC/DC 등으로 다양하게 구분된다. 개발자 단위 테스트에서 일반적으로 가장 많이 사용하는 커버리지는 구문 커버리지다.

말 그대로 해당 코드가 수행됐는지 확인할 수 있는 커버리지다.  코드 테스트를 수행한 뒤 테스트가 얼마만큼의 코드를 커버하는지, 테스트 중 대상 코드들이 모두 수행됐는지 등의 정보를 가지고 테스트의 정상 수행 여부를 판단할 수 있다.

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

참고로 IAR Embedded Workbench의 C-SPY 디버거에는 코드 커버리지를 측정할 수 있는 기능이 포함돼 있다. 이번 글에서 C-SPY를 사용하여 코드 커버리지의 측정 방법을 알아볼 것이다.

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] 참고로 위의 체크 항목들은 기본 설정값으로 활성화돼 있다.

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

[그림2]

Code Coverage 창의 결과 내용은 프로젝트, 모듈, 함수, 그리고 문장 순서의 트리구조로 표시된다. 해당 윈도우에는 디버그 정보와 함께 컴파일된 소스 코드만을 표시한다. 따라서, startup 코드, exit 코드와 라이브러리 코드는 이 윈도우에서 표시되지 않으며, 인라인 함수의 문장에 대한 커버리지 정보도 표시되지 않는다. 단지 인라인 함수 호출을 포함하는 문장만이 실행된 것으로 표시될 뿐이다.

출력된 정보 중 아이콘들은 현재 상태를 요약한 내용입니다. 아이콘의 의미는 다음과 같다.
  - 적색 다이아몬드: 모듈 또는 함수의 실행이 0%인 것을 의미한다.
  - 녹색 다이아몬드: 모듈 또는 함수의 실행이 100%인 것을 의미한다.
  - 적색과 녹색 다이아몬드: 모듈 또는 함수의 실행이 일부인 것을 의미한다.
  - 노란색 다이아몬드: 실행되지 않은 문을 의미한다.

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

[그림3]

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

[그림4]

- 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를 수행하자.

[그림5]

위의 예와 같이 설정하면 Disassembly창에 수행된 명령어 앞에는 녹색 마름모의 아이콘이 생기고 수행되지 않은 명령어에는 아무 표시가 되지 않는다.
[그림6]은 명령어 레벨에서의 코드 커버리지 측정 예시다.

[그림6]

맺음말

코드의 품질 향상을 위해 개발되는 코드의 테스트는 지속해서 강화되고 있다. 또한, 코드의 품질뿐 아니라 코드의 테스트 품질을 위한 여러 노력도 필요하다. 테스트의 품질이 좋아지면 코드의 품질 향상, 그리고 개발 기간과 비용의 단축으로 이어질 수 있기 때문이다. 코드 커버리지는 개발자의 단위 테스트 혹은 통합 테스트에서 테스트의 평가 지표로 사용될 수 있다. 개발 도구를 최대한 활용해 개발의 완성도를 높이길 바란다.

글: IAR Systems 이현도 과장 - Hyun-Do.Lee@iar.com