티스토리 뷰
반응형
Google Test(GTest)는 C++ 코드의 단위 테스트(Unit Test)를 작성하고 실행할 수 있도록 도와주는 Google에서 개발한 오픈소스 테스트 프레임워크입니다.
✅ C++ 표준 라이브러리를 활용하며, 테스트 자동화, 어설션(assertions), 테스트 픽스처(Test Fixtures) 등의 기능을 제공합니다.
📌 Google Test의 기본 개념
- 어설션(Assertions) → 기대하는 값과 실제 값이 일치하는지 검사하는 명령어 (EXPECT_EQ, ASSERT_TRUE 등)
- 테스트 케이스(Test Cases) → 특정 기능을 테스트하는 함수 (TEST() 사용)
- 테스트 픽스처(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
- Google Test GitHub에서 최신 코드 다운로드
- 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() 같은 기능을 익히면 테스트 자동화에 큰 도움이 됩니다.
개인적으로 학습하면서 정리한 내용입니다.
잘못된 내용이 있을 경우 알려주시면 확인 후 수정 및 반영하도록 하겠습니다.
오늘도 감사합니다.(__)>
'개발 > 그 외 개발관련' 카테고리의 다른 글
AUTOSAR Communication Manager(ComM) 네트워크 상태 자세히 알아보기 (1) | 2025.01.24 |
---|---|
AUTOSAR Classic Platform과 Adaptive Platform의 상세 비교 (0) | 2025.01.20 |
CAN TP (CAN Transport Protocol) 설명 (0) | 2025.01.08 |
AUTOSAR 통신 스택 계층별 모듈 설명 (0) | 2025.01.07 |
CMake 가이드 (0) | 2025.01.03 |