🤖
2161 in / 2000 out / 4161 total tokens
자동 주문 기능이 게임 종료 후 주문 UI를 띄워주는 건데, 이게 의도대로 동작하는지 확인하려면 방 만들고, 사람 들어오고, 게임 시작하고, 주사위 굴리고, 게임 끝나서 주문 화면 뜨는지까지 전부 자동화해서 검증해야 한다. 그걸 Playwright로 짰고 18개 테스트 케이스 전부 통과했다.
기존에는 이 흐름을 수동으로 테스트했다. 브라우저 두 개 띄워서 호스트랑 게스트 각자 조작하면서 게임 끝날 때 주문 버튼이 나오는지 눈으로 확인하는 방식이었다. 당연히 놓치는 케이스가 생긴다. 특히 2라운드 진입 후 자동 주문이 재발동하는 케이스를 수동으로 매번 검증하기는 현실적으로 불가능하다. 그래서 E2E를 작성하기로 했다.
Playwright를 선택한 이유는 간단하다. Socket.IO 기반 실시간 게임이라 브라우저 컨텍스트가 필요하고, 동시에 두 탭을 제어해야 하는데 Playwright가 이걸 가장 깔끔하게 지원한다. Cypress도 고려해봤지만 멀티탭 시나리오에서 제약이 많아서 제외했다.
핵심 코드를 보면 이렇다.
javascript
const URL = process.argv.find(a => a.startsWith('--url='))?.split('=')[1] || http://127.0.0.1:${PORT};
const HEADED = process.argv.includes('--headed');
URL과 headed 모드를 커맨드라인 인자로 받는 구조다. CI에서는 headless로 돌리고, 로컬에서 디버깅할 때는 --headed 붙여서 브라우저 창을 직접 보면서 테스트 실패 지점을 확인할 수 있게 했다. 이런식으로 CLI 옵션을 깔끔하게 파싱하는 게 나중에 테스트 디버깅 생산성에 큰 차이를 만든다.
테스트 시나리오는 방 생성 → 입장 → 게임 시작 → 주사위 굴리기 → 게임 종료 → 자동 주문 UI 활성화 검증이다. 여기서 중요한 건 게임 종료 후 주문 입력/저장/종료 사이클이 정상적으로 도는지, 그리고 2라운드에서도 자동 주문이 재발동하는지다. 이 두 가지를 놓치면 운영에서 "2판째부터 주문이 안 떠요" 버그 리포트가 들어온다.
탈것 헬퍼 모듈은 utils/vehicle-helpers.js로 분리했다.
javascript const ALL_VEHICLE_IDS = ['car', 'rocket', 'bird', 'boat', 'bicycle', 'rabbit', 'turtle', 'eagle', 'scooter', 'helicopter', 'horse', 'knight', 'dinosaur', 'ninja', 'crab']; const NEW_VEHICLE_IDS = ['knight', 'dinosaur', 'ninja', 'crab'];
기사, 공룡, 닌자, 게 4종을 새로 추가했다. 기존에는 탈것 관련 데이터가 여러 파일에 흩어져 있었다. ID 목록은 어디에, 이름 매핑은 다른 곳에, 가중치 설정은 또 다른 곳에. 이걸 하나의 모듈로 모아서 Single Source of Truth를 만들었다. 나중에 탈것 추가할 때 이 파일만 수정하면 된다.
NEW_VEHICLE_WEIGHT = 2로 설정한 이유는 신규 탈것의 출현 확률을 기존 탈것보다 높이기 위해서다. 게임에서 새 콘텐츠가 나오면 유저가 체감할 수 있게 노출을 높이는 건 기본이다. UE5에서 아이템 드롭 테이블 가중치 조정할 때도 똑같은 원리로 접근한다.
update-log.md에 유저 공개 업데이트 로그를 추가했다. 자동 주문 기능이 모든 게임 모드(주사위, 룰렛, 경마)에 적용된다는 걸 명시적으로 적어뒀다. 개발자 입장에서는 당연한 내용이지만 유저 입장에서는 명시적으로 확인할 수 있어야 한다. changelog를 쓸 때 기술적 세부사항보다 유저가 체감하는 변화를 먼저 적는 게 중요하다.
summit-log.txt를 보면 "방 입장" 관련 이슈를 발견했다고 적어놨다. 아마 E2E 돌리면서 비동기 타이밍 이슈를 잡은 것 같다. Socket.IO 이벤트가 브라우저 DOM 반영보다 빨리 오는 경우가 있는데, Playwright의 waitForSelector로 적절히 대기 지점을 잡아줘야 한다.
전체적으로 441줄 추가, 1줄 삭제. 대부분 테스트 코드(285줄)와 로그(114줄)다. 실제 로직 변경은 탈것 헬퍼 28줄이 전부다. 테스트 코드가 프로덕션 코드보다 긴 건 당연한 거고, 오히려 건강한 신호다.
다음 할 일은 경마 모드에도 E2E 테스트를 확장하는 거다. 주사위 모드만 커버하고 있으니까.
자동 주문 18개 테스트 통과. 이제 "주문 안 떠요" 카톡 안 와도 된다.