Search

[googletest] Docs: add conditions for calling SetUp() and TearDown()

오픈소스
googletest
이름
김소연
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_); }
JavaScript
복사
문서화가 약간 부족한듯?
RUN_ALL_TESTS가 항상 테스트 실행 여부와 상관없이 TearDown을 호출한다고 문서상 되어있음
허나 코드상엔 recreate_environments_when_repeating flag가 false일때만 이렇게 동작함!
recreate_environments_when_repeating 가 false면 repeat: 5일때 마지막 5번째 테스트 반복 시도 일때만 TearDown호출됨
추가
repeat이 0이나 음수 가 될 수 있는데 이 때 어떻게 동작하는지?
repeat이 infinite일때?
repeat 이 int.minval일때 → i = repeat-1 하면 underflow일어남!! 고치기

설명 보강 (잘못 전달드린 내용)

// 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_); }
JavaScript
복사
RUN_ALL_TESTS가 항상 테스트 실행 여부와 상관없이 TearDown을 호출한다고 문서상 되어있음
위 코드 보면 has_tests_to_run일때만 tear down이 호출됨!!
적절한 테스트 검증 코드 추가 필요
현재는 teardown이 has_tests_to_run = false일때 에도 실행되는걸 확인하는 테스트가 없어서 위 버그를 검출 못하는 중