본 발표는 약 7년 된 Ruby on Rails 프로젝트에서 누적된 자동 테스트의 실행 시간 증가와 불안정성(프레이키 테스트) 문제를 해결하기 위한 개선 프로젝트의 경험과 성과를 공유합니다. 프로젝트 초기 7800여 개의 테스트 케이스가 CI 환경에서 50분 이상 소요되고 프레이키 테스트 비율이 1%를 초과하여 개발 생산성을 저해하는 심각한 상황이었습니다. 목표는 CI 실행 시간을 10분 이내로 단축하고 프레이키 테스트 비율을 1% 미만으로 낮추는 것이었습니다.
CI 시간 단축을 위해 여러 기법이 적용되었습니다. 첫째, E2E 테스트에서 불필요한 sleep
호출을 Capybara의 내장 대기 기능(예: has_text?
)이나 동적 대기 헬퍼로 대체하여 응답 대기 시간을 효율화했습니다. 59곳에 달했던 sleep
호출을 13곳으로 줄였습니다. 둘째, 테스트 데이터 생성 비용을 최적화했습니다. rspec-prof
와 let_b
젬을 활용하여 before(:each)
나 let
에서 매번 데이터를 생성하는 대신, before(:all)
이나 let!
을 사용하여 테스트 그룹 또는 파일 단위로 데이터를 한 번만 생성하고 재사용하도록 변경했습니다. 이를 통해 특정 테스트 파일에서 2만 5천 건 이상의 데이터 생성이 2천 건 수준으로 감소했습니다. 셋째, parallel_tests
젬을 사용하여 테스트 파일을 CPU 코어 수에 맞춰 병렬로 실행하도록 구성하고, 파일 크기 기반 분할을 통해 각 작업의 부하를 균등하게 분산했습니다. 넷째, 프런트엔드(Next.js) 빌드 시간을 단축하기 위해 빌드 캐시(node_modules/.next/cache
)를 활용하고, API 변경만 있는 경우에는 프런트엔드 빌드를 건너뛰도록 CI 워크플로우를 개선했습니다. 더 나아가, 프레이키 테스트 문제를 해결하기 위한 노력도 병행되었습니다. 먼저, Allure Report를 도입하여 CI 실행 결과를 시각화하고 테스트 실패 시 로그 및 스크린샷 확인 과정을 효율화했습니다. 다음으로, CI 환경에서만 발생하는 원인 불명의 프레이키 테스트 디버깅을 위해 Capybara Playwright Driver를 사용했습니다. 이 드라이버는 테스트 실행 과정의 비디오 녹화 및 네트워크 트레이스 기능을 제공하여 문제 원인 파악에 큰 도움을 주었습니다. 마지막으로, 드물게 발생하는 프레이키 테스트에 대비하여 CI 상에서 실패한 테스트만 자동으로 재실행하는 로직을 구현하고, 재실행 시 Capybara의 기본 대기 시간을 늘리는 등의 설정을 추가하여 테스트의 최종 성공률을 높였습니다. 이 외에도 build_stubbed
사용, 불필요한 테스트 제거, knapsack_pro
활용 등 다양한 최적화 기법이 적용되었습니다.
이러한 다각적인 개선 노력을 통해 초기 54분 이상 소요되었던 CI 실행 시간을 약 10분 수준으로 단축하는 데 성공했습니다. 테스트 케이스 수는 증가했지만, CI 비용은 절반 이하로 감소했으며, 프레이키 테스트로 인한 개발자의 재실행 부담이 크게 줄어 개발 생산성과 경험이 향상되었습니다. 자동 테스트 성능 및 안정성 개선은 지속적인 관심과 노력이 필요한 과제이며, 본 사례가 유사한 문제를 겪는 다른 팀들에게 유용한 참고가 되기를 기대합니다.