mirim-app/frontend/playwright.config.js
AWESOMEDEV 1661591d8b
Some checks failed
CI / backend-test (push) Successful in 1m3s
CI / frontend-build (push) Failing after 27s
CI / backend-dep-scan (push) Successful in 6s
test(e2e): Playwright E2E 도입 — 로그인→강좌→퀴즈 + 멘토/감사로그
실제 브라우저로 '다 조립된 앱'(프론트+백엔드+DB)을 태우는 통합 테스트 6개:
- 인증 가드(비로그인→로그인), 로그인 실패 안내, 학생 로그인→대시보드
- 학습 센터→강좌 열기, 퀴즈 풀기→제출→서버 채점 결과
- 멘토 로그인→멘토 화면+개인정보 접근 기록(SEC-02 감사로그까지 검증)

운영 무오염 설계:
- deploy/docker-compose.e2e.yml — 별도 프로젝트(mirime2e)·네트워크·휘발성 DB(tmpfs)
- deploy/Caddyfile.e2e — 평문 HTTP로 SPA+/api 프록시(운영과 동일 구조)
- deploy/e2e.sh — 스택 기동→테스트 학생 API 생성→퀴즈 slug 자동조회→
  Playwright(브라우저 내장 이미지) 실행→down -v(정리)
- 백엔드 힙 256MB 제한(작은 인스턴스에서 운영과 공존)

EC2에서 6/6 통과 확인. 러너가 운영과 같은 인스턴스라 push마다가 아닌
온디맨드(릴리스 전)로 운영 — 전용 러너 확보 시 CI 게이트로 승격.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-20 08:27:42 +09:00

30 lines
1.4 KiB
JavaScript

import { defineConfig, devices } from '@playwright/test'
// 이 파일이 하는 일: E2E(End-to-End) 테스트 설정.
//
// 학습 포인트 — E2E는 무엇을 검증하나?
// 단위/컴포넌트 테스트는 "부품 하나"를 본다. E2E는 "다 조립된 앱"을 진짜 브라우저로
// 사용자처럼 눌러 본다 — 프론트+백엔드+DB가 함께 도는 통합 경로(로그인→강좌→퀴즈)를
// 확인해, 부품별 테스트가 못 잡는 "연결 지점의 회귀"를 잡는다.
//
// 스택(프론트+백엔드+DB)은 deploy/e2e.sh 가 격리된 임시 환경으로 띄우고(운영 무오염),
// 이 설정은 그 주소(E2E_BASE_URL)를 브라우저로 연다. 계정/퀴즈 slug도 env로 주입받는다.
export default defineConfig({
testDir: './e2e',
timeout: 30_000,
expect: { timeout: 10_000 },
// 하나의 임시 DB를 공유하므로 순차 실행(계정/세션이 서로 안 얽히게).
fullyParallel: false,
workers: 1,
// 네트워크 타이밍으로 한 번 실패할 수 있으니 1회 재시도(진짜 회귀는 재시도해도 실패).
retries: 1,
reporter: [['list'], ['html', { open: 'never' }]],
use: {
baseURL: process.env.E2E_BASE_URL || 'http://localhost:8899',
trace: 'on-first-retry', // 재시도 시 추적 파일 남겨 실패 원인 분석
screenshot: 'only-on-failure',
actionTimeout: 10_000,
},
projects: [{ name: 'chromium', use: { ...devices['Desktop Chrome'] } }],
})