# ๐ World-Class Tester Usage Guide
**์ค์ ํ์ฉ ๊ฐ์ด๋**
---
## ๐ 4๊ฐ์ง ์ค์ ์๋๋ฆฌ์ค
### 1. ์ ๊ท ๊ธฐ๋ฅ ํ
์คํธ (AI Chat ์์)
#### Step 1: ์๊ตฌ์ฌํญ ๋ถ์ (30๋ถ)
- AI Chat ๋ชฉ์ , ์ง์ ๋ชจ๋ธ, ์
๋ ฅ ์ ํ ํ์
- ์๋ต ์๊ฐ ๋ชฉํ, ์๋ฌ ์๋๋ฆฌ์ค ํ์ธ
#### Step 2: ํ
์คํธ ์ผ์ด์ค ์์ฑ (1์๊ฐ)
```yaml
Happy Paths:
- ๊ธฐ๋ณธ ๋ฉ์์ง ์ก์์
- Follow-up ์ปจํ
์คํธ ์ ์ง
- ์ฑํ
ํ์คํ ๋ฆฌ ํ์
Error Paths:
- ๋คํธ์ํฌ ์ค๋ฅ โ Retry
- API ํ์์์ โ ์๋ด ๋ฉ์์ง
Edge Cases:
- 10,000์ ๋ฉ์์ง
- ํน์๋ฌธ์/์ด๋ชจ์ง
- 50๊ฐ ์ฐ์ ๋ฉ์์ง โ Rate limiting
```
#### Step 3: Manual Testing (1์๊ฐ)
```bash
1. Chrome DevTools (F12) ์ด๊ธฐ
2. Happy Path ์คํ โ ์๋ต์๊ฐ, ๋ ๋๋ง ํ์ธ
3. Error Path โ ์๋ฌ ๋ฉ์์ง, Retry ๋ฒํผ
4. ๋ฐ๊ฒฌ๋ ๋ฒ๊ทธ โ Loom ๋
นํ + ์คํฌ๋ฆฐ์ท
```
#### Step 4: E2E ์๋ํ (2์๊ฐ)
```typescript
test('should send message and get AI response', async ({ page }) => {
await page.fill('[data-testid="chat-input"]', 'What is AI?');
await page.click('[data-testid="send-btn"]');
const aiMsg = page.locator('[data-testid="msg-ai"]').last();
await expect(aiMsg).toBeVisible({ timeout: 10000 });
});
```
---
### 2. Pre-release ๊ฒ์ฆ (4์๊ฐ)
```markdown
### CI/CD (30๋ถ)
- [ ] All tests pass (Unit/Integration/E2E)
- [ ] Code coverage >80%
### Critical Path (2์๊ฐ)
- [ ] Login/Logout
- [ ] Project CRUD
- [ ] AI Chat
- [ ] File upload
- [ ] Report generation
### Cross-Browser (1์๊ฐ)
- [ ] Chrome/Firefox/Safari/Edge
- [ ] iOS Safari, Android Chrome
### Performance (30๋ถ)
- [ ] Lighthouse >90
- [ ] Load time <2sec
### Security (30๋ถ)
- [ ] OWASP ZAP scan clean
- [ ] XSS/SQL injection blocked
```
---
### 3. ํ๊ท ํ
์คํธ
```bash
# E2E Regression Suite ์คํ
npm run test:e2e:regression
# Smoke Test (Critical paths๋ง)
npm run test:e2e:smoke
```
---
### 4. ์ฑ๋ฅ ๋ถํ ํ
์คํธ
```javascript
// k6 load test
export let options = {
stages: [
{ duration: '2m', target: 50 },
{ duration: '5m', target: 100 },
],
thresholds: {
http_req_duration: ['p(95)<500'], // 95% <500ms
},
};
```
---
## ์ ๊ท QA 4์ฃผ ์จ๋ณด๋ฉ
### Week 1: ๊ธฐ์ด
- ํ๋ก์ ํธ ์ดํด, ๋ก์ปฌ ํ๊ฒฝ ์ค์
- Chrome DevTools ๋ง์คํฐ
- ์ฒซ ๋ฒ๊ทธ ๋ฆฌํฌํธ ์์ฑ
### Week 2: ์๋ ํ
์คํธ
- ํ
์คํธ ์ผ์ด์ค ์์ฑ (10๊ฐ)
- Critical Path ํ
์คํธ ์คํ
- ๋ฒ๊ทธ 5๊ฐ ๋ฐ๊ฒฌ ๋ฐ ๋ฆฌํฌํธ
### Week 3: ์๋ํ ๊ธฐ์ด
- Playwright ํํ ๋ฆฌ์ผ
- Page Object Model ์ดํด
- ์ฒซ E2E ํ
์คํธ 3๊ฐ ์์ฑ
### Week 4: ๋
๋ฆฝ ์์
- ์ ์ฒด ๊ธฐ๋ฅ ํ
์คํธ ํ๋ ์๋ฆฝ
- Pre-release checklist ์คํ
- ํ ํ๊ณ ๋ฐํ
---
## Daily/Weekly/Sprint ์ฒดํฌํฌ์ธํธ
### Daily
```markdown
์ค์ (9:00-12:00):
- Standup ์ฐธ์ฌ
- ๊ณํ๋ ํ
์คํธ ์คํ
์คํ (1:00-6:00):
- ๋ฒ๊ทธ ๊ฒ์ฆ ๋ฐ ํ๊ท ํ
์คํธ
- ํ์์ ํ
์คํธ
- ๋ฒ๊ทธ ๋ฆฌํฌํธ ์์ฑ
Daily Metrics:
- ํ
์คํธ ์ผ์ด์ค: ~20๊ฐ
- ๋ฒ๊ทธ ๋ฐ๊ฒฌ: 2-3๊ฐ
- E2E ์์ฑ: 1-2๊ฐ
```
### Weekly
- Monday: Sprint planning
- Tue-Thu: ํ
์คํธ ์คํ
- Friday: ์ฃผ๊ฐ ๋ฆฌํฌํธ, retrospective
### Sprint
- Start: ํ
์คํธ ๊ณํ ์๋ฆฝ
- Mid: ์กฐ๊ธฐ ํ
์คํธ (dev branch)
- End: Pre-release ๊ฒ์ฆ
---
## FAQ
### Q1: Flaky test ์์ ?
```typescript
// โ Bad: ๊ณ ์ ๋๊ธฐ
await page.waitForTimeout(5000);
// โ
Good: ์กฐ๊ฑด๋ถ ๋๊ธฐ
await page.waitForSelector('[data-testid="result"]');
await page.waitForLoadState('networkidle');
```
### Q2: ๋ฒ๊ทธ ์ฐ์ ์์?
- **P0**: ์๋น์ค ์ค๋จ โ ์ฆ์ (1์๊ฐ)
- **P1**: ์ฃผ์ ๊ธฐ๋ฅ ๋ถ๊ฐ โ ๋น์ผ
- **P2**: ์ฐํ ๊ฐ๋ฅ โ 3์ผ
- **P3**: ๋ง์ด๋ โ ๋ค์ Sprint
### Q3: ํ
์คํธ ์ปค๋ฒ๋ฆฌ์ง ๋ฎ์ ๋?
1. Critical paths ๋จผ์
2. ๋ณต์กํ ๋ก์ง (์๋ฌ ์ฒ๋ฆฌ)
3. Edge cases
### Q4: ๊ฐ๋ฐ์์ ์๊ฒฌ ์ฐจ์ด?
โ
๋ฐ์ดํฐ ๊ธฐ๋ฐ ๋ํ
โ
์๊ตฌ์ฌํญ ์ฐธ์กฐ
โ
ํํ์ ์ ์
---
## ๋๊ตฌ ์ค์
### Playwright
```bash
npm init playwright@latest
npx playwright test --ui # ๋๋ฒ๊น
npx playwright test --headed # ๋ธ๋ผ์ฐ์ ๋ณด๊ธฐ
```
### Chrome DevTools
```javascript
// Console ์ ์ฉ ๋ช
๋ น์ด
$('[data-testid="button"]') // ์์ ์ ํ
performance.timing.loadEventEnd // ๋ก๋ฉ ์๊ฐ
```
### JIRA ํ
ํ๋ฆฟ
```markdown
Title: [Component] Brief description
Priority: P1
Labels: bug, sprint-22
[Bug report template ์ฌ์ฉ]
```
---
## ์ฐธ๊ณ ๋ฌธ์
- [World-Class Tester Persona](WORLD_CLASS_TESTER_PERSONA.md)
- [Tester Competencies](WORLD_CLASS_TESTER_COMPETENCIES.md)