C++/GoogleTest(gtest) SetUp TearDown 계층 구조


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());

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 (부모 호출 보장) (이유: 상속 시 순서 보장)


Show Comments