두 번째 글입니다. 이번엔 인턴으로 일하는 회사에서 겪은 일이라 엄밀히 사이드프로젝트는 아닙니다. 다만 "혼자 만든 자동화가 아무도 모르게 죽어 있었다"는 이야기라, 혼자 서비스를 굴리시는 분들께 오히려 더 가까운 사고일 것 같아 가져왔습니다.
커머스 프론트엔드에 Playwright E2E를 붙이고 GitHub Actions로 자동화했습니다. 매일 새벽 3시에 브라우저 4종이 상품을 담고 주문서까지 들어가서 118개를 검사하는 구조였고, 머지하고 뿌듯하게 잤습니다.
다음 날 아침에 보니 6초 만에 빨갛게 죽어 있었습니다. 앱 버그였으면 차라리 나았을 텐데, 범인은 제가 방금 만든 파이프라인 본인이었습니다.
PR을 막는 smoke(크로미움 1종)와 새벽에 도는 full(크로미움 / WebKit / Pixel 7 / iPhone 14) 두 트랙으로 분리
Cypress 대신 Playwright 선택 — 가장 오래 괴롭힌 버그가 Safari 전용이었고, 병렬 실행이 무료라서
공식 컨테이너 이미지로 CI 시간 12분 47초 → 2분 59초
실제 결제가 나가지 않도록 PG 요청을 두 겹으로 차단하고, "PG 요청 0건"을 단언하는 테스트까지 추가
테스트 짜다가 장바구니 레이스 컨디션과 접근성 누락, 앱 버그 두 개를 덤으로 발견
schedule 트리거에는 inputs가 없어서 BASE_URL에 빈 문자열이 들어왔고, ??는 빈 문자열을 그대로 통과시킵니다. 그래서 앱 서버가 아예 안 뜬 채로 테스트가 출발했습니다. 고친 건 ??를 ||로 바꾼 글자 하나입니다.
더 창피한 건 그다음이었습니다. 실패하면 Slack으로 알리는 스텝이 이미 있었는데, 웹훅을 Secrets에 등록하지 않아서 "웹훅이 없으면 조용히 성공"하도록 제가 짜둔 코드가 초록 체크를 찍고 끝나 있었습니다. 알림이 안 온 게 아니라, 알림이 안 왔다는 사실조차 안 알려준 겁니다.
가져가실 건 세 줄입니다.
유닛 테스트가 전부 초록이어도 결제는 깨집니다. 그 층을 보는 건 E2E뿐입니다.
환경변수엔 ?? 말고 ||. CI가 빈 문자열을 주입하는 경로는 생각보다 많습니다.
알림 없는 야간 자동화는 그냥 안 도는 것과 같습니다. 오늘 한 번 일부러 깨뜨려서 알림이 진짜 오는지 확인해 보시길 권합니다.
Playwright와 Cypress를 비교한 근거, smoke/full을 나눈 기준, 하이드레이션 대기 같은 튜토리얼에 없는 함정들, 그리고 Slack 알림을 다시 설계한 과정까지 자세한 이야기는 velog에 정리했습니다.
👉 전체 글 보러 가기 (velog)
https://velog.io/@kdy9883/laywright-nightly-e2e
다음 글로 준비 중인 소프트뱅크 해커톤 후기는 10월 중순 이후에 올리겠습니다. ?? 때문에 당해보신 분, "알고 보니 계측이 꺼져 있었다" 류의 경험 있으신 분은 댓글로 나눠 주세요.