반응형

 

먼저 예제 코드 구조는 아래와 같습니다.

디렉터리 구조

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 파일에 커버리지 결과가 산출된 것을 확인할 수 있습니다.

 

 

 

 

report.zip
0.39MB

 

 

 

+ 추가로 알아두면 좋을것,

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 $@, $<, $^, $*

 

 

반응형