티스토리 뷰

개발/그 외 개발관련

Google Test(GTest)란?

부캐: 개발하는 조대리 2025. 1. 16. 12:09
반응형

Google Test(GTest)

Google Test(GTest)는 C++ 코드의 단위 테스트(Unit Test)를 작성하고 실행할 수 있도록 도와주는 Google에서 개발한 오픈소스 테스트 프레임워크입니다.
✅ C++ 표준 라이브러리를 활용하며, 테스트 자동화, 어설션(assertions), 테스트 픽스처(Test Fixtures) 등의 기능을 제공합니다.

 

 

 

 

📌 Google Test의 기본 개념

  1. 어설션(Assertions) → 기대하는 값과 실제 값이 일치하는지 검사하는 명령어 (EXPECT_EQ, ASSERT_TRUE 등)
  2. 테스트 케이스(Test Cases) → 특정 기능을 테스트하는 함수 (TEST() 사용)
  3. 테스트 픽스처(Test Fixtures) → 여러 테스트에서 공통적으로 사용할 초기화/해제 코드를 제공 (TEST_F() 사용)

 

🔹 Google Test 설치

먼저 Google Test를 설치해야 합니다.

Ubuntu (Linux)

sudo apt install libgtest-dev
cd /usr/src/gtest
sudo cmake CMakeLists.txt
sudo make
sudo cp *.a /usr/lib

Windows

  1. Google Test GitHub에서 최신 코드 다운로드
  2. CMake를 사용해 빌드 후 프로젝트에 추가

 

🔹 간단한 Google Test 예제

🎯 1. 기본적인 테스트 코드

아래는 add() 함수를 Google Test로 검증하는 간단한 예제입니다.

// add.h
#ifndef ADD_H
#define ADD_H

int add(int a, int b);  // 함수 선언

#endif // ADD_H
// add.cpp
#include "add.h"

int add(int a, int b) {
    return a + b;  // 단순한 덧셈 함수
}
// test_add.cpp
#include <gtest/gtest.h>
#include "add.h"

// TEST(테스트 그룹 이름, 테스트 이름)
TEST(AddTest, HandlesPositiveNumbers) {
    EXPECT_EQ(add(2, 3), 5);    // 2 + 3 == 5
    EXPECT_EQ(add(10, 20), 30); // 10 + 20 == 30
}

TEST(AddTest, HandlesNegativeNumbers) {
    EXPECT_EQ(add(-2, -3), -5);  // -2 + (-3) == -5
    EXPECT_EQ(add(-10, 20), 10); // -10 + 20 == 10
}

TEST(AddTest, HandlesZero) {
    EXPECT_EQ(add(0, 0), 0); // 0 + 0 == 0
}

// main 함수: Google Test 실행을 위한 기본 코드
int main(int argc, char **argv) {
    ::testing::InitGoogleTest(&argc, argv);
    return RUN_ALL_TESTS();
}

 

 

🔹 테스트 실행 방법

컴파일하고 실행하면 테스트 결과를 확인할 수 있습니다.

빌드 및 실행 (Linux)

g++ -std=c++11 test_add.cpp add.cpp -o test -lgtest -lgtest_main -pthread
./test

 

출력 결과

[==========] Running 3 tests from 1 test suite.
[----------] Global test environment set-up.
[----------] 3 tests from AddTest
[ RUN      ] AddTest.HandlesPositiveNumbers
[       OK ] AddTest.HandlesPositiveNumbers (0 ms)
[ RUN      ] AddTest.HandlesNegativeNumbers
[       OK ] AddTest.HandlesNegativeNumbers (0 ms)
[ RUN      ] AddTest.HandlesZero
[       OK ] AddTest.HandlesZero (0 ms)
[----------] 3 tests from AddTest (0 ms total)

[==========] 3 tests from 1 test suite ran. (0 ms total)
[  PASSED  ] 3 tests.

모든 테스트가 성공적으로 실행됨을 확인할 수 있습니다.

 

🔹 TEST()와 ASSERT/EXPECT 차이점

함수 설명

EXPECT_EQ(a, b) a == b가 인지 확인 (실패해도 계속 진행)
ASSERT_EQ(a, b) a == b가 인지 확인 (실패하면 테스트 중단)
EXPECT_TRUE(cond) cond가 인지 확인
EXPECT_FALSE(cond) cond가 거짓인지 확인
TEST(SampleTest, Example) {
    EXPECT_EQ(4, 2 + 2);   // ✅ 통과
    EXPECT_TRUE(5 > 3);    // ✅ 통과
    ASSERT_EQ(10, 10);     // ✅ 통과
    ASSERT_FALSE(0);       // ✅ 통과
}

 

 

🔹 2. 테스트 픽스처(Test Fixtures)

TEST_F()를 사용하면 여러 테스트에서 공통된 초기화/해제 코드를 정의할 수 있습니다.

class MathTest : public ::testing::Test {
protected:
    void SetUp() override {  // 테스트 시작 전에 실행
        x = 10;
        y = 20;
    }

    void TearDown() override {  // 테스트 종료 후 실행
        // 리소스 정리
    }

    int x, y;
};

TEST_F(MathTest, Addition) {
    EXPECT_EQ(x + y, 30);
}

TEST_F(MathTest, Multiplication) {
    EXPECT_EQ(x * y, 200);
}

📌 SetUp(): 각 테스트 전에 실행
📌 TearDown(): 각 테스트 후에 실행

 

🔹 3. 매개변수화 테스트(Parameterized Test)

동일한 테스트를 여러 데이터로 실행하고 싶을 때 INSTANTIATE_TEST_SUITE_P()를 사용할 수 있습니다.

class AddParameterizedTest : public ::testing::TestWithParam<std::tuple<int, int, int>> {};

TEST_P(AddParameterizedTest, HandlesMultipleCases) {
    int a = std::get<0>(GetParam());
    int b = std::get<1>(GetParam());
    int expected = std::get<2>(GetParam());

    EXPECT_EQ(add(a, b), expected);
}

INSTANTIATE_TEST_SUITE_P(
    AddTests, AddParameterizedTest,
    ::testing::Values(
        std::make_tuple(1, 2, 3),
        std::make_tuple(-1, -1, -2),
        std::make_tuple(10, 5, 15)
    )
);

🚀 위의 코드에서 INSTANTIATE_TEST_SUITE_P()는 여러 입력 값으로 테스트를 실행하는 역할을 합니다.

 

🔹 4. Mocking(모의 객체) 사용

Google Mock(GMock)과 함께 사용하면 의존성을 제거한 유닛 테스트가 가능합니다.

#include <gmock/gmock.h>

class Database {
public:
    virtual int getData() = 0;
};

class MockDatabase : public Database {
public:
    MOCK_METHOD(int, getData, (), (override));
};

TEST(DatabaseTest, FetchData) {
    MockDatabase mockDb;
    EXPECT_CALL(mockDb, getData()).WillOnce(::testing::Return(42));

    EXPECT_EQ(mockDb.getData(), 42);
}

📌 Mock을 사용하면 실제 구현 없이 테스트 가능!

 

🎯 마무리: Google Test 요약

기능 설명

TEST() 기본적인 단위 테스트
EXPECT_EQ, ASSERT_EQ 어설션(Assertions)
TEST_F() 테스트 픽스처 사용
INSTANTIATE_TEST_SUITE_P() 매개변수화된 테스트
MOCK_METHOD() Mock 객체를 사용한 테스트

 

 

결론

  • Google Test(GTest)는 C++의 대표적인 단위 테스트 프레임워크입니다.
  • 설치가 쉽고 직관적인 테스트 문법을 제공하여 많은 C++ 프로젝트에서 사용됩니다.
  • TEST(), TEST_F(), EXPECT_EQ(), ASSERT_EQ() 같은 기능을 익히면 테스트 자동화에 큰 도움이 됩니다.

 


 

개인적으로 학습하면서 정리한 내용입니다.

잘못된 내용이 있을 경우 알려주시면 확인 후 수정 및 반영하도록 하겠습니다.

 

오늘도 감사합니다.(__)>