E2E 테스팅 스킬
트리거
- 키워드:
teste,e2e,playwright,browser test,visual test,smoke test - 호출:
/e2e-test [suite] [--flags]
설명
미리보기 및 프로덕션 환경에서 인간과 유사한 동작으로 E2E 테스트를 자동화합니다. Chrome MCP 또는 Playwright MCP를 사용하여 브라우저를 자동화합니다.
테스트 스위트
| 스위트 | 소요 시간 | 설명 |
|---|---|---|
smoke | 30초 | 로그인, 업로드, 기본 UI ("teste" 키워드 기본값) |
full | 5분 | 모든 P0+P1 시나리오 |
visual | 2분 | 스크린샷 비교만 수행 |
upload | 1분 | 모든 파일 형식 테스트 |
download | 2분 | 내보내기(Export) 기능 테스트 |
login | 30초 | 인증 플로우 테스트 |
api | 1분 | API 엔드포인트 테스트 |
플래그
| 플래그 | 설명 |
|---|---|
--preview | localhost만 테스트 |
--production | 프로덕션 URL만 테스트 |
--quick | P0 시나리오만 테스트 (가장 빠름) |
--human | 실제 브라우저를 사용하는 Chrome MCP |
--headless | 헤드리스 Playwright MCP (CI/CD) |
--update-baselines | 스크린샷 기준선 업데이트 |
--mobile | 모바일 뷰포트 테스트 (375px, 768px) |
워크플로우
1. 환경 확인
- localhost 실행 여부 확인 (curl/fetch)
- 프로덕션 URL 연결 가능 여부 확인
- 플래그에 따라 테스트 환경 선택
2. 브라우저 설정
- --human 플래그: Chrome MCP 사용 (mcp__claude-in-chrome__)
- 그 외: Playwright MCP 사용 (mcp__playwright__)
- 뷰포트: 1280x720 (데스크탑) 또는 375x667 (모바일)
3. 인간 행동 활성화
- 무작위 지연: 동작 사이 200-800ms
- 타이핑 속도: 키당 50-150ms
- 클릭 전 호버 (200-500ms 대기)
- 즉시 스크롤 대신 부드러운 스크롤
4. 테스트 스위트 실행
- 각 테스트 전후 스크린샷 촬영
- 오류 발생 시 스크린샷 + 콘솔 로그 저장
- 다운로드 확인: 파일 크기 검증
5. 리포트 생성
- .playwright-mcp/reports/ 디렉토리에 마크다운 리포트 저장
- 시각적 차이 발생 시 Diff 이미지 생성
- Pass/Fail/Flaky 상태 요약
테스트 시나리오 (P0 - 비즈니스 크리티컬)
1. 랜딩 페이지 로드
- URL로 이동
- 주요 요소가 보일 때까지 대기
- 로고/브랜딩 표시 확인
- 스크린샷: landing-page.png
2. 로그인/인증 플로우
- 로그인 버튼 클릭
- 모달/페이지 애니메이션 완료 대기
- 인증 옵션 표시 확인 (OAuth, 이메일 등)
- 스크린샷: login-modal.png
3. 언어 전환 (i18n 지원 시)
- 언어 전환 버튼 찾기
- 인간 지연 후 클릭
- 텍스트 변경 대기
- UI 텍스트가 변경되었는지 확인
- 스크린샷: language-toggle.png
4. 파일 업로드 (해당 기능이 있을 경우)
- 업로드 영역 클릭
- 테스트 파일 선택
- 확인 메시지 대기
- 파일 이름이 표시되는지 확인
- 스크린샷: file-uploaded.png
5. 주요 작업 수행
- 기본 앱 기능 실행
- 로딩 상태 대기
- 결과 대기 (최대 60초)
- 결과 콘텐츠 존재 확인
- 스크린샷: result.png
6. 내보내기/다운로드 (해당 기능이 있을 경우)
- 다운로드 버튼 클릭
- 다운로드 이벤트 대기
- 파일 형식이 올바른지 확인
- 파일 크기가 최소 크기보다 큰지 확인
- 스크린샷: download-complete.png
테스트 시나리오 (P1 - 중요)
7. 네비게이션/히스토리
- 네비게이션 요소 클릭
- 애니메이션 대기
- 올바른 콘텐츠가 로드되었는지 확인
8. 테마 전환 (해당 기능이 있을 경우)
- 테마 전환 버튼 찾기
- 현재 색상 기록
- 버튼 클릭
- 색상이 변경되었는지 확인
- 스크린샷: theme-toggle.png
9. 반응형 디자인
- 뷰포트를 375x667로 설정
- 모바일 네비게이션 표시 확인
- 주요 기능 접근 가능 여부 확인
- 스크린샷: mobile-view.png
10. 오류 처리
- 오류 유발 (잘못된 입력)
- 오류 메시지 대기
- 오류 메시지가 사용자 친화적인지 확인
- 스크린샷: error-state.png
인간 행동 함수
// 무작위 지연 (200-800ms)
async function humanDelay() {
const delay = 200 + Math.random() * 600;
await page.waitForTimeout(delay);
}
// 인간적인 타이핑 (키당 50-150ms)
async function humanType(selector: string, text: string) {
await page.click(selector);
await humanDelay();
for (const char of text) {
await page.keyboard.type(char);
await page.waitForTimeout(50 + Math.random() * 100);
}
}
// 호버 -> 대기 -> 클릭 패턴
async function humanClick(selector: string) {
await page.hover(selector);
await page.waitForTimeout(200 + Math.random() * 300);
await page.click(selector);
await humanDelay();
}
// 부드러운 스크롤
async function humanScroll(pixels: number) {
await page.evaluate((px) => {
window.scrollTo({ top: px, behavior: "smooth" });
}, pixels);
await page.waitForTimeout(500);
}
리포트 형식
## E2E 테스트 리포트 - [날짜] [시간]
### 환경
- **URL**: [테스트된 URL]
- **브라우저**: Chromium [버전]
- **뷰포트**: 1280x720
- **스위트**: smoke
### 결과
| # | 테스트 | 상태 | 소요 시간 | 스크린샷 |
| --- | ------------------ | ------- | -------- | --------------------------- |
| 1 | 랜딩 페이지 로드 | PASS | 0.8s | [보기](landing-page.png) |
| 2 | 로그인 모달 | PASS | 1.2s | [보기](login-modal.png) |
| 3 | 파일 업로드 | PASS | 2.1s | [보기](file-uploaded.png) |
| 4 | 주요 작업 | SLOW | 45.2s | [보기](result.png) |
| 5 | 다운로드 | FAIL | 3.4s | [보기](error.png) |
### 요약
- **전체**: N개 테스트
- **통과**: X개 (Y%)
- **실패**: A개 (B%)
- **느림/불안정**: C개 (D%)
- **소요 시간**: Z초
시각적 기준선
.playwright-mcp/
├── baselines/ # 황금 기준 (git 추적)
│ ├── landing-page-desktop.png
│ ├── landing-page-mobile.png
│ ├── login-modal.png
│ ├── result.png
│ └── error-state.png
├── current/ # 현재 스크린샷 (git 무시)
├── diffs/ # 픽셀 차이 (git 무시)
└── reports/ # 테스트 리포트 (git 무시)
실행
가장 간단한 호출
사용자: "teste"
-> 사용 가능한 환경에서 smoke 스위트 실행
특정 테스트
사용자: "teste upload"
-> upload 스위트만 실행
사용자: "teste production visual"
-> 프로덕션 환경에서 visual 스위트 실행
사용자: "teste --quick --human"
-> 실제 Chrome 브라우저로 빠른 테스트 실행
CI/CD 통합
사용자: "teste --headless --full"
-> 파이프라인에서 모든 테스트를 헤드리스로 실행
오류 처리
-
Localhost에 연결할 수 없는 경우:
- 경고 표시
- 개발 서버를 시작할지 묻기
-
프로덕션에 연결할 수 없는 경우:
- 경고 표시
- 배포 상태 확인
-
테스트 시간 초과 (>60초):
- 현재 상태 스크린샷 촬영
- 콘솔 로그 저장
- FAIL로 표시
-
시각적 차이 감지:
- Diff 이미지 생성
- FLAKY로 표시 (자동 FAIL 아님)
- 사용자가 기준선 업데이트 필요 여부 결정
설정
프로젝트 루트에 선택적 .e2e-config.json 파일:
{
"previewUrl": "http://localhost:5173",
"productionUrl": "https://your-app.com",
"defaultSuite": "smoke",
"timeouts": {
"navigation": 10000,
"action": 60000,
"download": 30000
},
"viewports": {
"desktop": { "width": 1280, "height": 720 },
"tablet": { "width": 768, "height": 1024 },
"mobile": { "width": 375, "height": 667 }
},
"humanBehavior": {
"enabled": true,
"minDelay": 200,
"maxDelay": 800,
"typingSpeed": { "min": 50, "max": 150 }
},
"screenshots": {
"onEveryStep": false,
"onFailure": true,
"fullPage": false
}
}
전제 조건
- Chrome MCP 또는 Playwright MCP 설치
package.json이 있는 Node.js 프로젝트- 선택 사항: 프로젝트 설정을 위한
.e2e-config.json
저자
Dresden AI Insights - https://dresdenaiinsights.com