From code-forge
프로젝트에 Playwright E2E 테스트 환경을 세팅합니다. 프로젝트 구조 감지 → 패키지 설치 → 설정 파일 → 디렉토리 구조 → 샘플 테스트 검증.
npx claudepluginhub ggombee/code-forgeThis skill uses the workspace's default tool permissions.
E2E 테스트 환경이 없는 프로젝트에 Playwright 기반 초기 세팅을 수행합니다.
Initializes Playwright for E2E testing in Next.js and React projects: installs deps, creates config/tests, adds scripts, integrates CI/CD. Use when adding E2E tests to frontend apps.
Provides patterns for reliable Playwright E2E tests in web apps, covering locators, authentication, forms (React/SPA), assertions, organization, reliability, and CI/CD. Use for writing, reviewing, or debugging tests.
Share bugs, ideas, or general feedback.
E2E 테스트 환경이 없는 프로젝트에 Playwright 기반 초기 세팅을 수행합니다.
설계 문서: @../../docs/e2e-forge-loop-design.md
/setup-e2e # 자동 감지
/setup-e2e --baseUrl http://localhost:3000
다음을 자동 감지합니다:
# Playwright 설치 여부
ls node_modules/@playwright 2>/dev/null
cat package.json | grep playwright
# 기존 E2E 디렉토리
ls e2e/ 2>/dev/null || ls tests/ 2>/dev/null || ls __e2e__/ 2>/dev/null
# 기존 설정 파일
ls playwright.config.* 2>/dev/null
이미 Playwright가 설정된 경우 → "기존 E2E 환경이 감지됐습니다. 보완만 진행할까요?" 확인.
| 감지 대상 | 방법 |
|---|---|
| Next.js | next.config.* → baseURL: http://localhost:3000 |
| Vite | vite.config.* → baseURL: http://localhost:5173 |
| CRA | react-scripts → baseURL: http://localhost:3000 |
| 커스텀 | package.json scripts에서 dev/start 포트 추출 |
ls apps/ 2>/dev/null
모노레포인 경우 → "어떤 앱의 E2E를 세팅할까요?" 선택 요청.
프로젝트 분석 결과:
- 프레임워크: Next.js 13 (Pages Router)
- 개발 서버: http://localhost:3000
- 기존 E2E: 없음
- 패키지 매니저: yarn
세팅할 항목:
1. @playwright/test 패키지 설치
2. playwright.config.ts 생성
3. e2e/ 디렉토리 구조 생성
4. 공통 fixtures (인증, 데이터) 생성
5. Page Object 베이스 클래스 생성
6. package.json에 test:e2e 스크립트 추가
7. .gitignore에 playwright 관련 항목 추가
진행할까요?
# 패키지 매니저 자동 감지
# yarn.lock → yarn, package-lock.json → npm, pnpm-lock.yaml → pnpm
{pm} add -D @playwright/test
# 브라우저 설치
npx playwright install chromium
Firefox/WebKit은 기본 설치하지 않음 (Chromium만). 필요 시 사용자 요청으로 추가.
프레임워크에 맞게 생성:
import { defineConfig, devices } from '@playwright/test';
export default defineConfig({
testDir: './e2e',
fullyParallel: true,
forbidOnly: !!process.env.CI,
retries: process.env.CI ? 2 : 0,
workers: process.env.CI ? 1 : undefined,
reporter: [['html', { open: 'never' }]],
use: {
baseURL: '{감지된 baseURL}',
trace: 'on-first-retry',
screenshot: 'only-on-failure',
},
projects: [
{ name: 'chromium', use: { ...devices['Desktop Chrome'] } },
],
// 개발 서버 자동 시작 (감지된 dev 명령어)
webServer: {
command: '{감지된 dev 명령어}',
url: '{감지된 baseURL}',
reuseExistingServer: !process.env.CI,
timeout: 120_000,
},
});
e2e/
├── fixtures/
│ ├── auth.fixture.ts # 인증 상태 fixture
│ └── test-data.fixture.ts # 테스트 데이터 fixture
├── pages/
│ └── base.page.ts # Page Object 베이스 클래스
├── utils/
│ └── helpers.ts # 공통 헬퍼 (waitForApi 등)
└── sample.spec.ts # 환경 검증용 샘플 테스트
import { test as base } from '@playwright/test';
type AuthFixtures = {
authenticatedPage: Page;
};
export const test = base.extend<AuthFixtures>({
authenticatedPage: async ({ page }, use) => {
// 프로젝트 인증 방식에 맞게 수정 필요
// 예: 로그인 페이지 → 토큰 저장 → 재사용
await use(page);
},
});
import { Page, Locator } from '@playwright/test';
export abstract class BasePage {
constructor(protected readonly page: Page) {}
async navigate(path: string) {
await this.page.goto(path);
}
async waitForPageLoad() {
await this.page.waitForLoadState('networkidle');
}
}
// e2e/sample.spec.ts
import { test, expect } from '@playwright/test';
test('메인 페이지가 정상 로드된다', async ({ page }) => {
await page.goto('/');
await expect(page).toHaveTitle(/.+/);
});
{
"scripts": {
"test:e2e": "playwright test",
"test:e2e:ui": "playwright test --ui",
"test:e2e:report": "playwright show-report"
}
}
# Playwright
/test-results/
/playwright-report/
/blob-report/
/playwright/.cache/
# 샘플 테스트 실행
npx playwright test e2e/sample.spec.ts
성공 시:
## E2E 환경 세팅 완료
- Playwright: @playwright/test 설치됨
- 브라우저: Chromium
- 설정: playwright.config.ts
- 테스트 디렉토리: e2e/
- 샘플 테스트: PASS
다음 단계: `/e2e {페이지경로}` 로 E2E 테스트를 생성하세요.
실패 시:
{dev 명령어}"