Skip to content

[test-84/e2e] E2E 테스트 안정화 및 회귀 수정 - #216

Merged
hm1n merged 3 commits into
developfrom
hm1n/test-84-e2e-e2e
Sep 8, 2026
Merged

[test-84/e2e] E2E 테스트 안정화 및 회귀 수정#216
hm1n merged 3 commits into
developfrom
hm1n/test-84-e2e-e2e

Conversation

@hm1n

@hm1n hm1n commented Sep 2, 2026

Copy link
Copy Markdown
Collaborator

Closes #215

진행 상태

같은 커밋으로 CI를 20회 반복 실행해 E2E 16건의 케이스별 실패율을 측정했습니다.
측정이 끝나 측정 전용 설정을 되돌리고, 결과를 근거로 retries 최종값을 정했습니다.

최종 변경

develop 대비 남는 변경은 playwright.config.tsretries 한 줄입니다.

  • retries: process.env.CI ? 1 : 0 (기존 CI 2회 → 1회). 근거는 아래 측정 결과에 있습니다.

측정 전용으로 넣었던 retries: 0, json reporter, 산출물 업로드 if: always()는 모두 되돌렸습니다.

측정 방법

workflow_dispatch 대신 이 PR의 실행을 gh run rerun으로 반복했습니다.
재실행은 커밋 SHA가 그대로라 "같은 커밋" 조건을 정확히 만족하고, develop에 트리거를 추가하지 않아도 됩니다.
(workflow_dispatch는 default branch인 develop에 트리거가 있어야 동작하므로 제약과 충돌합니다.)

  • 대상 커밋: 49c01fb
  • 워크플로 실행: run 33605863639, attempt 1~20
  • 뷰포트: mobile (base가 develop이라 matrix가 mobile 단일로 분기)
  • 실행 시각: attempt 118 은 2026-09-02 07:5309:03 UTC, attempt 1920 은 2026-09-03 01:1401:17 UTC

집계는 각 attempt의 job 로그에서 가져왔습니다. 전체 재실행은 이전 attempt의 아티팩트를 지우기 때문에, 애초에 추가했던 json reporter 파일은 마지막 attempt 것만 남습니다. attempt별 로그는 그대로 남아 있어 이쪽으로 집계했습니다.

측정 결과

실행 단위

항목
실행 횟수 20
실행 성공 19
실행 실패 1 (attempt 19)
실행 단위 실패율 5.0%
케이스 실행 총계 320 (16건 × 20회)
케이스 단위 실패 1
케이스 단위 실패율 0.31%
스위트 소요 시간 33.7s ~ 56.8s (중앙값 약 45s)

케이스별 실패율

# 케이스 실패 / 실행 실패율
1 auth.spec.ts:7 접근 제어 › 비로그인 사용자가 보호 경로를 열면 첫 화면으로 이동한다 0 / 20 0%
2 auth.spec.ts:23 로그인 콜백 처리 › 약관에 동의한 사용자는 인증 콜백 뒤 요청한 초대 경로로 이동한다 1 / 20 5%
3 group.spec.ts:31 그룹 생성 › 필수 정보를 입력하면 그룹 미리보기로 이동한다 0 / 20 0%
4 group.spec.ts:59 그룹 생성 › 금액과 인원을 바꾸면 나눈 금액이 반올림되어 갱신된다 0 / 20 0%
5 group.spec.ts:76 그룹 생성 › 미리보기에서 그룹을 만들면 홈으로 이동한다 0 / 20 0%
6 group.spec.ts:111 홈 그룹 조회와 상세 진입 › 홈의 그룹 카드를 누르면 그룹 정보 탭으로 진입한다 0 / 20 0%
7 group.spec.ts:146 참여자 권한과 그룹 탈퇴 › 일반 참여자는 그룹을 수정할 수 없고 나가기만 선택할 수 있다 0 / 20 0%
8 invite.spec.ts:31 초대 링크 조회 › 유효한 대기 중 초대 링크에서 초대 정보를 확인할 수 있다 0 / 20 0%
9 invite.spec.ts:58 초대 응답 › 초대 대상자가 수락하면 엔빵 참여가 완료된다 0 / 20 0%
10 landing.spec.ts:3 랜딩 페이지의 주요 콘텐츠를 노출한다 0 / 20 0%
11 settlement.spec.ts:53 납부 상태 변경 › 그룹장이 참여자의 납부 상태를 완료로 변경한다 0 / 20 0%
12 settlement.spec.ts:80 납부 상태 변경 › 일반 참여자가 자신의 납부 상태를 완료로 변경한다 0 / 20 0%
13 settlement.spec.ts:113 납부 상태 변경 › 일반 참여자는 다른 참여자의 납부 상태를 변경할 수 없다 0 / 20 0%
14 settlement.spec.ts:141 정산 기간 기록 조회 › 현재 정산 기간의 납부 기록만 참여자 목록에 반영된다 0 / 20 0%
15 settlement.spec.ts:165 정산 기간 기록 조회 › 새 참여자가 추가되면 그룹 시작일 기준의 미납 기록이 한 건 생성된다 0 / 20 0%
16 settlement.spec.ts:190 납부 상태 저장 처리 › 납부 상태 저장에 실패하면 화면 상태를 유지하고 오류를 알린다 0 / 20 0%

#209에서 확인했던 테스트 계정 tag 충돌은 20회 동안 한 번도 재현되지 않았습니다. 3dc3ada의 재시도 처리가 동작하는 것으로 보입니다.

실패 상세 (attempt 19)

1) [mobile] › e2e/auth.spec.ts:23:7 › 로그인 콜백 처리 › 약관에 동의한 사용자는 인증 콜백 뒤 요청한 초대 경로로 이동한다

    {
      code: 'PGRST303',
      details: null,
      hint: null,
      message: 'JWT issued at future'
    }

PostgREST가 요청에 실린 토큰의 iat를 자기 시계보다 미래로 판단해 거절했습니다.

실패 지점은 브라우저가 아니라 테스트 준비 단계의 Node 코드입니다. 오류 출력에 stack이 없는 것은 Error가 아닌 plain object가 던져졌다는 뜻이고, supabase-js의 PostgrestError가 그 형태입니다. e2e/fixtures/seed.ts에서 this.admin(secret key)으로 PostgREST를 호출한 뒤 throw error 하는 지점들이 여기 해당합니다.

createSession이 만드는 사용자 세션 토큰과는 무관하고, 토큰 발급과 iat 검증이 모두 Supabase 쪽에서 일어나는 구간입니다. 우리 코드는 이 시각에 관여하지 않습니다.

  • 원인 분류: 환경
  • 근거: 실패 지점이 secret key로 PostgREST를 호출하는 준비 단계이고, 토큰 발급·검증 주체가 모두 Supabase입니다. 같은 커밋의 다른 19회에서는 재현되지 않았습니다.
  • 한계: 전체 재실행이 이전 attempt의 아티팩트를 지워서 attempt 19의 trace/스크린샷은 남아 있지 않습니다. 위 판단은 job 로그만 근거로 합니다.

대응 방침

seeder에 PGRST303 전용 재시도를 넣는 방안도 검토했습니다. 그러나 320회 중 1회이고 재현되지 않으며 원인이 Supabase 쪽이라, 지금 코드를 넣는 것은 근거가 얇다고 판단했습니다. retries가 이 실패 유형을 그대로 덮고, 재시도는 fixture teardown을 attempt마다 실행하므로 잔여 데이터도 남지 않습니다.

재시도로 통과한 건은 Playwright가 flaky로 따로 집계하므로 관측은 계속됩니다. PGRST303이 flaky로 반복해서 뜨면 그때 근거를 갖고 seeder 재시도를 넣습니다.

retries 최종값

retries: process.env.CI ? 1 : 0 으로 정했습니다.

  • 케이스 실패율 0.31%짜리 일회성 오류는 한 번의 재시도로 흡수됩니다.
  • 반복해서 깨지는 테스트는 그대로 실패로 남습니다.
  • 기존 값 2회는 관측된 흔들림 크기에 비해 과하고, 진짜 회귀의 실패 확정만 늦춥니다.
  • 로컬은 기존과 같이 0회입니다. 로컬 실행 방식을 바꾸지 않습니다.

체크리스트

  • 케이스별 실패율 표
  • 실패 케이스 원인 분류 (제품 / 테스트 / 환경)
  • PGRST303 대응 방침 결정 — retries로 흡수, seeder 재시도는 재발 시 재검토
  • retries 최종값과 근거
  • 산출물 업로드 확인 — attempt 20에서 playwright-mobile-20 아티팩트가 성공 실행에도 올라온 것을 확인했습니다. 실패 시 업로드는 attempt 19에서 동작을 확인했습니다.
  • 측정 전용 설정 정리
  • PC 뷰포트 matrix 확인 — 이 PR은 base가 develop이라 matrix가 mobile 단일로 분기합니다. main 대상 PR에서만 확인할 수 있어 다음 릴리즈 PR에서 봐야 합니다.

🤖 Generated with Claude Code

#215 Task 8. 같은 커밋으로 CI를 반복 실행해 케이스별 실패율을 측정하기 위한
측정 전용 설정이다. 측정이 끝나면 retries 최종값을 정하고 함께 정리한다.

- retries를 0으로 둔다. 재시도가 성공하면 결과가 초록으로 끝나 흔들림이
  드러나지 않으므로 측정 기간에는 재시도를 꺼야 데이터가 나온다.
- json reporter를 추가한다. 케이스별 실패율을 세려면 통과한 실행의 결과도
  파일로 남아야 한다.
- 산출물 업로드 조건을 always로 바꾼다. 같은 이유로 성공한 실행의 리포트도
  받아야 한다.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@vercel

vercel Bot commented Sep 2, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated
nbread Ready Ready Preview Sep 3, 2026 2:36am UTC

hm1n and others added 2 commits September 3, 2026 11:34
#215 Task 8. 같은 커밋으로 20회 반복 실행하는 측정이 끝나 측정 전용 설정을
모두 원래대로 돌린다. `develop`에 남기지 않기로 한 설정들이다.

- retries를 측정 전 값으로 되돌린다. 최종값은 다음 커밋에서 정한다.
- json reporter를 뺀다. 케이스별 집계가 끝나 더 필요하지 않다.
- 산출물 업로드 조건을 failure로 되돌린다. 성공한 실행의 리포트는
  측정 기간에만 필요했다.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
#215 Task 8. 같은 커밋(49c01fb)으로 CI를 20회 반복 실행해 재시도 없이 측정한
결과를 근거로 값을 정한다.

측정값은 케이스 실행 320회(16건 x 20회) 중 실패 1회로 케이스 실패율 0.31%,
실행 단위로는 20회 중 1회 실패다. 유일한 실패는 seeder가 PostgREST를 호출할 때
받은 `PGRST303 JWT issued at future`로, 토큰 발급과 검증이 모두 Supabase 쪽에서
일어나는 구간이라 우리 코드가 시각에 관여하지 않는다.

1회로 정한 이유는 이 정도 일회성 오류는 한 번의 재시도로 흡수되고, 반복해서
깨지는 테스트는 그대로 실패로 남기 때문이다. 2회는 관측된 흔들림 크기에 비해
과하고 진짜 회귀의 실패 확정만 늦춘다. 재시도로 통과한 건은 리포트에 flaky로
따로 집계되므로 흔들림 관측은 계속 가능하다.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@hm1n
hm1n marked this pull request as ready for review September 3, 2026 03:17
@hm1n

hm1n commented Sep 3, 2026

Copy link
Copy Markdown
Collaborator Author

@codex review

@chatgpt-codex-connector

Copy link
Copy Markdown

Codex Review: Didn't find any major issues. Delightful!

Reviewed commit: 49cb9368f1

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

@hm1n hm1n self-assigned this Sep 8, 2026
@hm1n hm1n added the 🧪 Test 테스트 코드 작성 및 테스트 환경 label Sep 8, 2026
@hm1n
hm1n merged commit 07d6ebe into develop Sep 8, 2026
4 checks passed
@hm1n
hm1n deleted the hm1n/test-84-e2e-e2e branch September 8, 2026 02:30
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

🧪 Test 테스트 코드 작성 및 테스트 환경

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[test-84/e2e] E2E 테스트 안정화 및 회귀 수정

1 participant