class MyEnv : public ::testing::Environment { 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번 */ } };
3. Test Case (개별 테스트)
class MyFixture : public ::testing::Test { 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번 (프로세스)
* constructor/destructor 대신 SetUp/TearDown 계층 구조 패턴을 쓰는 이유
constructor vs. SetUp
실패 가능성이 있는 초기화 → SetUp (이유: 예외 안전성)
destructor vs. TearDown
자원 해제 → TearDown (부모 호출 보장) (이유: 상속 시 순서 보장)