Skip to content

Latest commit

 

History

History
317 lines (234 loc) · 16.8 KB

File metadata and controls

317 lines (234 loc) · 16.8 KB

E2E 테스트 운영 레퍼런스

목적

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)

서비스별 테스트 목록

app (CI 실행)

파일 검증 대상
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 고정 레이아웃

app (CI 제외 — 로컬/수동 실행)

파일 제외 사유
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.tstestIgnore에서 관리한다.

linkpie (CI 실행)

파일 검증 대상
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 (CI 실행)

파일 검증 대상
deskpie/menu-smoke.spec.ts 메뉴 기능
deskpie/crm-filters-smoke.spec.ts CRM 필터링

manual — 제품 매뉴얼 문서용 (@manual)

제품 이용자 매뉴얼(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에 포함하지 않는다.

manual — 매뉴얼 전용 (@smoke 없음)

@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 캘린더 연동

Playwright 설정 파일

설정 파일 용도 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

CI Seed 계정

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!)로 로그인 후 → 지정 비밀번호로 변경.

GitHub Secrets/Variables (Watchtower용)

종류 이름 설명
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

실행 방법

1. 로컬 — Mock 기반 (scripts/e2e-mock, 백엔드 불필요)

./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 모드로 동작.

2. 로컬 — Backend + DB 통합 (scripts/e2e-ci)

./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 # 특정 이미지 태그

동작 흐름:

  1. Docker network 생성 (서비스별 격리)
  2. deck-postgres:latest 기동 → wait-for-pg 대기
  3. deck-{service}:{tag} backend 컨테이너 생성
  4. host의 backend/*/db/migration/ci-seed 디렉토리를 backend 컨테이너 /tmp/ci-seed-*로 복사
  5. SPRING_FLYWAY_LOCATIONS=classpath:db/migration/... ,filesystem:/tmp/ci-seed-*로 backend 기동 → health 폴링
  6. Playwright 컨테이너에서 테스트 실행
  7. 결과 리포트 복사 + 컨테이너 정리

ci-seed ownership 요약

구분 책임 적용 방식
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으로 주입해 적용한다.

3. CI (ci.yml)

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 참조.

4. Watchtower (dev 서버 헬스체크)

평일 KST 09:00~18:00 매시간 자동 실행. @smoke 태그 테스트만 실행하며, @hermetic 태그 테스트는 제외한다.

상세: watchtower.md

5. 매뉴얼 — 로컬 서버 대상

제품 매뉴얼 스크린샷 캡처 및 페이지 검증. @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

6. 매뉴얼 — dev/stage 인스턴스 대상 (scripts/e2e-manual)

실제 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

7. CI 제외 테스트 (scripts/e2e-excluded)

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 헬스체크