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일때 에도 실행되는걸 확인하는 테스트가 없어서 위 버그를 검출 못하는 중