GTest
gtest 및 lcov를 활용하여 Unit Test 실행하고 Coverage Report 뽑기
2024. 11. 13. 01:23반응형
이전글 참고 https://i5i5.tistory.com/1384
STEP 1. main 예제코드 작성합니다.
gtest와 lcov를 설치합니다.
sudo apt-get install libgtest-dev
sudo apt-get install lcov
STEP 2. main 예제코드 작성합니다.
// func.h
#ifndef FUNC_H
#define FUNC_H
int add(int a, int b) {
return a + b;
}
int sub(int a, int b) {
return a - b;
}
void doPrint(int a) {
if (a == 1) {
printf("Hello I'm 1 \n");
} else if (a == 2) {
printf("Hello I'm 2 \n");
} else {
printf("None\n");
}
}
#endif // FUNC_H
STEP 3. 테스트 코드를 작성합니다
// add_test.cpp
#include <gtest/gtest.h>
#include "func.h"
// Test case for the add function
TEST(AdditionTest, HandlesAddPositiveNumbers) {
EXPECT_EQ(add(1, 2), 3);
EXPECT_EQ(add(5, 5), 10);
}
TEST(AdditionTest, HandlesAddNegativeNumbers) {
EXPECT_EQ(add(-1, -2), -3);
EXPECT_EQ(add(-5, 5), 0);
}
TEST(AdditionTest, HandlesAddMixedNumbers) {
EXPECT_EQ(add(-3, 3), 0);
EXPECT_EQ(add(10, -10), 0);
}
TEST(AdditionTest, HandlesSubPositiveNumbers) {
EXPECT_EQ(sub(3, 2), 1);
}
TEST(AdditionTest, HandlesDoPrint) {
doPrint(1);
}
// Main function to run all the tests
int main(int argc, char **argv) {
::testing::InitGoogleTest(&argc, argv);
return RUN_ALL_TESTS();
}
STEP 4. 빌드합니다.
g++ -fprofile-arcs -ftest-coverage func_test.cpp -lgtest -lgtest_main -pthread -o func_test
현재까지 생성된 파일들의 목록은 아래와 같습니다.
$ ls
func.h func_test func_test.cpp func_test.gcno
STEP 5. 실행파일을 실행합니다.
$ ./func_test
[==========] Running 5 tests from 1 test suite.
[----------] Global test environment set-up.
[----------] 5 tests from AdditionTest
[ RUN ] AdditionTest.HandlesAddPositiveNumbers
[ OK ] AdditionTest.HandlesAddPositiveNumbers (0 ms)
[ RUN ] AdditionTest.HandlesAddNegativeNumbers
[ OK ] AdditionTest.HandlesAddNegativeNumbers (0 ms)
[ RUN ] AdditionTest.HandlesAddMixedNumbers
[ OK ] AdditionTest.HandlesAddMixedNumbers (0 ms)
[ RUN ] AdditionTest.HandlesSubPositiveNumbers
[ OK ] AdditionTest.HandlesSubPositiveNumbers (0 ms)
[ RUN ] AdditionTest.HandlesDoPrint
Hello I'm 1
[ OK ] AdditionTest.HandlesDoPrint (0 ms)
[----------] 5 tests from AdditionTest (0 ms total)
[----------] Global test environment tear-down
[==========] 5 tests from 1 test suite ran. (0 ms total)
[ PASSED ] 5 tests.
실행파일 실행하면, 코드가 실행된 부분에 대한 커버리지 데이터를 포함하는 gcda 파일이 생성된 걸 확인할 수 있습니다.
$ ls
func.h func_test func_test.cpp func_test.gcda func_test.gcno
STEP 6. gcov를 사용하여 커버리지 리포트 생성합니다.
gcov 명령어를 사용하여 커버리지 리포트를 생성합니다
gcov func_test.cpp
이 명령어는 add_test.cpp.gcov 파일을 생성하며, 이 파일에는 각 코드 줄의 커버리지 정보가 포함됩니다.
$ ls
alloc_traits.h.gcov func_test gtest-internal.h.gcov stl_iterator_base_types.h.gcov
basic_string.h.gcov func_test.cpp gtest-port.h.gcov tuple.gcov
basic_string.tcc.gcov func_test.cpp.gcov gtest-printers.h.gcov type_traits.h.gcov
char_traits.h.gcov func_test.gcda move.h.gcov unique_ptr.h.gcov
func.h func_test.gcno new_allocator.h.gcov
func.h.gcov gtest.h.gcov stl_iterator_base_funcs.h.gcov
STEP 7. (선택 사항) HTML 리포트 생성합니다.
lcov와 genhtml을 사용하여 HTML 형식의 리포트를 생성할 수 있습니다.
# lcov로 커버리지 수집
lcov --capture --directory . --output-file coverage.info
위의 명령어를 실행한 결과는 아래와 같습니다.
$ lcov --capture --directory . --output-file coverage.info
Capturing coverage data from .
Found gcov version: 9.4.0
Using intermediate gcov format
Scanning . for .gcda files ...
Found 1 data files in .
Processing func_test.gcda
Finished .info-file creation
coverage.info가 산출된걸 확인할 수 있습니다.
$ ls coverage.info
coverage.info
이후 HTML 리포트를 생성합니다.
# HTML 리포트 생성
genhtml coverage.info --output-directory out
위 명령어를 실행하면 out 디렉토리 내에 HTML 형식의 커버리지 리포트가 생성되며,
웹 브라우저에서 파일을 열어 상세한 커버리지 리포트를 확인할 수 있습니다.
$ genhtml coverage.info --output-directory out
Reading data file coverage.info
Found 18 entries.
Found common filename prefix "/usr/include"
Writing .css and .png files.
Generating output.
Processing file /home/kai/98.Study/gcov/func_test.cpp
Processing file /home/kai/98.Study/gcov/func.h
Processing file c++/9/tuple
Processing file c++/9/bits/unique_ptr.h
Processing file c++/9/bits/basic_string.h
Processing file c++/9/bits/basic_string.tcc
Processing file c++/9/bits/char_traits.h
Processing file c++/9/bits/alloc_traits.h
Processing file c++/9/bits/move.h
Processing file c++/9/bits/stl_iterator_base_funcs.h
Processing file c++/9/bits/stl_iterator_base_types.h
Processing file c++/9/ext/new_allocator.h
Processing file c++/9/ext/alloc_traits.h
Processing file c++/9/ext/type_traits.h
Processing file gtest/gtest.h
Processing file gtest/gtest-printers.h
Processing file gtest/internal/gtest-port.h
Processing file gtest/internal/gtest-internal.h
Writing directory view page.
Overall coverage rate:
lines......: 39.3% (66 of 168 lines)
functions..: 33.7% (35 of 104 functions)
이후 out 폴더가 생성된 걸 확인할 수 있습니다.
$ ls -al out
total 80
drwxrwxr-x 5 kai kai 4096 11월 13 01:17 .
drwxrwxr-x 3 kai kai 4096 11월 13 01:17 ..
-rw-rw-r-- 1 kai kai 141 11월 13 01:17 amber.png
drwxrwxr-x 3 kai kai 4096 11월 13 01:17 c++
-rw-rw-r-- 1 kai kai 141 11월 13 01:17 emerald.png
-rw-rw-r-- 1 kai kai 9893 11월 13 01:17 gcov.css
-rw-rw-r-- 1 kai kai 167 11월 13 01:17 glass.png
drwxrwxr-x 3 kai kai 4096 11월 13 01:17 gtest
drwxrwxr-x 3 kai kai 4096 11월 13 01:17 home
-rw-rw-r-- 1 kai kai 6371 11월 13 01:17 index.html
-rw-rw-r-- 1 kai kai 6364 11월 13 01:17 index-sort-f.html
-rw-rw-r-- 1 kai kai 6364 11월 13 01:17 index-sort-l.html
-rw-rw-r-- 1 kai kai 141 11월 13 01:17 ruby.png
-rw-rw-r-- 1 kai kai 141 11월 13 01:17 snow.png
-rw-rw-r-- 1 kai kai 117 11월 13 01:17 updown.png
이것을 바탕화면에 드래그 앤 드랍을 한 후 index.html을 실행합니다.
이 글이 유익했다면 아래의 하트 부탁드립니다.
반응형
'GTest' 카테고리의 다른 글
[Unit Test] libgtest-dev 지우기 (0) | 2024.11.22 |
---|---|
Makefile로 C++ 파일을 Gtest와 Gcov를 이용해서 커버리지 리포트 산출하기 (0) | 2024.11.21 |
CMake를 활용해 Gtest 코드커버리지 뽑기 (1) | 2024.11.13 |
gtest를 활용하여 Unit Test 실행하기 (2) | 2024.11.13 |
gcov를 이용하여 Coverage Report 산출하기 (C, C++) (2) | 2024.11.13 |