https://github.com/google/googletest/issues/3840
https://github.com/google/googletest/blob/cde9a745a66dc349dde300cb357974ef4f4b11fc/googletest/src/gtest.cc#L5940-L5949
https://google.github.io/googletest/advanced.html#global-set-up-and-tear-down
https://github.com/google/googletest/blob/main/docs/advanced.md#global-set-up-and-tear-down
Now, when RUN_ALL_TESTS() is called, it first calls the SetUp() method of each environment object, then runs the tests if none of the environments reported fatal failures and GTEST_SKIP() was not called. RUN_ALL_TESTS() always calls TearDown() with each environment object, regardless of whether or not the tests were run.
// Tears down all environments in reverse order afterwards. If test
// environments aren't recreated for each iteration, only do so on the
// last iteration.
if (i == repeat - 1 || recreate_environments_when_repeating) {
repeater->OnEnvironmentsTearDownStart(*parent_);
std::for_each(environments_.rbegin(), environments_.rend(),
TearDownEnvironment);
repeater->OnEnvironmentsTearDownEnd(*parent_);
}
// AS-IS
if (has_tests_to_run) {
...
// Tears down all environments in reverse order afterwards. If test
// environments aren't recreated for each iteration, only do so on the
// last iteration.
if (i == repeat - 1 || recreate_environments_when_repeating) {
repeater->OnEnvironmentsTearDownStart(*parent_);
std::for_each(environments_.rbegin(), environments_.rend(),
TearDownEnvironment);
repeater->OnEnvironmentsTearDownEnd(*parent_);
}
}
// TO-BE
if (has_tests_to_run) {
...
// recreate_environmenets가 true이고 (매 테스트 반복마다 teardown호출) and repeat의 마지막 반복이 아닐때
if (recreate_environments_when_repeating && i < repeat - 1) { // if문 조건을 이렇게 바꾸기!
repeater->OnEnvironmentsTearDownStart(*parent_);
std::for_each(environments_.rbegin(), environments_.rend(),
TearDownEnvironment);
repeater->OnEnvironmentsTearDownEnd(*parent_);
}
}
// has_tests_to_run과 상관없이 무조건 teardown은 실행
repeater->OnEnvironmentsTearDownStart(*parent_);
std::for_each(environments_.rbegin(), environments_.rend(),
TearDownEnvironment);
repeater->OnEnvironmentsTearDownEnd(*parent_);
// 위 코드를 private method로 뽑아서 중복제거해도 괜찮을듯! 밑에처럼
private void tearDown() {
repeater->OnEnvironmentsTearDownStart(*parent_);
std::for_each(environments_.rbegin(), environments_.rend(),
TearDownEnvironment);
repeater->OnEnvironmentsTearDownEnd(*parent_);
}