From 49c01fb6a0e474df4c0986847c7d61622d4c2d53 Mon Sep 17 00:00:00 2001 From: unknown Date: Wed, 2 Sep 2026 16:52:22 +0900 Subject: [PATCH 1/3] =?UTF-8?q?test:=20E2E=20=EC=8B=A4=ED=8C=A8=EC=9C=A8?= =?UTF-8?q?=20=EC=B8=A1=EC=A0=95=EC=9A=A9=20=EC=9E=84=EC=8B=9C=20=EC=84=A4?= =?UTF-8?q?=EC=A0=95=20=EC=A0=81=EC=9A=A9=20(=EB=90=98=EB=8F=8C=EB=A6=B4?= =?UTF-8?q?=20=EC=98=88=EC=A0=95)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit #215 Task 8. 같은 커밋으로 CI를 반복 실행해 케이스별 실패율을 측정하기 위한 측정 전용 설정이다. 측정이 끝나면 retries 최종값을 정하고 함께 정리한다. - retries를 0으로 둔다. 재시도가 성공하면 결과가 초록으로 끝나 흔들림이 드러나지 않으므로 측정 기간에는 재시도를 꺼야 데이터가 나온다. - json reporter를 추가한다. 케이스별 실패율을 세려면 통과한 실행의 결과도 파일로 남아야 한다. - 산출물 업로드 조건을 always로 바꾼다. 같은 이유로 성공한 실행의 리포트도 받아야 한다. Co-Authored-By: Claude Opus 5 (1M context) --- .github/workflows/ci-e2e-test.yml | 5 +++-- playwright.config.ts | 11 +++++++++-- 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/.github/workflows/ci-e2e-test.yml b/.github/workflows/ci-e2e-test.yml index 7e43e50..37a0b10 100644 --- a/.github/workflows/ci-e2e-test.yml +++ b/.github/workflows/ci-e2e-test.yml @@ -86,10 +86,11 @@ jobs: SUPABASE_SERVICE_ROLE_KEY: ${{ secrets.E2E_SUPABASE_SECRET_KEY }} E2E_TEST_USER_PASSWORD: ${{ secrets.E2E_TEST_USER_PASSWORD }} - # 실패했을 때만 올린다. 리포트로 어떤 케이스가 깨졌는지 보고, + # #215 측정 기간에는 성공한 실행도 올린다. 케이스별 실패율을 세려면 + # 통과한 실행의 결과 파일도 있어야 한다. # trace는 `npx playwright show-trace trace.zip`으로 그 시점 화면과 네트워크를 확인한다. - name: Upload report - if: failure() + if: always() uses: actions/upload-artifact@v7 with: name: playwright-${{ matrix.project }}-${{ github.run_attempt }} diff --git a/playwright.config.ts b/playwright.config.ts index fd20f4c..ee30c18 100644 --- a/playwright.config.ts +++ b/playwright.config.ts @@ -9,12 +9,19 @@ export default defineConfig({ timeout: 90_000, expect: { timeout: 20_000 }, forbidOnly: !!process.env.CI, - retries: process.env.CI ? 2 : 0, + // #215 실패율 측정 기간에는 재시도를 끈다. 재시도가 성공하면 흔들림이 + // 결과에 드러나지 않아 측정 자체가 불가능하다. 측정 후 최종값을 정한다. + retries: 0, // next dev 서버가 단일 프로세스라 워커를 늘리면 경로 컴파일이 서로 밀려 타임아웃이 난다. // CI는 빌드된 서버를 실행하므로 병렬로 돌려도 안정적이다. // ubuntu-latest가 4 vCPU라 브라우저가 CPU를 다 먹지 않도록 2로 둔다. workers: process.env.CI ? 2 : 1, - reporter: [[process.env.CI ? 'line' : 'list'], ['html', { open: 'never' }]], + reporter: [ + [process.env.CI ? 'line' : 'list'], + ['html', { open: 'never' }], + // #215 케이스별 실패율을 집계하려면 성공한 실행의 결과도 파일로 남아야 한다. + ['json', { outputFile: 'test-results/results.json' }], + ], use: { baseURL, trace: 'retain-on-failure', From 7e14aae4b4a5e5837ffd9fbb048993d042749f12 Mon Sep 17 00:00:00 2001 From: unknown Date: Thu, 3 Sep 2026 11:34:30 +0900 Subject: [PATCH 2/3] =?UTF-8?q?chore:=20E2E=20=EC=8B=A4=ED=8C=A8=EC=9C=A8?= =?UTF-8?q?=20=EC=B8=A1=EC=A0=95=EC=9A=A9=20=EC=9E=84=EC=8B=9C=20=EC=84=A4?= =?UTF-8?q?=EC=A0=95=EC=9D=84=20=EB=90=98=EB=8F=8C=EB=A6=B0=EB=8B=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit #215 Task 8. 같은 커밋으로 20회 반복 실행하는 측정이 끝나 측정 전용 설정을 모두 원래대로 돌린다. `develop`에 남기지 않기로 한 설정들이다. - retries를 측정 전 값으로 되돌린다. 최종값은 다음 커밋에서 정한다. - json reporter를 뺀다. 케이스별 집계가 끝나 더 필요하지 않다. - 산출물 업로드 조건을 failure로 되돌린다. 성공한 실행의 리포트는 측정 기간에만 필요했다. Co-Authored-By: Claude Opus 5 (1M context) --- .github/workflows/ci-e2e-test.yml | 5 ++--- playwright.config.ts | 11 ++--------- 2 files changed, 4 insertions(+), 12 deletions(-) diff --git a/.github/workflows/ci-e2e-test.yml b/.github/workflows/ci-e2e-test.yml index 37a0b10..7e43e50 100644 --- a/.github/workflows/ci-e2e-test.yml +++ b/.github/workflows/ci-e2e-test.yml @@ -86,11 +86,10 @@ jobs: SUPABASE_SERVICE_ROLE_KEY: ${{ secrets.E2E_SUPABASE_SECRET_KEY }} E2E_TEST_USER_PASSWORD: ${{ secrets.E2E_TEST_USER_PASSWORD }} - # #215 측정 기간에는 성공한 실행도 올린다. 케이스별 실패율을 세려면 - # 통과한 실행의 결과 파일도 있어야 한다. + # 실패했을 때만 올린다. 리포트로 어떤 케이스가 깨졌는지 보고, # trace는 `npx playwright show-trace trace.zip`으로 그 시점 화면과 네트워크를 확인한다. - name: Upload report - if: always() + if: failure() uses: actions/upload-artifact@v7 with: name: playwright-${{ matrix.project }}-${{ github.run_attempt }} diff --git a/playwright.config.ts b/playwright.config.ts index ee30c18..fd20f4c 100644 --- a/playwright.config.ts +++ b/playwright.config.ts @@ -9,19 +9,12 @@ export default defineConfig({ timeout: 90_000, expect: { timeout: 20_000 }, forbidOnly: !!process.env.CI, - // #215 실패율 측정 기간에는 재시도를 끈다. 재시도가 성공하면 흔들림이 - // 결과에 드러나지 않아 측정 자체가 불가능하다. 측정 후 최종값을 정한다. - retries: 0, + retries: process.env.CI ? 2 : 0, // next dev 서버가 단일 프로세스라 워커를 늘리면 경로 컴파일이 서로 밀려 타임아웃이 난다. // CI는 빌드된 서버를 실행하므로 병렬로 돌려도 안정적이다. // ubuntu-latest가 4 vCPU라 브라우저가 CPU를 다 먹지 않도록 2로 둔다. workers: process.env.CI ? 2 : 1, - reporter: [ - [process.env.CI ? 'line' : 'list'], - ['html', { open: 'never' }], - // #215 케이스별 실패율을 집계하려면 성공한 실행의 결과도 파일로 남아야 한다. - ['json', { outputFile: 'test-results/results.json' }], - ], + reporter: [[process.env.CI ? 'line' : 'list'], ['html', { open: 'never' }]], use: { baseURL, trace: 'retain-on-failure', From 49cb9368f1f8cefe88bdcf36a3aaf248bccd828d Mon Sep 17 00:00:00 2001 From: unknown Date: Thu, 3 Sep 2026 11:34:45 +0900 Subject: [PATCH 3/3] =?UTF-8?q?test:=20E2E=20=EC=9E=AC=EC=8B=9C=EB=8F=84?= =?UTF-8?q?=EB=A5=BC=20=EC=B8=A1=EC=A0=95=20=EA=B2=B0=EA=B3=BC=EC=97=90=20?= =?UTF-8?q?=EB=94=B0=EB=9D=BC=20CI=201=ED=9A=8C=EB=A1=9C=20=EC=A0=95?= =?UTF-8?q?=ED=95=9C=EB=8B=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit #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) --- playwright.config.ts | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/playwright.config.ts b/playwright.config.ts index fd20f4c..a82a798 100644 --- a/playwright.config.ts +++ b/playwright.config.ts @@ -9,7 +9,11 @@ export default defineConfig({ timeout: 90_000, expect: { timeout: 20_000 }, forbidOnly: !!process.env.CI, - retries: process.env.CI ? 2 : 0, + // 같은 커밋으로 20회 돌린 결과 케이스 실패율이 0.31%였고, 유일한 실패도 + // Supabase 쪽 시계 오차로 보이는 일회성 오류였다(#215). + // 1회면 이런 딸꾹질은 흡수하고 반복해서 깨지는 테스트는 그대로 빨갛게 남는다. + // 재시도로 통과한 건은 flaky로 따로 집계되므로 흔들림 관측도 계속된다. + retries: process.env.CI ? 1 : 0, // next dev 서버가 단일 프로세스라 워커를 늘리면 경로 컴파일이 서로 밀려 타임아웃이 난다. // CI는 빌드된 서버를 실행하므로 병렬로 돌려도 안정적이다. // ubuntu-latest가 4 vCPU라 브라우저가 CPU를 다 먹지 않도록 2로 둔다.