GoogleTest에는 3가지 레벨의 SetUp/TearDown이 있다.
1. Global (Environment)
class MyEnv : public ::testing::Environment {
void SetUp() override { /* 전체 프로세스에서 1번 */ }
void TearDown() override { /* 전체 프로세스에서 1번 */ }
};
// main에서 등록
::testing::AddGlobalTestEnvironment(new MyEnv());
void SetUp() override { /* 전체 프로세스에서 1번 */ }
void TearDown() override { /* 전체 프로세스에서 1번 */ }
};
// main에서 등록
::testing::AddGlobalTestEnvironment(new MyEnv());
2. Test Suite (Fixture 단위)
class MyFixture : public ::testing::Test {
static void SetUpTestSuite() { /* 해당 Fixture의 첫 테스트 전 1번 */ }
static void TearDownTestSuite() { /* 해당 Fixture의 마지막 테스트 후 1번 */ }
};
static void SetUpTestSuite() { /* 해당 Fixture의 첫 테스트 전 1번 */ }
static void TearDownTestSuite() { /* 해당 Fixture의 마지막 테스트 후 1번 */ }
};
3. Test Case (개별 테스트)
class MyFixture : public ::testing::Test {
void SetUp() override { /* 매 TEST_F 실행 전 */ }
void TearDown() override { /* 매 TEST_F 실행 후 */ }
};
void SetUp() override { /* 매 TEST_F 실행 전 */ }
void TearDown() override { /* 매 TEST_F 실행 후 */ }
};
실행 순서
Environment::SetUp() ← 1번 (프로세스)
SetUpTestSuite() ← 1번 (Fixture A)
SetUp() ← 매번 (Test A-1)
TearDown()
SetUp() ← 매번 (Test A-2)
TearDown()
TearDownTestSuite()
SetUpTestSuite() ← 1번 (Fixture B)
SetUp() ← 매번 (Test B-1)
TearDown()
TearDownTestSuite()
Environment::TearDown() ← 1번 (프로세스)
SetUpTestSuite() ← 1번 (Fixture A)
SetUp() ← 매번 (Test A-1)
TearDown()
SetUp() ← 매번 (Test A-2)
TearDown()
TearDownTestSuite()
SetUpTestSuite() ← 1번 (Fixture B)
SetUp() ← 매번 (Test B-1)
TearDown()
TearDownTestSuite()
Environment::TearDown() ← 1번 (프로세스)
* constructor/destructor 대신 SetUp/TearDown 계층 구조 패턴을 쓰는 이유
constructor vs. SetUp
실패 가능성이 있는 초기화 → SetUp (이유: 예외 안전성)
constructor vs. SetUp
실패 가능성이 있는 초기화 → SetUp (이유: 예외 안전성)
destructor vs. TearDown
자원 해제 → TearDown (부모 호출 보장) (이유: 상속 시 순서 보장)
자원 해제 → TearDown (부모 호출 보장) (이유: 상속 시 순서 보장)
Show Comments