Search

불안정한 테스트를 신뢰로 바꾸는 과정: Playwright Flaky Test 개선기

URL
생성 일시
2026/02/13 07:07
최종 편집 일시
2026/02/13 07:07
태그
여기어때
파일과 미디어
|| 안녕하세요. 여기어때컴퍼니 자동화QA팀 릴리입니다. 내 PC에선 성공하는데 CI 파이프라인에서는 실패하는 테스트, 원인을 알 수 없는 간헐적 오류들을 한 번쯤 겪어보셨나요? 오늘은 고질적인 Flaky Test 문제를 해결하기 위해 Robot Framework에서 Playwright로 마이그레이션하며 겪었던 시행착오와 이를 통해 테스트 신뢰도를 개선한 경험을 공유하려고 합니다. Robot Framework가 남긴 숙제들 기존에는 Robot Framework를 사용하여 테스트 자동화를 진행했으나, 테스트 케이스가 늘어날수록 구조적 한계와 요소 탐색 불안정성이라는 벽에 부딪혔습니다. ① Headless 모드의 불안정성 CI 파이프라인을 이용하여 테스트 자동화를 진행하기 위해서는 브라우저 창을 띄우지 않는 Headless 모드가 필수적입니다. 하지만 기존의 Robot Framework + Selenium 환경에서는 유독 Headless 모드에서 요소 탐색 실패율이 급증했습니다. 결국 테스트 정확도를 위해 로컬 PC에서 GUI 모드로 실행해야 했고, 결과 리포트마저 수동으로 공유해야 했습니다. ② 기다림으로 때운 신뢰성, 그리고 기약 없는 디버깅 요소를 찾지 못해 실패하는 일을 막고자 스크립트 곳곳에 Sleep이나 Wait과 같은 대기 구문을 남발했습니다. 그 결과, 단순한 ‘홈 화면’ 검증 하나에만 약 7분이 소요되었습니다. 더 큰 문제는 ‘디버깅의 비효율’이었습니다. 요소 탐색 실패는 전체 실행 시에 주로 발하기 때문에, 오류 하나를 확인하기 위해 수십 분을 대기해야 했습니다. 그래서 여러 논의 끝에 저희 팀은 별도의 대기 코드 없이도 UI 상태를 자동으로 기다려주는 자동 대기(auto-wait) 메커니즘과 강력한 디버깅 도구, 그리고 안정적인 Headless 모드 실행을 지원하는 Playwright를 도입하게 되었습니다. Flaky Test와의 전쟁: 도구는 거들 뿐, 핵심은 ‘로직’ 도구를 바꾼다고 해서 모든 테스트가 성공하는 것은 아니었습니다. Playwright가 브라우저 제어의 불안정성은 해결해 주었지만, 데이터의 불안정성은 여전히 남아있었기 때문입니다. 날짜, 재고, 가격 등 시시각각 변하는 여행 서비스 특유의 변수들은 도구만으로 제어할 수 없었습니다. 지금부터는 도구의 전환을 넘어, 로직의 견고함을 더해가는 과정을 소개하겠습니다. Case 1. 팝업 Interception 자동 처리 전략 E2E 테스트를 작성하다 보면 특정 조건에서만 노출되는 ‘안내 팝업’들이 있습니다. 여기어때 서비스의 경우, 패키지 캘린더 진입 시 “여행 기간 대신, 출발일만 선택해요”라는 안내 팝업이 최초 1회 노출되는 것이 대표적입니다. “출발일만 선택해요” 안내 팝업 초기에는 팝업이 노출되는 모든 위치를 파악해 ‘닫기’ 코드를 일일이 삽입하는 수동 방식을 택했습니다. 하지만 다음과 같은 문제들이 발생했습니다. 휴먼 에러: 팝업이 뜨는 모든 진입점을 완벽하게 파악해 코드를 넣어야 하는데, 실수로 로직을 빠뜨리는 경우가 종종 발생했습니다. 타이밍 이슈: 팝업이 다 노출되기 전에 스크립트가 뒤에 있는 요소를 먼저 클릭하려 하거나, 팝업 애니메이션 중에 클릭을 시도하여 실패하는 등의 현상이 발생했습니다. 이를 해결하기 위해 conftest.py에 전역 핸들러를 등록하여, 테스트 중 언제든 팝업이 감지되면 자동으로 닫히도록 했습니다. 또한, force=True 옵션과 명시적인 대기 로직을 통해 미세한 타이밍 이슈를 해결했습니다. try: popup_locator = page_instance.get_by_role("dialog", name="여행 기간 대신, 출발일만 선택해요") def close_date_popup(): close_btn = page_instance.get_by_role("button", name="확인").first if close_btn.is_visible(): cl