Makefile로 C++ 파일을 Gtest와 Gcov를 이용해서 커버리지 리포트 산출하기
2024. 11. 21. 01:26
먼저 예제 코드 구조는 아래와 같습니다.
디렉터리 구조
project/
├── Makefile
├── src/
│ ├── main.cpp
│ ├── example.cpp
│ └── example.h
├── test/
│ ├── example_test.cpp
├── build/
└── report/
STEP 1. Makefile 작성
# Compiler and flags
CXX = g++
CXXFLAGS = -std=c++17 -Wall -Wextra -g -fprofile-arcs -ftest-coverage -I$(SRC_DIR)
# Directories
SRC_DIR = src
TEST_DIR = test
BUILD_DIR = build
REPORT_DIR = report
# Files
SRC_FILES = $(wildcard $(SRC_DIR)/*.cpp)
TEST_FILES = $(wildcard $(TEST_DIR)/*.cpp)
OBJECTS = $(SRC_FILES:$(SRC_DIR)/%.cpp=$(BUILD_DIR)/%.o)
TEST_OBJECTS = $(TEST_FILES:$(TEST_DIR)/%.cpp=$(BUILD_DIR)/%.o)
# Google Test location (adjust based on your installation)
GTEST_DIR = /usr/src/gtest
GTEST_LIB = -lgtest -lgtest_main -pthread
# Output
TEST_EXEC = $(BUILD_DIR)/test_executable
# Default target
all: test coverage
# Compile source files
$(BUILD_DIR)/%.o: $(SRC_DIR)/%.cpp
mkdir -p $(BUILD_DIR)
$(CXX) $(CXXFLAGS) -c $< -o $@
# Compile test files
$(BUILD_DIR)/%.o: $(TEST_DIR)/%.cpp
mkdir -p $(BUILD_DIR)
$(CXX) $(CXXFLAGS) -c $< -o $@
# Link test executable
$(TEST_EXEC): $(OBJECTS) $(TEST_OBJECTS)
$(CXX) $(CXXFLAGS) $^ -o $@ $(GTEST_LIB)
# Run tests
test: $(TEST_EXEC)
./$(TEST_EXEC)
# Generate coverage report
coverage: test
mkdir -p $(REPORT_DIR)
lcov --capture --directory $(BUILD_DIR) --output-file $(REPORT_DIR)/coverage.info
genhtml $(REPORT_DIR)/coverage.info --output-directory $(REPORT_DIR)
# Clean up
clean:
rm -rf $(BUILD_DIR) $(REPORT_DIR)
# Phony targets
.PHONY: all test coverage clean
주요 설명은 아래와 같습니다.
1. 컴파일 플래그:
-fprofile-arcs, -ftest-coverage: Gcov가 코드 커버리지 정보를 수집하도록 설정합니다.
-g: 디버그 심볼을 포함합니다.
2. Google Test 라이브러리:
-lgtest, -lgtest_main: GTest 라이브러리를 링크합니다.
GTest를 시스템에 설치해야 합니다. (sudo apt-get install libgtest-dev)
3. Coverage Report 생성:
lcov: 커버리지 데이터를 수집합니다.
genhtml: HTML 형식의 커버리지 리포트를 생성합니다.
4. 테스트 실행:
make test: GTest를 실행합니다.
make coverage: 테스트 실행 후 커버리지 리포트를 생성합니다.
5. CXXFLAGS에 -I$(SRC_DIR) 추가:
CXXFLAGS = -std=c++17 -Wall -Wextra -g -fprofile-arcs -ftest-coverage -I$(SRC_DIR)
이 플래그는 컴파일러가 src 디렉토리를 헤더 파일 검색 경로에 추가하도록 합니다.
※ Google Test와 lcov를 위해 아래와 같은 패키지 설치가 필요할 수 있습니다.
sudo apt-get install libgtest-dev
sudo apt-get install lcov
(dpkg -s libgtest-dev 명령어로, libgtest-dev가 설치가 이미 되어있는지 확인 가능합니다.)
STEP 2. 예제 코드 작성
src/example.h
#ifndef EXAMPLE_H
#define EXAMPLE_H
class Example {
public:
Example(int value);
int getValue() const;
int add(int x) const;
private:
int value_;
};
#endif // EXAMPLE_H
src/example.cpp
#include "example.h"
Example::Example(int value) : value_(value) {}
int Example::getValue() const {
return value_;
}
int Example::add(int x) const {
return value_ + x;
}
src/main.cpp
#include <iostream>
#include "example.h"
int main() {
Example ex(10);
std::cout << "Value: " << ex.getValue() << std::endl;
std::cout << "Add 5: " << ex.add(5) << std::endl;
return 0;
}
test/example_test.cpp
#include "example.h"
#include <gtest/gtest.h>
// Test constructor and getValue
TEST(ExampleTest, ConstructorAndGetValue) {
Example ex(10);
EXPECT_EQ(ex.getValue(), 10);
}
// Test add method
TEST(ExampleTest, AddMethod) {
Example ex(10);
EXPECT_EQ(ex.add(5), 15);
EXPECT_EQ(ex.add(-3), 7);
}
STEP 3. 프로젝트 실행
1) Makefile로 빌드 및 테스트
위 Makefile을 사용하여 프로젝트를 컴파일 및 테스트합니다:
make clean
make
make test
2) Coverage Report 생성
커버리지 리포트를 생성합니다:
make coverage
이후 report 파일에 커버리지 결과가 산출된 것을 확인할 수 있습니다.
+ 추가로 알아두면 좋을것,
GTEST_DIR 변수는 사용자 정의 변수입니다. (내장 변수가 아니라) GTEST_DIR은 Google Test(GTest) 라이브러리가 설치된 디렉토리를 나타내기 위해 사용된 변수입니다. Makefile에서 사용자 정의 변수로 선언되었고, Google Test를 빌드하거나 링크할 때 편리하게 사용하기 위해 정의된 것입니다.
GTEST_DIR = /usr/src/gtest
위에서 /usr/src/gtest는 Google Test 소스 코드가 위치한 디렉토리입니다.
사용자 정의 변수와 내장 변수의 차이
특징 | 사용자 정의 변수 | 내장 변수 |
정의 방식 | 사용자가 = 또는 :=으로 직접 정의 | Makefile 또는 GNU Make에서 기본 제공 |
사용 목적 | 특정 경로, 옵션, 파일 이름 등을 저장 | 빌드 프로세스 자동화 (타겟, 종속성 등) |
예시 | CC, CXXFLAGS, GTEST_DIR | $@, $<, $^, $* |
'C > Unit Test' 카테고리의 다른 글
[Unit Test] libgtest-dev 다운로드하고 수동으로 Makefile에 적용하기 (0) | 2024.11.22 |
---|---|
[Unit Test] libgtest-dev 지우기 (0) | 2024.11.22 |
CMake를 활용해 Gtest 코드커버리지 뽑기 (1) | 2024.11.13 |
gtest 및 lcov를 활용하여 Unit Test 실행하고 Coverage Report 뽑기 (2) | 2024.11.13 |
gtest를 활용하여 Unit Test 실행하기 (2) | 2024.11.13 |