피드로 돌아가기
Dev.toBackend
원문 읽기
비결정적 CI 실패 제거를 위한 Laravel 테스트 결정론 확보 전략
Flaky Tests in Laravel: Why Your CI Randomly Fails
AI 요약
Context
로컬 환경과 달리 CI 파이프라인에서 간헐적으로 발생하는 Flaky Test로 인해 테스트 스위트의 신뢰성이 저하되는 문제 발생. 이는 단순한 툴의 결함이 아닌 공유 상태, 타이밍 의존성, 비동기 처리 등 설계 단계의 비결정적 요소에서 기인함.
Technical Solution
- Carbon::setTestNow()를 통한 시간 고정 및 Cleanup 처리로 시간 의존적 로직의 결정론적 검증 구현
- RefreshDatabase 및 DatabaseTransactions 도입을 통한 테스트 간 데이터 격리 및 Shared State 제거
- Factory의 무작위 생성 값 대신 명시적 상태 정의를 통한 데이터 생성의 예측 가능성 확보
- Queue::fake() 활용 및 비동기 Job의 동기 실행 전환을 통한 Race Condition 및 실행 타이밍 문제 해결
- Http::fake() 기반의 외부 API Mocking을 통한 네트워크 불안정성 제거 및 테스트 실행 속도 최적화
- 테스트 간 실행 순서 의존성을 제거한 독립적 테스트 케이스 설계로 파이프라인 일관성 유지
실천 포인트
- [ ] Carbon 사용 시 setTestNow()로 시간을 고정하고 테스트 종료 후 초기화하는가? - [ ] 모든 테스트가 RefreshDatabase 또는 DatabaseTransactions를 통해 DB 격리를 보장하는가? - [ ] Factory 사용 시 랜덤 값에 의존하지 않고 필요한 상태를 명시적으로 주입하는가? - [ ] 비동기 큐 작업 검증 시 실제 실행 대신 Fake 객체를 사용하거나 동기 방식으로 처리하는가? - [ ] 외부 API 연동 테스트 시 Http::fake()를 사용하여 외부 의존성을 완전히 제거했는가?