반응형

 

우분투 환경에서 gcov를 이용하여 Coverage Report(커버리지 리포트)를 산출하는 방법을 소개합니다.

 

STEP 1. 샘플 메인 코드 작성합니다. (main.c)

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main(){
  srand(time(NULL));
  int doPrint = rand() % 2;

  if (doPrint) {
    printf("Hello world printed 1\n");
    printf("Hello world printed 2\n");
    printf("Hello world printed 3\n");
    printf("Hello world printed 4\n");
  } else {
    printf("Good-Bye world printed 1\n");
    printf("Good-Bye world printed 2\n");
  }
  printf("main end");
}

 

 

STEP 2. 빌드 및 실행파일을 만듭니다.

아래의 명령어로 빌드 및 실행파일을 만듭니다.

gcc --coverage -o coverage main.c

 

 

이후 ls 명령어를 쳐보면 coverage라는 실행파일과 main.gcno 파일이 생성된 것을 확인할 수 있습니다.

$ ls
coverage  main.c  main.gcno

 

 

이후, 실행파일을 실행하면 아래 두 출력결과 중 하나를 얻게 될 것입니다.

 

(예상 출력결과 1)

$ ./coverage
Hello world printed 1
Hello world printed 2
Hello world printed 3
Hello world printed 4

 

(예상 출력결과 2)

$ ./coverage
Good-Bye world printed 1
Good-Bye world printed 2

 

이 단계까지 오셨으면 아래의 gcda 파일이 생성된 것을 확인할 수 있습니다.

$ ls
coverage  main.c  main.gcda  main.gcno

 

 

※ 여기서 gcda파일과 gcno파일이란?

gcno 파일: 코드의 구조 정보를 저장하고 있습니다. .gcno 노트 파일은,  GCC -ftest-coverage 옵션으로 소스파일이 컴파일 될 때 생성됩니다. 이것은 기본 블락 그래프들을 재구성하는 정보를 포함하고 있으며 소스 라인 번호를 블락에 할당합니다.

 즉, 컴파일할 때 생생성되며, 소스파일의 정보가 담긴 파일이라고 생각하시면 됩니다.

 

gcda 파일:  각 코드 부분이 얼마나 실행되었는지에 대한 정보가 담겨있습니다.

 .gcno 카운트 데이터 파일은, GCC -fprofile-arcs 옵션으로 빌드된 오브젝트 파일을 포함한 프로그램이 실행될 때, 생성됩니다.  각각의 .gcda 파일은 이 옵션으로 컴파일된 각각의 오브젝트 파일을 위해 생성됩니다. 이것은 arc transition counts, value profile counts, 그리고 약간의 요약 정보를 포함하고 있습니다.

 

  이 파일은 프로그램이 실제로 실행되면서 생성되며, 실행 중 각 코드 부분이 얼마나 실행되었는지에 대한 정보가 담겨 있습니다. gcda 파일은 코드의 실행 데이터를 기록하는 역할을 하며, 이 데이터는 나중에 gcno 파일과 함께 코드 커버리지 분석에 사용됩니다.

 (출처: 공식 gocv 홈페이지 https://gcc.gnu.org/onlinedocs/gcc/Gcov-Data-Files.html)

 

※ --coverage 옵션:  코드 커버리지 분석에 필요한 모든 옵션(-fprofile-arcs와 -ftest-coverage)을 포함하여 간편하게 설정합니다. 

 

 

 

STEP 3. Coverage Report를 산출합니다.  (gcda, gcno 이용)

먼저 gcovr을 install 합니다.

  이 gcovr는 코드 커버리지(coverage) 보고서를 생성해주는 도구인데, 주로 C와 C++ 프로젝트에서 테스트 커버리지를 측정하는 데 사용됩니다.

  gcovr는 GCC의 커버리지 도구인 gcov의 출력 파일을 읽어 들여, 전체적인 테스트 커버리지를 요약한 보고서를 제공합니다.

sudo apt install gcovr

 

 

이후 gcovr 을 이용하여 html 파일을 생성합니다. 

gcovr --html-details -r . --html coverageReport.html

 

여담이지만, 아래와 같이 csv 파일이나 json 파일로도 반환할 수 있습니다.

gcovr -r . --csv coverage.csv
gcovr -r . --json coverage.json

 

 

여기까지 진행하셨다면 ls 상황은 아래일 겁니다.

$ ls
coverage  coverageReport.html  coverageReport.main.c.html  main.c  main.gcda  main.gcno

 

 

여기서 coverageReport.html을 열어봅니다.

 

 

 

그 후 main.c 클릭해봅니다. 

 

 위와 같이, 실행파일이 지나갔던 코드 흔적을 볼 수 있습니다. (이것이 Coverage Report(커버리지 리포트)입니다.)

 

추가적으로, else 문에 도달할 정도로 ./coverage 실행파일을 여러번 실행시키면, 해당 else 구문까지 Coverage report가 산출됩니다.

 

 

 

이 글이 유익했거나 당신의 시간을 절약했다면 아래의 좋아요 부탁드립니다.

반응형