테스트Medium#244
Flaky Test가 발생하는 원인과 줄이는 방법을 설명해주세요.
#테스트#FlakyTest#비동기#안정성
답변 포인트
불안정한 실행 조건과 격리를 기준으로 정의, 장점, 한계, 예시를 함께 설명해보세요.
정답 및 해설
빠른 요약
Flaky Test는 시간 의존성, 비동기 대기 부족, 상태 공유, 네트워크 의존성, 실행 순서 의존성 때문에 발생합니다. 격리와 명시적 대기, 외부 의존성 통제가 필요합니다.
Flaky Test는 코드 변경이 없어도 통과와 실패가 불규칙하게 바뀌는 테스트입니다. 신뢰를 떨어뜨려 결국 실패를 무시하게 만들기 때문에 빠르게 줄여야 합니다.
주요 원인
- 시간 의존성: 현재 시각, 타임존, sleep 사용
- 비동기 경쟁: 이벤트 처리 완료 전 assertion
- 테스트 간 공유 상태: DB, 파일, 전역 변수 오염
- 네트워크/외부 API 의존
- 랜덤 데이터와 순서 비결정성
- 병렬 실행 시 포트/리소스 충돌
나쁜 예와 개선
TypeScript
// 취약: 1초면 충분하다고 가정
await sleep(1000);
expect(await screen.findByText('완료')).toBeVisible();
// 개선: 조건을 기다림
await expect(page.getByText('완료')).toBeVisible({ timeout: 5000 });줄이는 방법
- clock을 고정하거나 fake timer를 사용합니다.
- 테스트마다 독립된 DB transaction/schema를 사용합니다.
- 외부 API는 mock server나 contract test로 분리합니다.
- polling assertion을 사용하고 고정 sleep을 줄입니다.
- 실패 시 screenshot, trace, seed, 로그를 남겨 재현성을 높입니다.
면접 답변 포인트
Flaky Test는 비결정적 환경 의존 때문에 발생합니다. 시간, 비동기, 공유 상태, 외부 의존을 제거하고 테스트 격리와 관찰성을 높여 줄인다고 답하면 좋습니다.