반응형

 

이전글 참고 https://i5i5.tistory.com/1384

 

gtest를 활용하여 Unit Test 실행하기

gtest 는 GoogleTest의 줄임말로, C++ 테스팅 프레임워크입니다.이것을 활용하여 C++ 코드를 테스트해보려 합니다. STEP 1. gtest를 설치합니다.sudo apt-get install libgtest-dev STEP 2. main 예제코드를 생성합니

i5i5.tistory.com

 

 

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을 실행합니다.

 

 

 

 

 

 

 

 

 

 

 

이 글이 유익했다면 아래의 하트 부탁드립니다.

반응형