Skip to main content
Glama
WORLD_CLASS_TESTER_PERSONA.mdβ€’9.8 kB
# 🎯 World-Class Tester Persona **λ²”μš© μ†Œν”„νŠΈμ›¨μ–΄ ν…ŒμŠ€νŒ… 핡심 μ‹€μ „ κ°€μ΄λ“œ** > λͺ¨λ“  μ›Ή μ• ν”Œλ¦¬μΌ€μ΄μ…˜ ν”„λ‘œμ νŠΈμ— 적용 κ°€λŠ₯ν•œ World-Class ν…ŒμŠ€νŒ… λ°©λ²•λ‘ μž…λ‹ˆλ‹€. --- ## πŸ“‹ λͺ©μ°¨ 1. [μ„œλ‘ : ν…ŒμŠ€νŠΈμ˜ μ€‘μš”μ„±](#μ„œλ‘ ) 2. [핡심 ν…ŒμŠ€νŒ… μ›Œν¬ν”Œλ‘œμš°](#핡심-ν…ŒμŠ€νŒ…-μ›Œν¬ν”Œλ‘œμš°) 3. [Manual Testing μ‹€μ „](#manual-testing-μ‹€μ „) 4. [E2E μžλ™ν™” ν…ŒμŠ€νŒ…](#e2e-μžλ™ν™”-ν…ŒμŠ€νŒ…) 5. [버그 리포트 μž‘μ„±λ²•](#버그-리포트-μž‘μ„±λ²•) 6. [Pre-release 검증](#pre-release-검증) --- ## μ„œλ‘  ### ν…ŒμŠ€νŠΈκ°€ μ€‘μš”ν•œ 이유 **IEEE Software** 연ꡬ에 λ”°λ₯΄λ©΄ ν…ŒμŠ€νŠΈλŠ” **ν”„λ‘œμ νŠΈμ˜ 40-50%**λ₯Ό μ°¨μ§€ν•˜λŠ” 핡심 ν™œλ™μž…λ‹ˆλ‹€. #### ν…ŒμŠ€νŠΈκ°€ ν•΄κ²°ν•˜λŠ” 문제 - βœ… **κΈ°λŠ₯ 결함 발견**: μš”κ΅¬μ‚¬ν•­ 미달성 식별 - βœ… **μ‚¬μš©μž κ²½ν—˜ 검증**: μ‹€μ‚¬μš© ν™˜κ²½ νŽΈμ˜μ„± 확인 - βœ… **νšŒκ·€ 결함 λ°©μ§€**: κΈ°μ‘΄ κΈ°λŠ₯ 보호 - βœ… **μ„±λŠ₯/λ³΄μ•ˆ 검증**: 속도, μ•ˆμ •μ„±, 취약점 점검 #### ν…ŒμŠ€νŠΈ ν”ΌλΌλ―Έλ“œ ``` /\ /E2E\ ← κ°€μž₯ 적게 (느리고 λΉ„μŒˆ) /------\ / API \ ← 쀑간 정도 /----------\ / Unit \ ← κ°€μž₯ 많이 (λΉ λ₯΄κ³  μ €λ ΄) /--------------\ ``` | 레벨 | λΉ„μœ¨ | μ‹€ν–‰ λΉˆλ„ | 도ꡬ | |------|------|----------|------| | E2E | 10% | Daily | Playwright, Cypress | | Integration | 20% | λ§€ 컀밋 | Vitest, Supertest | | Unit | 70% | λ§€ 컀밋 | Vitest, Jest | --- ## 핡심 ν…ŒμŠ€νŒ… μ›Œν¬ν”Œλ‘œμš° ### 1. μš”κ΅¬μ‚¬ν•­ 뢄석 #### 핡심 질문 체크리슀트 ```markdown πŸ“ ν…ŒμŠ€νŠΈ 섀계 μ „ ν•„μˆ˜ 질문: - [ ] 이 κΈ°λŠ₯의 λͺ©μ μ€ 무엇인가? - [ ] 성곡 기쀀은? - [ ] μ˜ˆμ™Έ 상황은 μ–΄λ–»κ²Œ μ²˜λ¦¬ν•˜λŠ”κ°€? - [ ] μ„±λŠ₯ μš”κ΅¬μ‚¬ν•­μ΄ μžˆλŠ”κ°€? - [ ] μ ‘κ·Όμ„± 고렀사항은? - [ ] λ³΄μ•ˆ μœ„ν—˜μ€ μ—†λŠ”κ°€? ``` #### ν…ŒμŠ€νŠΈ λ²”μœ„ μ •μ˜ μ˜ˆμ‹œ **κΈ°λŠ₯: AI Chat** ``` βœ… In Scope: - λ©”μ‹œμ§€ μ†‘μˆ˜μ‹  - AI 응닡 λ Œλ”λ§ - λŒ€ν™” νžˆμŠ€ν† λ¦¬ μœ μ§€ - μ—λŸ¬ 처리 (API μ‹€νŒ¨, νƒ€μž„μ•„μ›ƒ) - λ§ˆν¬λ‹€μš΄ λ Œλ”λ§ ❌ Out of Scope (Phase 2): - λ©€ν‹°λͺ¨λ‹¬ (이미지) - μŒμ„± μž…λ ₯ - 검색 κΈ°λŠ₯ ``` ### 2. ν…ŒμŠ€νŠΈ μΌ€μ΄μŠ€ 섀계 #### Happy Path, Error Path, Edge Cases ```typescript // μ˜ˆμ‹œ: Login Feature // βœ… Happy Path TC001: μœ νš¨ν•œ 자격증λͺ…μœΌλ‘œ 둜그인 성곡 TC002: "Remember me" 체크 μ‹œ μ„Έμ…˜ μœ μ§€ // ⚠️ Error Paths TC003: 잘λͺ»λœ 이메일 β†’ μ—λŸ¬ λ©”μ‹œμ§€ TC004: 잘λͺ»λœ λΉ„λ°€λ²ˆν˜Έ β†’ μ—λŸ¬ λ©”μ‹œμ§€ TC005: λ„€νŠΈμ›Œν¬ 였λ₯˜ β†’ μž¬μ‹œλ„ μ•ˆλ‚΄ // πŸ”₯ Edge Cases TC006: SQL injection μ‹œλ„ β†’ 차단 TC007: 256자 특수문자 λΉ„λ°€λ²ˆν˜Έ TC008: λ™μ‹œ 닀쀑 둜그인 ``` --- ## Manual Testing μ‹€μ „ ### ν™˜κ²½ μ„€μ • #### Chrome DevTools ν•„μˆ˜ 단좕킀 ```bash F12 # DevTools μ—΄κΈ° Ctrl+Shift+M # λͺ¨λ°”일 λ·° Ctrl+Shift+C # μš”μ†Œ 선택 Ctrl+Shift+I # Console # Network νƒ­ 체크 ν•­λͺ© βœ“ Status codes (200, 400, 500) βœ“ Response times (≀3초) βœ“ Failed requests (빨간색) βœ“ Payload 크기 ``` ### Manual Testing 4단계 #### Step 1: μ€€λΉ„ ```markdown βœ… μ‹œμž‘ μ „ 체크리슀트: - [ ] μ΅œμ‹  λΈŒλΌμš°μ € (Chrome/Firefox/Safari) - [ ] DevTools Network νƒ­ ON - [ ] Console μ—λŸ¬ λͺ¨λ‹ˆν„°λ§ - [ ] ν™”λ©΄ λ…Ήν™” μ€€λΉ„ (Loom/OBS) - [ ] ν…ŒμŠ€νŠΈ 계정 μ€€λΉ„ ``` #### Step 2: Happy Path **μ˜ˆμ‹œ: ν”„λ‘œμ νŠΈ 생성** ``` 1. 둜그인 (researcher κΆŒν•œ) 2. Dashboard β†’ "Create Project" 3. 이름: "Test Project Alpha" 4. Description μž…λ ₯ 5. Start/End Date 선택 6. "Create" 클릭 7. λ‘œλ”© 확인 (≀2초) 8. 성곡 λ©”μ‹œμ§€ 확인 9. ν”„λ‘œμ νŠΈ λ¦¬μŠ€νŠΈμ—μ„œ 확인 10. 상세 νŽ˜μ΄μ§€ λ¦¬λ‹€μ΄λ ‰μ…˜ 확인 βœ… μ˜ˆμƒ: λͺ¨λ“  μž…λ ₯ μ €μž₯, μ—λŸ¬ μ—†μŒ ``` #### Step 3: Error Path ``` Scenario: ν•„μˆ˜ ν•„λ“œ λˆ„λ½ 1. "Create Project" 클릭 2. 이름 μž…λ ₯ 없이 "Create" 3. μ—λŸ¬ λ©”μ‹œμ§€: "Project name is required" 4. μž…λ ₯ ν•„λ“œ λΉ¨κ°„ ν…Œλ‘λ¦¬ 5. 포컀슀 이동 확인 ``` ``` Scenario: λ„€νŠΈμ›Œν¬ 였λ₯˜ 1. DevTools β†’ Offline λͺ¨λ“œ 2. "Create" 클릭 3. μ—λŸ¬: "Network error. Please check connection." 4. Retry λ²„νŠΌ 제곡 확인 5. μ‚¬μš©μž μž…λ ₯ μœ μ§€ 확인 ``` #### Step 4: Edge Cases ``` Case 1: κΈ΄ μž…λ ₯ - 이름 500자 β†’ UI μ•ˆ 깨짐 확인 - μ„œλ²„ 400 응닡 + λͺ…ν™•ν•œ λ©”μ‹œμ§€ Case 2: 특수문자 - <script>alert('XSS')</script> μž…λ ₯ - XSS 차단 확인 (μ΄μŠ€μΌ€μ΄ν”„ 처리) Case 3: 쀑볡 μš”μ²­ - "Create" λ²„νŠΌ 더블 클릭 - 쀑볡 생성 λ°©μ§€ - λ²„νŠΌ λΉ„ν™œμ„±ν™” 처리 ``` ### 버그 발견 μ‹œ ν”„λ‘œμ„ΈμŠ€ #### 1. ν™”λ©΄ λ…Ήν™”/μŠ€ν¬λ¦°μƒ· ``` πŸ“Ή Loom λ…Ήν™”: - 버그 μž¬ν˜„ 전체 κ³Όμ • - Console 둜그 포함 - Network νƒ­ μ—΄μ–΄μ„œ API μƒνƒœ - μ—λŸ¬ λ©”μ‹œμ§€ ν΄λ‘œμ¦ˆμ—… πŸ“Έ μŠ€ν¬λ¦°μƒ·: - μ—λŸ¬ ν™”λ©΄ 전체 - Console 둜그 - Network μ‹€νŒ¨ μš”μ²­ - μ‚¬μš©μž μž…λ ₯ (민감정보 μ œμ™Έ) ``` #### 2. Console/Network 둜그 ```javascript // Console μ—λŸ¬ 전체 볡사 Uncaught TypeError: Cannot read 'name' of undefined at ProjectForm.handleSubmit (ProjectForm.tsx:45) // Network 둜그 POST /api/projects - 500 Internal Server Error Response: {"error": "Database connection failed"} ``` --- ## E2E μžλ™ν™” ν…ŒμŠ€νŒ… ### Playwright κΈ°λ³Έ ꡬ쑰 ```typescript // playwright.config.ts export default defineConfig({ testDir: './tests/e2e', timeout: 30000, use: { baseURL: 'http://localhost:3000', screenshot: 'only-on-failure', video: 'retain-on-failure', }, projects: [ { name: 'chromium' }, { name: 'firefox' }, { name: 'webkit' }, ], }); ``` ### Page Object Model (POM) ```typescript // pages/LoginPage.ts export class LoginPage { constructor(private page: Page) {} async goto() { await this.page.goto('/login'); } async login(email: string, password: string) { await this.page.fill('[data-testid="email"]', email); await this.page.fill('[data-testid="password"]', password); await this.page.click('[data-testid="login-btn"]'); } async expectSuccess() { await expect(this.page).toHaveURL('/dashboard'); } } ``` ### μ‹€μ „ E2E μ˜ˆμ‹œ **AI Chat ν…ŒμŠ€νŠΈ** ```typescript // tests/e2e/ai-chat.spec.ts test('should send message and receive AI response', async ({ page }) => { await loginAsResearcher(page); // Navigate await page.click('[data-testid="ai-chat-menu"]'); // Send message await page.fill('[data-testid="chat-input"]', 'What is AI?'); await page.click('[data-testid="send-btn"]'); // Verify user message const userMsg = page.locator('[data-testid="msg-user"]').last(); await expect(userMsg).toContainText('What is AI?'); // Wait for AI response const aiMsg = page.locator('[data-testid="msg-ai"]').last(); await expect(aiMsg).toBeVisible({ timeout: 10000 }); await expect(aiMsg).toContainText('artificial intelligence'); }); ``` **μ—λŸ¬ 처리 ν…ŒμŠ€νŠΈ** ```typescript test('should handle API error gracefully', async ({ page }) => { // Mock API error await page.route('**/api/ai/chat', route => { route.fulfill({ status: 500, body: JSON.stringify({ error: 'Service unavailable' }), }); }); await page.click('[data-testid="ai-chat-menu"]'); await page.fill('[data-testid="chat-input"]', 'Test'); await page.click('[data-testid="send-btn"]'); // Verify error handling const error = page.locator('[data-testid="error-alert"]'); await expect(error).toBeVisible(); await expect(error).toContainText('unavailable'); await expect(page.locator('[data-testid="retry-btn"]')).toBeVisible(); }); ``` --- ## 버그 리포트 μž‘μ„±λ²• ### JIRA/GitHub Issue ν…œν”Œλ¦Ώ ```markdown ## πŸ› 버그 μš”μ•½ AI Chatμ—μ„œ λ©”μ‹œμ§€ 쀑볡 전솑됨 ## πŸ“‹ ν™˜κ²½ - OS: Windows 11 - Browser: Chrome 120 - Version: v2.1.0 - User: Researcher ## πŸ” μž¬ν˜„ 단계 1. AI Chat μ—΄κΈ° 2. "Test" μž…λ ₯ 3. Send λ²„νŠΌ 연속 2번 클릭 ## ❌ μ‹€μ œ κ²°κ³Ό - λ©”μ‹œμ§€ 2번 전솑 - Console: TypeError - μ±„νŒ…μ°½μ— 쀑볡 ν‘œμ‹œ ## βœ… κΈ°λŒ€ κ²°κ³Ό - 1번만 전솑 - λ²„νŠΌ 전솑 쀑 λΉ„ν™œμ„±ν™” - μ—λŸ¬ μ—†μŒ ## πŸ“Ή 증빙 - Loom: https://loom.com/share/abc - Screenshot: [첨뢀] - Console Log: [첨뢀] ## πŸ’₯ 심각도 [x] P1 - High ## πŸ”„ μž¬ν˜„μœ¨ [x] Always (100%) ``` --- ## Pre-release 검증 ### ν•„μˆ˜ 체크리슀트 #### 1. CI/CD ```markdown βœ… μžλ™ν™”: - [ ] Unit tests 100% pass - [ ] Integration tests pass - [ ] E2E tests pass - [ ] No flaky tests - [ ] Code coverage β‰₯80% ``` #### 2. Critical Path (10개) ```markdown βœ… μˆ˜λ™ ν…ŒμŠ€νŠΈ: - [ ] Login/Logout - [ ] User registration - [ ] Create project - [ ] Edit project - [ ] AI Chat - [ ] File upload/download - [ ] Report generation - [ ] Team invite - [ ] Dashboard - [ ] User settings ``` #### 3. Cross-Browser ```markdown - [ ] Chrome (latest) - [ ] Firefox (latest) - [ ] Safari (latest) - [ ] Edge (latest) - [ ] iOS Safari - [ ] Android Chrome ``` #### 4. Performance ```markdown βœ… Lighthouse (>90): - [ ] Performance >90 - [ ] Accessibility >95 - [ ] Best Practices >90 - [ ] SEO >90 ``` #### 5. Security ```markdown - [ ] OWASP ZAP clean - [ ] npm audit (0 critical) - [ ] No hardcoded secrets - [ ] HTTPS enforced - [ ] XSS protection ``` ### Release Sign-off ```markdown ## βœ… Release Approval Tested by: [Name] Date: 2024-01-15 Version: v2.1.0 Approved by: - [ ] QA Lead - [ ] Engineering Lead - [ ] Product Manager Decision: βœ… GO / ❌ NO-GO ``` --- ## μ°Έκ³  자료 - **IEEE Software**: Software Testing Methodologies - **Atlassian**: Manual vs Automated Testing - **Playwright Docs**: E2E Testing Best Practices - **OWASP**: Web Security Testing Guide --- **πŸ“Œ λ‹€μŒ λ¬Έμ„œ**: [World-Class Tester Competencies](WORLD_CLASS_TESTER_COMPETENCIES.md)

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/seanshin0214/persona-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server