gcov를 이용하여 Coverage Report 산출하기 (C, C++)
2024. 11. 13. 00:09
우분투 환경에서 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가 산출됩니다.
이 글이 유익했거나 당신의 시간을 절약했다면 아래의 좋아요 부탁드립니다.
'C > Unit Test' 카테고리의 다른 글
[Unit Test] libgtest-dev 지우기 (0) | 2024.11.22 |
---|---|
Makefile로 C++ 파일을 Gtest와 Gcov를 이용해서 커버리지 리포트 산출하기 (0) | 2024.11.21 |
CMake를 활용해 Gtest 코드커버리지 뽑기 (1) | 2024.11.13 |
gtest 및 lcov를 활용하여 Unit Test 실행하고 Coverage Report 뽑기 (2) | 2024.11.13 |
gtest를 활용하여 Unit Test 실행하기 (2) | 2024.11.13 |