Repository navigation
fix(e2e): E2E dev 서버에서 Astro 도구 막대를 꺼 리스너 수 측정 플레이키를 없앤다 - #221
Conversation
|
You have reached your Codex usage limits for code reviews. You can see your limits in the Codex usage dashboard. |
Review작고 범위가 명확한 PR입니다. 원인 분석(audit 앱이 페이지 전체 lint 뒤에야 Code quality
Potential issues
Performance: E2E 중 audit의 Security: 해당 사항 없음. 환경 변수는 dev 서버 설정에만 쓰이고 배포 산출물에는 영향이 없습니다. Test coverage: 새 로직이 설정 한 줄이라 별도 테스트는 필요 없어 보입니다. LGTM입니다. 위 내용은 모두 비차단 제안입니다. 🤖 Generated with Claude Code |
listener-leak 스펙의 리스너 수 비교는 도구 막대가 꺼져 있다는 전제 위에 있다. playwright.config.ts의 webServer.env가 사라지면 이 단언이 먼저 실패한다. 로컬은 직접 띄운 dev 서버를 재사용할 수 있어 CI에서만 확인한다.
요약
E2E의 리스너 누수 테스트(
/projects왕복)가 CI에서 가끔 재시도 끝에만 통과하던 원인을 찾아 고쳤습니다. 앱 코드의 누수가 아니었습니다. dev 서버에만 붙는 Astro 개발 도구 막대가 리스너를 늦게 달아 측정이 어긋난 것입니다. 그래서 E2E가 띄우는 dev 서버에서는 도구 막대를 끕니다. 배포 사이트에는 원래 도구 막대가 없으므로 동작에는 변화가 없습니다.증상
e2e/listener-leak.spec.ts의 "/projects 왕복 후 영속 타겟 리스너 수가 늘지 않는다"가 2026-10-11 CI 세 곳(#217, #218, #219)에서 1차 실패 후 재시도로 통과했습니다. 세 실행(run 38144040598, 38144648938, 38145433836)의 실패 모양은 모두 같았습니다. 다른 리스너 수는 그대로이고document:astro:page-load만 기준값 6에서 7로 1 늘었습니다. React 버전과도 무관했습니다(#217, #218은 React 6).원인
dev 도구 막대는 앱들을
requestIdleCallback으로 유휴 시간에 초기화합니다. 그중 audit 앱은init()에서 페이지 전체 lint(await run())를 끝낸 뒤에야astro:page-load리스너를 답니다(astro/dist/runtime/client/dev-toolbar/apps/audit/index.js). 카드와 이미지가 많은/projects에서는 이 lint가 오래 걸립니다. 느린 CI에서는 테스트가 기준값을 잰 뒤에 이 리스너가 붙어 1이 늘어난 것처럼 보였습니다.측정 근거:
/projects를 불러온 뒤astro:page-load등록 시점을 기록하면, 앱 리스너와 xray 앱은 약 50~150ms 안에 붙고 audit 앱만 약 1.1초 뒤에 붙습니다(CPU 6배 감속 시 약 2.5초 뒤).astro:page-load만 늘었습니다.수정
astro.config.ts:devToolbar.enabled를E2E_DISABLE_DEV_TOOLBAR !== "1"로 둡니다. 평소pnpm dev에서는 그대로 켜져 있습니다.playwright.config.ts:webServer.env에E2E_DISABLE_DEV_TOOLBAR: "1"을 넣습니다. Playwright는 이 값을process.env와 합쳐 넘기므로 기존 환경 변수는 유지됩니다.AGENTS.md: 도구 막대를 E2E에서 다시 켜면 이 문제가 돌아온다는 점을 Playwright 항목에 적었습니다.audit 앱은 DOM이 바뀔 때마다 lint를 다시 돌리는
MutationObserver도 겁니다. 그래서 도구 막대를 끄면 E2E 도중의 불필요한 CPU 사용도 함께 사라집니다.테스트 쪽에서 도구 막대의 리스너만 걸러 내는 방법도 검토했습니다. 하지만 dev에서 청크 이름이
audit-<해시>.js로 바뀌어 호출 위치로 구분하기 어렵고, 앱 초기화 완료를 기다리는 방법은 Astro 내부 구현에 기대야 해서 택하지 않았습니다.검증
astro-dev-toolbar요소 수: 환경 변수 있음 0, 없음 1listener-leak.spec.ts+continue-reading.spec.ts3회 반복(재시도 없음): 처음 39건 중 1건 실패(아래 "아직 남은 불안정성"), 진단 코드를 넣고 다시 2번 돌린 78건은 모두 통과/projects테스트 단독 12회 반복: 모두 통과astro check0 errors,astro build성공, ESLint, Prettier,node scripts/e2e-scope.mjs --check,node scripts/check-agent-docs-sync.mjs통과아직 남은 불안정성
같은 테스트에서 다른 모양의 실패가 로컬(Windows)에서 두 번 있었습니다. 수정 전 오늘 첫 실행의 재시도에서 1번, 수정 후 위 3회 반복 실행에서 1번입니다. 뒤로/앞으로 이동한 뒤 주소는
/tags로 바뀌었는데astro:page-load가 오지 않아 30초 시간 초과가 났습니다. 리스너 수 문제와는 별개입니다. CI 세 실행에서는 이 모양이 나오지 않았습니다. 진단 코드(전체 새로 고침 여부, 카운터 값)를 넣고 90회를 더 돌렸지만 다시 나오지 않아 원인을 찾지 못했습니다. 이 PR이 고쳤다고 주장하지 않습니다.범위 밖
같은 날
continue-reading.spec.ts:133(스크롤 복원 후 토스트)도 #219와 예전 Dependabot React 7 PR CI에서 재시도로 통과한 적이 있습니다. 이 PR이 그 테스트도 고친다는 근거는 없어서 주장하지 않습니다.로컬에서 주의할 점
로컬에서는
reuseExistingServer가 켜져 있습니다. 직접 띄워 둔 dev 서버가 있으면 Playwright가 그 서버를 재사용하므로 도구 막대가 켜진 채로 테스트가 돕니다. CI(CI=true)는 항상 새 서버를 띄웁니다.