Playwright E2E 테스트의 전체 목록, 실행 방법, 계정 정보, 설정 파일 구성을 한 곳에 정리한다.
테스트 작성 기준은 frontend/tests/README.md 참조.
frontend/tests/
├── helpers/ # 테스트 유틸 (global-setup, auth, mock 등)
├── .auth/ # globalSetup이 생성하는 인증 상태 파일
├── *.spec.ts # app 루트 테스트 (login, profile, password-change)
├── account/ # app — CI 제외
├── system/ # app — 일부 CI 제외
├── features/ # app
├── shared/ # app
├── booking/ # linkpie
├── deskpie/ # deskpie
└── manual/ # 제품 매뉴얼 스크린샷 + 페이지 검증 (@manual 태그)
├── app/
├── linkpie/
└── deskpie/
개별 파일 목록은 아래 서비스별 테이블 참조.
| 태그 | 의미 | 필터링 |
|---|---|---|
@hermetic |
page.route()로 모든 API를 모킹하여 백엔드 없이 자기 완결적으로 실행되는 테스트. 실서버 대상 실행 시 stub과 실제 응답이 충돌하므로 제외해야 한다. |
--grep-invert @hermetic |
@manual |
제품 매뉴얼 스크린샷 캡처 및 페이지 검증용 테스트 | grepInvert: /@manual/ (CI config) |
@smoke |
Watchtower 헬스체크 대상 테스트 | grep: /@smoke/ (watchtower config) |
| 파일 | 검증 대상 |
|---|---|
login.spec.ts |
로그인 폼, 인증 |
profile.spec.ts |
프로필 관리 |
system/invite.spec.ts |
사용자 초대 |
system/menus-icon-picker.spec.ts |
메뉴 아이콘 선택 |
system/notification-channels-refresh.spec.ts |
알림 채널 갱신 |
system/sidebar-collapsed-dropdown.spec.ts |
사이드바 접힘 드롭다운 |
system/workspace-detail-route.spec.ts |
Workspace 라우팅 |
features/command-palette.spec.ts |
커맨드 팔레트 |
shared/splitter-layout.spec.ts |
분할 레이아웃 |
shared/system-layout-sticky.spec.ts |
고정 레이아웃 |
| 파일 | 제외 사유 |
|---|---|
account/branding-serving.spec.ts |
**/account/** 전체 제외 |
account/roles.spec.ts |
**/account/** 전체 제외 |
account/setting.spec.ts |
**/account/** 전체 제외 |
password-change.spec.ts |
비밀번호 변경 후 세션 영향 |
system/logs.spec.ts |
데이터 의존성 |
system/menus.spec.ts |
데이터 의존성 |
system/notification-management.spec.ts |
외부 채널 의존 |
system/sidebar.spec.ts |
데이터 의존성 |
system/templates.spec.ts |
데이터 의존성 |
system/users.spec.ts |
데이터 의존성 |
CI 제외는 frontend/app/playwright.config.ts의 testIgnore에서 관리한다.
| 파일 | 검증 대상 |
|---|---|
booking/booking-bookings.spec.ts |
예약 관리 |
booking/booking-event-types.spec.ts |
이벤트 타입 CRUD |
booking/booking-profile.spec.ts |
예약 프로필 |
booking/booking-schedules.spec.ts |
스케줄 관리 |
booking/guest-booking.spec.ts |
게스트 예약 |
booking/host-booking.spec.ts |
호스트 예약 |
linkpie는
BASE_URL없이 CI 실행 시 전체 skip (testIgnore: ['**/*.spec.ts']).scripts/e2e-ci linkpie가 백엔드와 함께 실행할 때만 동작한다.
| 파일 | 검증 대상 |
|---|---|
deskpie/menu-smoke.spec.ts |
메뉴 기능 |
deskpie/crm-filters-smoke.spec.ts |
CRM 필터링 |
제품 이용자 매뉴얼(docs/manual/)의 스크린샷 캡처와 페이지 검증을 겸하는 테스트.
모든 테스트에 @manual 태그가 붙으며, CI에서는 grepInvert: /@manual/로 제외된다.
일부 테스트는 @smoke를 겸하여 Watchtower 헬스체크에도 사용된다. 상세: watchtower.md
| 서비스 | 파일 | 검증 대상 |
|---|---|---|
| app | manual/app/login.spec.ts |
앱 기동 + 로그인 폼 렌더링 |
| app | manual/app/account.spec.ts |
인증 후 계정 API 정상 |
| app | manual/app/shared-registry-contracts.spec.ts |
알림/활동 로그 shared registry smoke |
| linkpie | manual/linkpie/booking.spec.ts |
예약 프로필 |
| linkpie | manual/linkpie/booking.spec.ts |
스케줄 목록 |
| deskpie | manual/deskpie/crm.spec.ts |
CRM 서비스 기동 |
| deskpie | manual/deskpie/licenses.spec.ts |
라이선스 API 정상 |
app/linkpie/deskpie의 menu smoke helper는 backend menu tree만 그대로 순회하지 않는다.
frontend의 실제 접근 정책(permissions, workspacePolicy, 현재 선택 workspace)을 함께 반영해 방문 대상을 계산한다.
따라서 workspacePolicy == null로 workspace 기능이 꺼진 환경에서는 숨겨져야 하는 workspace 메뉴와 direct URL 404 경로를 smoke target에 포함하지 않는다.
@smoke 태그가 없어 Watchtower에서 실행되지 않는다. 매뉴얼 스크린샷 갱신 시 playwright.manual.config.ts로 실행.
| 서비스 | 파일 | 검증 대상 |
|---|---|---|
| app | manual/app/chunk-recovery.spec.ts |
코드 청크 복구 |
| app | manual/app/logs-pagination.spec.ts |
로그 페이지네이션 |
| linkpie | manual/linkpie/calendar.spec.ts |
캘린더 연동 |
| 설정 파일 | 용도 | testDir | 비고 |
|---|---|---|---|
frontend/app/playwright.config.ts |
app CI/로컬 | ../tests |
booking, deskpie, manual, 일부 system 제외 |
frontend/linkpie/playwright.config.ts |
linkpie CI/로컬 | ../tests/booking |
BASE_URL 없으면 전체 skip |
frontend/deskpie/playwright.config.ts |
deskpie CI/로컬 | ../tests/deskpie |
|
frontend/app/playwright.manual.config.ts |
매뉴얼 (로컬 서버 대상) | ../tests/manual |
서비스별 baseURL 분리, 인증 없음 |
frontend/tests/playwright.manual.config.ts |
매뉴얼 (dev/stage 대상) | ./manual |
실제 API, manual-global-setup.ts 사용 |
frontend/app/playwright.watchtower.config.ts |
Watchtower 전용 | ../tests/manual |
grep: /@smoke/, BASE_URL 필수 |
frontend/tests/helpers/global-setup.ts에서 결정:
username: E2E_USERNAME → CI_USERNAME → "ci-admin"
password: E2E_PASSWORD → CI_PASSWORD → "TestPass1!"
| 환경 | username | password | 비고 |
|---|---|---|---|
CI E2E (scripts/e2e-ci) |
ci-admin |
TestPass1! |
seed SQL로 생성 |
| Watchtower (dev 서버) | manager |
GitHub Secret | vars.DEV_CI_USERNAME / secrets.DEV_CI_PASSWORD |
| 로컬 수동 실행 | 환경변수로 지정 | 환경변수로 지정 | E2E_USERNAME / E2E_PASSWORD |
scripts/e2e-ci, scripts/e2e-backend는 아래 seed 디렉토리를 backend 컨테이너의 /tmp/ci-seed-*로 복사한 뒤, SPRING_FLYWAY_LOCATIONS=filesystem:/tmp/ci-seed-*를 추가해 Flyway로 적용한다. runtime 이미지나 ci profile이 seed를 자동 포함하는 구조는 아니다.
| seed 파일 | 내용 |
|---|---|
backend/app/src/main/resources/db/migration/ci-seed/V9999__ci-seed.sql |
ci-admin 계정, workspace |
backend/linkpie/src/main/resources/db/migration/ci-seed/V202602251201__ci-seed-linkpie.sql |
linkpie booking 데이터 |
auth.ts의 login 함수는 비밀번호 변경 요구("Password Change Required")를 자동 처리한다.
seed 초기 비밀번호(MANUAL_SEED_PASSWORD, 기본값: Deck@dm1n!)로 로그인 후 → 지정 비밀번호로 변경.
| 종류 | 이름 | 설명 |
|---|---|---|
| Variable | DEV_CI_USERNAME |
dev 모니터링 계정 (현재: manager) |
| Secret | DEV_CI_PASSWORD |
dev 모니터링 계정 비밀번호 |
| Secret | SLACK_BOT_TOKEN |
Slack bot OAuth token |
| Variable | SLACK_WATCHTOWER_CHANNEL_ID |
알림 채널 ID |
./scripts/e2e-mock # app mock E2E
./scripts/e2e-mock linkpie # linkpie mock E2E
./scripts/e2e-mock deskpie # deskpie mock E2E
./scripts/e2e-mock app --headed # headed 모드Mock 모드에서는 page.route()로 API를 모킹한다. BASE_URL 환경변수가 없으면 mock 모드로 동작.
./scripts/e2e-ci app # app E2E (Docker 컨테이너 기반)
./scripts/e2e-ci linkpie # linkpie E2E
./scripts/e2e-ci deskpie # deskpie E2E
./scripts/e2e-ci app --no-cleanup # 디버그: 컨테이너 유지
./scripts/e2e-ci app --tag dev-abc1234 # 특정 이미지 태그동작 흐름:
- Docker network 생성 (서비스별 격리)
deck-postgres:latest기동 →wait-for-pg대기deck-{service}:{tag}backend 컨테이너 생성- host의
backend/*/db/migration/ci-seed디렉토리를 backend 컨테이너/tmp/ci-seed-*로 복사 SPRING_FLYWAY_LOCATIONS=classpath:db/migration/... ,filesystem:/tmp/ci-seed-*로 backend 기동 → health 폴링- Playwright 컨테이너에서 테스트 실행
- 결과 리포트 복사 + 컨테이너 정리
| 구분 | 책임 | 적용 방식 |
|---|---|---|
backend/app/.../db/migration/ci-seed |
모든 서비스가 공통으로 필요한 CI seed (ci-admin, workspace 등) |
모든 서비스 E2E 하네스가 항상 /tmp/ci-seed-app로 복사 후 Flyway에 포함 |
backend/linkpie/.../db/migration/ci-seed |
linkpie 전용 booking seed | linkpie 하네스만 /tmp/ci-seed-linkpie로 복사 후 Flyway에 포함 |
backend/deskpie/.../db/migration/ci-seed |
deskpie 전용 CI seed | deskpie 하네스만 /tmp/ci-seed-deskpie로 복사 후 Flyway에 포함 |
한 문장으로 정리하면, ci-seed는 backend 이미지에 baked되지 않는 CI/E2E 전용 Flyway seed이고, E2E 하네스가 서비스별 seed 디렉토리를 임시 filesystem location으로 주입해 적용한다.
PR 또는 workflow_dispatch(+e2e_image_tag) 시 실행. push에서는 E2E가 동작하지 않는다 (docker-build 잡이 PR 전용).
변경 감지(paths-filter) 기반으로 필요한 서비스만 실행.
detect → backend + frontend → docker-build (PR only) → e2e-ready → e2e-app / e2e-linkpie / e2e-deskpie → ci-gate
| 잡 | timeout | 비고 |
|---|---|---|
e2e-app |
20분 | |
e2e-linkpie |
15분 | 2 shards 병렬 |
e2e-deskpie |
15분 |
실패 시 Playwright HTML 리포트가 artifact로 업로드된다 (30일 보존).
수동 실행: workflow_dispatch에서 e2e_image_tag 파라미터로 이미지 태그 지정 가능.
CI 파이프라인 설계 원칙: ci-pipeline.md 참조.
평일 KST 09:00~18:00 매시간 자동 실행. @smoke 태그 테스트만 실행하며, @hermetic 태그 테스트는 제외한다.
상세: watchtower.md
제품 매뉴얼 스크린샷 캡처 및 페이지 검증. @manual 태그 테스트를 로컬 서버에 대해 실행한다.
cd frontend/app
pnpm exec playwright test --config playwright.manual.config.ts| 환경변수 | 기본값 (로컬) |
|---|---|
MANUAL_BASE_URL |
http://localhost:4012 |
MANUAL_DESKPIE_URL |
http://localhost:4013 |
MANUAL_LINKPIE_URL |
http://localhost:4014 |
실제 API와 데이터를 사용한다. Mock 없음. 기본값은 dev 인스턴스.
./scripts/e2e-manual # dev 전체
./scripts/e2e-manual --target stage # stage 전체 (URL 환경변수 필수)
./scripts/e2e-manual -- --project app-manager # dev app manager만
./scripts/e2e-manual -- --grep @smoke # dev smoke만| 환경변수 | 기본값 (dev) |
|---|---|
MANUAL_BASE_URL |
https://deck-app-dev.tpm.querypie.io |
MANUAL_LINKPIE_URL |
https://deck-linkpie-dev.tpm.querypie.io |
MANUAL_DESKPIE_URL |
https://deck-deskpie-dev.tpm.querypie.io |
CI testIgnore로 제외된 테스트를 로컬에서 실행한다. 실제 백엔드가 필요하다.
./scripts/e2e-excluded # 로컬 백엔드 (localhost:8011)
./scripts/e2e-excluded --base-url http://localhost:8011
./scripts/e2e-excluded -- --headed # headed 모드제외 대상: account/**, password-change.spec.ts, system/menus.spec.ts, system/sidebar.spec.ts
| 파일 | 역할 |
|---|---|
scripts/e2e-ci |
CI/로컬 공용 E2E 실행 스크립트 |
scripts/e2e-remote |
Watchtower용 원격 Playwright 실행 |
scripts/e2e-mock |
Mock 모드 E2E (백엔드 불필요) |
scripts/e2e-manual |
dev/stage 대상 매뉴얼 스크린샷 + 검증 |
scripts/e2e-excluded |
CI 제외 테스트 로컬 실행 |
scripts/e2e-backend |
로컬 컨테이너 기반 백엔드+E2E 실행 |
frontend/tests/helpers/global-setup.ts |
Playwright globalSetup — 인증 상태 생성 |
frontend/tests/helpers/auth.ts |
로그인 함수 (비밀번호 변경 자동 처리) |
.github/workflows/ci.yml |
CI 파이프라인 |
.github/workflows/watchtower.yml |
Watchtower 헬스체크 |