Parameterized Tests (TEST_P)로 여러 입력 검증하기
Google Test에는 단일 테스트 케이스를 여러 입력 값으로 반복 실행할 수 있는 매개변수화된 테스트 기능이 있습니다.
TEST_P()와 INSTANTIATE_TEST_SUITE_P() 매크로를 사용하면, 하나의 테스트 로직에 여러 입력/출력 데이터를 제공하여 중복 코드를 줄이고, 다양한 케이스를 한꺼번에 검증할 수 있습니다.
이번 예제에서는 팩토리얼(Factorial) 계산 함수를 테스트합니다.
- 팩토리얼 함수(Factorial)는 음수가 아닌 정수 _n_에 대해 n! (n 팩토리얼)을 계산합니다.
- 정상적인 입력에 대해 올바른 결과를 반환하는지, 음수 입력에 대해서는 예외를 던지는지 검증할 것입니다.
프로젝트 구조는 다음과 같이 구성합니다.
project-root/
├── src/
│ ├── CMakeLists.txt
│ ├── factorial.h
│ └── factorial.cpp
├── test/
│ ├── CMakeLists.txt
│ ├── test_factorial.cpp
│ └── test_main.cpp
└── CMakeLists.txt
프로젝트 환경은 각자의 상황에 따라 달라질 수 있으므로 TEST_P()의 용도를 이해할 수 있도록 참고하세요. 이 글의 환경은 VSCode와 Cygwin을 활용해 이 예제를 실행하여 매개변수화 테스트의 사용법을 작성합니다.
환경 설치가 아직 준비되어 있지 않다면 다음 링크들을 참고하여 먼저 준비하고 다음 과정을 진행하세요.
[VSCode]Windows에 VS Code를 먼저 설치해볼까!
VS Code 설치 가이드1. VS Code란?VS Code(Visual Studio Code)는 Microsoft에서 제공하는 무료 코드 편집기로, 가볍고 빠른 성능을 제공하면서도 강력한 기능을 갖춘 개발 환경입니다. 다양한 프로그래밍 언어
all-tech-hub.tistory.com
[Cygwin]Windows에서 Linux처럼 C,C++개발!
Cygwin+VS Code 환경 설정오늘은 C++ 개발을 위한 VS Code + Cygwin 환경 설정 방법을 작성해 보겠습니다. Cygwin을 사용하면 Windows 환경에서 리눅스와 유사한 개발 환경을 구성할 수 있어, 특히 GNU 컴파
all-tech-hub.tistory.com
[TDD C++(1)]TDD 도구 설치! GoogleTest란? 또 구글!
Windows기반 GoogleTest 설치하기 Google Test(googletest)는 구글에서 개발한 C++ 단위 테스트(Unit Testing) 프레임워크입니다. 대표적으로 다음과 같은 특징을 자랑하고 있습니다.쉽고 직관적인 API로 다양한
all-tech-hub.tistory.com
1. 소스 코드 작성
1.1 src/factorial.h
#ifndef FACTORIAL_H
#define FACTORIAL_H
// 팩토리얼 함수: 음수가 아닌 정수 n에 대해 n!을 계산
int Factorial(int n);
#endif // FACTORIAL_H
1.2 src/factorial.cpp
#include "factorial.h"
#include <stdexcept>
int Factorial(int n) {
if (n < 0) {
throw std::invalid_argument("Negative input not allowed");
}
int result = 1;
for (int i = 1; i <= n; ++i)
result *= i;
return result;
}
설명:
_n_이 음수이면 예외를 throw하여 잘못된 입력임을 알립니다.
0!은 1로 정의되며, 1 이상인 경우 반복문으로 결과를 계산합니다.
2. 매개변수화 테스트 작성
매개변수화 테스트는 TEST_P()를 사용하여 한 번의 테스트 로직으로 여러 입력/출력 쌍을 검증할 수 있습니다.
이번 예제에서는 두 가지 케이스로 나누어 작성합니다.
- 정상적인 입력에 대해 올바른 팩토리얼 값이 계산되는지
- 음수 입력에 대해 예외가 발생하는지
2.1 test/test_factorial.cpp
#include <gtest/gtest.h>
#include "factorial.h"
// 테스트에 사용할 입력과 예상 결과를 담은 구조체
struct FactorialTestCase {
int input;
int expected;
};
// 정상 입력에 대한 매개변수화 테스트 클래스
class FactorialTest : public ::testing::TestWithParam<FactorialTestCase> {};
// TEST_P()를 이용해 매개변수화된 테스트 작성
TEST_P(FactorialTest, ComputesFactorial) {
FactorialTestCase param = GetParam();
EXPECT_EQ(Factorial(param.input), param.expected);
}
// 다양한 입력/출력 쌍을 인스턴스화하여 테스트 수행
INSTANTIATE_TEST_SUITE_P(
FactorialTests, // 인스턴스 이름(prefix)
FactorialTest, // 테스트 케이스 클래스 이름
::testing::Values(
FactorialTestCase{0, 1},
FactorialTestCase{1, 1},
FactorialTestCase{2, 2},
FactorialTestCase{3, 6},
FactorialTestCase{4, 24},
FactorialTestCase{5, 120},
FactorialTestCase{6, 720}
)
);
// 음수 입력에 대한 예외 발생 검증용 구조체
struct FactorialExceptionTestCase {
int input;
};
// 음수 입력에 대해 예외를 throw하는지 검증하는 매개변수화 테스트 클래스
class FactorialExceptionTest : public ::testing::TestWithParam<FactorialExceptionTestCase> {};
// TEST_P()로 음수 입력에 대한 예외 검증
TEST_P(FactorialExceptionTest, ThrowsOnNegative) {
FactorialExceptionTestCase param = GetParam();
EXPECT_THROW(Factorial(param.input), std::invalid_argument);
}
// 음수 입력에 대한 다양한 케이스 인스턴스화
INSTANTIATE_TEST_SUITE_P(
FactorialExceptionTests,
FactorialExceptionTest,
::testing::Values(
FactorialExceptionTestCase{-1},
FactorialExceptionTestCase{-5}
)
);
주요 포인트:
TestWithParam<T>를 상속받는 테스트 클래스를 정의하여, T 타입의 매개변수를 사용할 수 있게 합니다.
GetParam() 함수를 이용해 각 테스트 케이스에서 매개변수를 가져옵니다.
INSTANTIATE_TEST_SUITE_P() 매크로를 사용해 테스트 인스턴스를 생성할 때, 여러 테스트 케이스 데이터를 전달합니다.
3. 테스트 실행을 위한 main 함수
3.1 test/test_main.cpp
#include <gtest/gtest.h>
int main(int argc, char** argv) {
::testing::InitGoogleTest(&argc, argv);
return RUN_ALL_TESTS();
}
Google Test의 기본 main 함수를 정의하여, 모든 테스트를 실행할 수 있도록 합니다.
4. CMake 프로젝트 구성
프로젝트 최상위 CMakeLists.txt 파일과 하위 디렉터리 구성이 앞서 작성한 다른 예제와 동일하게 구성합니다.
4.1 최상위 CMakeLists.txt 예시
cmake_minimum_required(VERSION 3.10)
project(FactorialProject)
set(CMAKE_CXX_STANDARD 17)
# GoogleTest FetchContent (또는 find_package 이용)
include(FetchContent)
FetchContent_Declare(
googletest
GIT_REPOSITORY https://github.com/google/googletest.git
GIT_TAG release-1.12.1
)
FetchContent_MakeAvailable(googletest)
# src 디렉터리 추가
add_subdirectory(src)
# test 디렉터리 추가
enable_testing()
add_subdirectory(test)
4.2 src/CMakeLists.txt
add_library(factorial
factorial.cpp
)
target_include_directories(factorial
PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}
)
4.3 test/CMakeLists.txt
add_executable(test_factorial
test_factorial.cpp
test_main.cpp
)
target_link_libraries(test_factorial
PRIVATE
factorial
gtest
gtest_main
pthread
)
add_test(NAME test_factorial COMMAND test_factorial)
5. 빌드 및 실행
- 빌드
Cygwin 터미널에서 프로젝트 루트로 이동한 후:
$ mkdir build
$ cd build
$ cmake ..
$ make
- 성공적으로 빌드되면 test_factorial 실행 파일이 생성됩니다.
- 테스트 실행
$ ./test_factorial
- Google Test 러너가 매개변수화된 테스트를 포함해 모든 테스트 케이스를 실행하고 결과를 출력합니다.
예시 출력:
6. 마무리
- TEST_P()는 동일한 테스트 로직에 대해 여러 입력 데이터를 손쉽게 검증할 수 있는 강력한 도구입니다.
- INSTANTIATE_TEST_SUITE_P()를 통해 다양한 케이스를 한 번에 등록하여, 코드의 중복을 줄이고 유지보수를 쉽게 할 수 있습니다.
- 이번 예제에서는 팩토리얼 계산 함수에 대해 정상적인 값과 예외 케이스를 매개변수화된 테스트로 작성했으며, 실무에서 수치 계산, 데이터 검증 등 다양한 분야에 응용할 수 있습니다.
이상으로, Google Test의 TEST_P()를 활용한 매개변수화 테스트 작성법에 대해 알아보았습니다.
'TDD 테스트주도개발 > TDD for C++' 카테고리의 다른 글
[googletest문법6]TEST_F()확실하게 이해하자! (0) | 2025.04.09 |
---|---|
[googletest문법5]TEST() 이해2 (0) | 2025.03.26 |
[googletest문법3]테스트 픽스처 TEST_F() 사용법 (0) | 2025.03.10 |
[Googletest문법2]단일테스트 TEST() 작성방법 (0) | 2025.03.08 |
[GoogleTest문법1]매크로 종류 (0) | 2025.03.06 |