# ๐ World-Class Tester Competencies
**์ํํธ์จ์ด ํ
์คํฐ ์ญ๋ ํ์ค ๋ฐ ์ฑ์ฅ ๋ก๋๋งต**
> World-Class ํ
์คํฐ๊ฐ ๊ฐ์ถฐ์ผ ํ ๊ธฐ์ ์ ์ญ๋, ํ๋, ๋๊ตฌ ์๋ จ๋๋ฅผ ์ ์ํฉ๋๋ค.
---
## ๐ ๋ชฉ์ฐจ
1. [ํต์ฌ ์ญ๋ ๊ฐ์](#ํต์ฌ-์ญ๋-๊ฐ์)
2. [ํ
์คํ
๋ฐฉ๋ฒ๋ก ์ ๋ฌธ์ฑ](#ํ
์คํ
-๋ฐฉ๋ฒ๋ก -์ ๋ฌธ์ฑ)
3. [์๋ํ ์ญ๋](#์๋ํ-์ญ๋)
4. [๋๋ฉ์ธ ์ง์](#๋๋ฉ์ธ-์ง์)
5. [์ํํธ ์คํฌ](#์ํํธ-์คํฌ)
6. [ํ์ง ๋ฉํธ๋ฆญ & KPI](#ํ์ง-๋ฉํธ๋ฆญ--kpi)
7. [์ฑ์ฅ ๋ก๋๋งต](#์ฑ์ฅ-๋ก๋๋งต)
---
## ํต์ฌ ์ญ๋ ๊ฐ์
### World-Class Tester์ 4๊ฐ์ง ๊ธฐ๋ฅ
```
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ World-Class Tester Competencies โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโค
โ โ
โ 1. ํ
์คํ
๋ฐฉ๋ฒ๋ก Testing Methods โ
โ 2. ์๋ํ ์ญ๋ Automation โ
โ 3. ๋๋ฉ์ธ ์ง์ Domain Knowl. โ
โ 4. ์ํํธ ์คํฌ Soft Skills โ
โ โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
```
### ์ญ๋ ๋ ๋ฒจ ์ ์
| ๋ ๋ฒจ | ์ค๋ช
| ๊ธฐ๋ ๊ฒฝ๋ ฅ |
|------|------|----------|
| **L1 - Junior** | ๊ธฐ๋ณธ ์๋ ํ
์คํธ, ๊ฐ์ด๋ ํ์ | 0-2๋
|
| **L2 - Mid** | ๋
๋ฆฝ์ ํ
์คํธ, ๊ธฐ๋ณธ ์๋ํ | 2-4๋
|
| **L3 - Senior** | ๋ณต์กํ ์๋๋ฆฌ์ค, ๊ณ ๊ธ ์๋ํ | 4-7๋
|
| **L4 - Staff** | ์ํคํ
์ฒ ์ค๊ณ, ๋ฉํ ๋ง | 7-10๋
|
| **L5 - Principal** | ์กฐ์ง ์ ๋ต, ์
๊ณ ๋ฆฌ๋ | 10๋
+ |
---
## ํ
์คํ
๋ฐฉ๋ฒ๋ก ์ ๋ฌธ์ฑ
### 1. Unit Testing (๋จ์ ํ
์คํธ)
#### ํต์ฌ ๊ฐ๋
```typescript
// Good Unit Test ํน์ง: FIRST ์์น
// Fast, Independent, Repeatable, Self-validating, Timely
describe('Calculator', () => {
it('should add two numbers correctly', () => {
const result = add(2, 3);
expect(result).toBe(5); // โ
Fast, clear
});
it('should handle edge case: large numbers', () => {
const result = add(Number.MAX_SAFE_INTEGER, 1);
expect(result).toBe(Number.MAX_SAFE_INTEGER + 1); // ๐ฅ Edge case
});
});
```
#### ์ญ๋ ๊ธฐ์ค
| ๋ ๋ฒจ | ์ญ๋ |
|------|------|
| L1 | ๊ธฐ์กด ํ
์คํธ ์คํ, ๊ฐ๋จํ assertion ์์ฑ |
| L2 | ๋
๋ฆฝ์ unit test ์์ฑ, mocking ์ดํด |
| L3 | TDD ์ค์ฒ, ๋ณต์กํ mock/spy ํ์ฉ |
| L4 | ํ
์คํธ ์ํคํ
์ฒ ์ค๊ณ, ํ ๊ฐ์ด๋๋ผ์ธ ์๋ฆฝ |
### 2. Integration Testing (ํตํฉ ํ
์คํธ)
#### ํต์ฌ ๊ฐ๋
```typescript
// API Integration Test ์์
describe('POST /api/projects', () => {
it('should create project with valid data', async () => {
const response = await request(app)
.post('/api/projects')
.send({
name: 'Test Project',
startDate: '2024-01-01',
})
.expect(201);
expect(response.body).toHaveProperty('id');
expect(response.body.name).toBe('Test Project');
// Verify in database
const project = await db.projects.findById(response.body.id);
expect(project).toBeTruthy();
});
});
```
#### ์ญ๋ ๊ธฐ์ค
| ๋ ๋ฒจ | ์ญ๋ |
|------|------|
| L2 | API ํ
์คํธ ์์ฑ, DB ์ํธ์์ฉ ๊ฒ์ฆ |
| L3 | ๋ณต์กํ ํตํฉ ์๋๋ฆฌ์ค, ํธ๋์ญ์
์ฒ๋ฆฌ |
| L4 | ๋ง์ดํฌ๋ก์๋น์ค ํตํฉ ํ
์คํธ ์ํคํ
์ฒ |
### 3. E2E Testing (์๋ํฌ์๋ ํ
์คํธ)
#### ํต์ฌ ๊ฐ๋
```typescript
// E2E Test: User Journey
test('complete user onboarding flow', async ({ page }) => {
// 1. Registration
await page.goto('/register');
await page.fill('[name="email"]', 'new@user.com');
await page.fill('[name="password"]', 'secure123');
await page.click('button[type="submit"]');
// 2. Email verification (mock)
const verifyLink = await getVerificationLink('new@user.com');
await page.goto(verifyLink);
// 3. Profile setup
await expect(page).toHaveURL('/profile/setup');
await page.fill('[name="fullName"]', 'John Doe');
await page.click('button:has-text("Complete Setup")');
// 4. Dashboard access
await expect(page).toHaveURL('/dashboard');
await expect(page.locator('h1')).toContainText('Welcome, John');
});
```
#### ์ญ๋ ๊ธฐ์ค
| ๋ ๋ฒจ | ์ญ๋ |
|------|------|
| L2 | ๊ฐ๋จํ E2E ์๋๋ฆฌ์ค ์์ฑ |
| L3 | ๋ณต์กํ User Journey, Page Object Model ํ์ฉ |
| L4 | E2E ํ
์คํธ ํ๋ ์์ํฌ ์ค๊ณ, CI/CD ํตํฉ |
### 4. Performance Testing (์ฑ๋ฅ ํ
์คํธ)
#### ํต์ฌ ๊ฐ๋
```javascript
// k6 Load Testing ์์
import http from 'k6/http';
import { check } from 'k6';
export let options = {
stages: [
{ duration: '2m', target: 100 }, // Ramp up to 100 users
{ duration: '5m', target: 100 }, // Stay at 100 users
{ duration: '2m', target: 0 }, // Ramp down
],
thresholds: {
http_req_duration: ['p(95)<500'], // 95% requests < 500ms
},
};
export default function () {
const res = http.get('https://api.example.com/projects');
check(res, {
'status is 200': (r) => r.status === 200,
'response time < 500ms': (r) => r.timings.duration < 500,
});
}
```
#### ์ญ๋ ๊ธฐ์ค
| ๋ ๋ฒจ | ์ญ๋ |
|------|------|
| L2 | Lighthouse ์ ์ ์ธก์ , ๊ธฐ๋ณธ ๋ถํ ํ
์คํธ |
| L3 | k6/JMeter ์๋๋ฆฌ์ค ์์ฑ, ๋ณ๋ชฉ ๋ถ์ |
| L4 | ์ฑ๋ฅ ์ต์ ํ ์ ๋ต ์๋ฆฝ, ์บ์ฑ/CDN ์ค๊ณ |
### 5. Security Testing (๋ณด์ ํ
์คํธ)
#### ํต์ฌ ๊ฐ๋
```bash
# OWASP ZAP Automated Scan
zap-cli quick-scan --self-contained \
--start-options '-config api.disablekey=true' \
https://app.example.com
# SQL Injection Test (Manual)
' OR '1'='1'; --
admin'--
'; DROP TABLE users; --
# XSS Test
<script>alert('XSS')</script>
<img src=x onerror=alert('XSS')>
```
#### OWASP Top 10 ์ฒดํฌ๋ฆฌ์คํธ
```markdown
โ
๋ณด์ ํ
์คํธ ํ์ ํญ๋ชฉ:
- [ ] SQL Injection ๋ฐฉ์ด
- [ ] XSS (Cross-Site Scripting) ์ฐจ๋จ
- [ ] CSRF (Cross-Site Request Forgery) ํ ํฐ
- [ ] Authentication/Authorization ๊ฒ์ฆ
- [ ] Sensitive Data ์ํธํ
- [ ] Security Misconfiguration ์ ๊ฒ
- [ ] Insecure Deserialization ๋ฐฉ์ง
- [ ] Known Vulnerabilities ์ค์บ
- [ ] Insufficient Logging ๊ฐ์
```
#### ์ญ๋ ๊ธฐ์ค
| ๋ ๋ฒจ | ์ญ๋ |
|------|------|
| L2 | OWASP Top 10 ์ดํด, ๊ธฐ๋ณธ ์ทจ์ฝ์ ์ค์บ |
| L3 | ์นจํฌ ํ
์คํธ, ๋ณด์ ์ฝ๋ ๋ฆฌ๋ทฐ |
| L4 | ๋ณด์ ์ํคํ
์ฒ ์ค๊ณ, Threat modeling |
---
## ์๋ํ ์ญ๋
### 1. ํ
์คํธ ์๋ํ ์ํคํ
์ฒ
#### Layered Test Automation Architecture
```
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ Business Layer (Test Cases) โ โ Domain-specific test logic
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโค
โ Framework Layer (POM, Utils) โ โ Reusable components
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโค
โ Driver Layer (Playwright/Axios) โ โ Tool abstraction
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโค
โ System Under Test (SUT) โ โ Application
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
```
#### Page Object Model (POM) ์์
```typescript
// Good POM Structure
export class ProjectsPage {
private page: Page;
// Locators (centralized)
private get createButton() {
return this.page.locator('[data-testid="create-project-btn"]');
}
// Actions (high-level methods)
async createProject(data: ProjectData) {
await this.createButton.click();
await this.fillForm(data);
await this.submit();
}
// Assertions (expected behaviors)
async expectProjectCreated(name: string) {
await expect(this.page.locator(`text=${name}`)).toBeVisible();
}
}
```
### 2. CI/CD ํตํฉ
#### GitHub Actions ์์
```yaml
# .github/workflows/test.yml
name: Test Suite
on: [push, pull_request]
jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- uses: actions/setup-node@v3
- name: Install dependencies
run: npm ci
- name: Run unit tests
run: npm run test:unit
- name: Run E2E tests
run: npm run test:e2e
- name: Upload test results
uses: actions/upload-artifact@v3
with:
name: playwright-report
path: playwright-report/
```
### 3. Test Data Management
```typescript
// Fixture Management
export const testUsers = {
researcher: {
email: 'researcher@test.com',
password: 'test123',
role: 'RESEARCHER',
},
admin: {
email: 'admin@test.com',
password: 'admin123',
role: 'ADMIN',
},
};
// Database Seeding
export async function seedTestData() {
await db.users.createMany(testUsers);
await db.projects.createMany(testProjects);
}
// Cleanup
export async function cleanupTestData() {
await db.projects.deleteMany();
await db.users.deleteMany();
}
```
---
## ๋๋ฉ์ธ ์ง์
### 1. ์น ๊ธฐ์ ์คํ ์ดํด
#### Frontend
```markdown
โ
ํ์ ์ง์:
- HTML/CSS/JavaScript ๊ธฐ๋ณธ
- React/Vue/Angular ํ๋ ์์ํฌ
- State management (Redux, Zustand)
- Routing (React Router)
- HTTP/REST API
- WebSockets
- Browser DevTools
```
#### Backend
```markdown
โ
ํ์ ์ง์:
- Node.js/Express or Python/Django
- RESTful API ์ค๊ณ
- Database (SQL/NoSQL)
- Authentication (JWT, OAuth)
- Middleware & Error handling
```
### 2. ๋๋ฉ์ธ ํนํ ์ง์ ์์
**Healthcare (์๋ฃ)**
- HIPAA ๊ท์ , PHI ๋ณดํธ
- HL7/FHIR ํ์ค
- ์์ ์ํฌํ๋ก์ฐ
**Finance (๊ธ์ต)**
- PCI DSS ์ค์
- ๊ฑฐ๋ ๋ฌด๊ฒฐ์ฑ
- ๊ฐ์ฌ ๋ก๊ทธ
**E-commerce (์ ์์๊ฑฐ๋)**
- ๊ฒฐ์ ํ๋ก์ธ์ค (PG ์ฐ๋)
- ์ฅ๋ฐ๊ตฌ๋ ๋์
- ์ฌ๊ณ ๊ด๋ฆฌ
---
## ์ํํธ ์คํฌ
### 1. ๋ฌธ์ ๋ฐ๊ฒฌ ํ๋
> "์ค๋ ๋ฌด์์ ๋ถ์ ์ ์์๊น?" - NRC (๋ฏธ๊ตญ ์์๋ ฅ๊ท์ ์์ํ)
#### ํ
์คํฐ์ ๋ง์ธ๋์
```markdown
โ
World-Class Tester ํ๋:
- ํธ๊ธฐ์ฌ: "๋ง์ฝ ~ํ๋ฉด ์ด๋ป๊ฒ ๋ ๊น?"
- ๋นํ์ ์ฌ๊ณ : "์ ๋ง ์ด๊ฒ์ด ์ฌ๋ฐ๋ฅธ๊ฐ?"
- ์ฐฝ์์ฑ: "์ด๋ป๊ฒ ์ด ๊ธฐ๋ฅ์ ๋ง๊ฐ๋จ๋ฆด ์ ์์๊น?"
- ๋๊ธฐ: "์ด ๋ฒ๊ทธ์ ๊ทผ๋ณธ ์์ธ์ ์ฐพ์ ๋๊น์ง"
- ๊ณต๊ฐ: "์ฌ์ฉ์ ์
์ฅ์์ ์๊ฐํ๊ธฐ"
```
### 2. ์ปค๋ฎค๋์ผ์ด์
#### ํจ๊ณผ์ ์ธ ๋ฒ๊ทธ ๋ฆฌํฌํธ
```
โ Bad:
"๋ก๊ทธ์ธ ์ ๋จ"
โ
Good:
"Chrome 120์์ researcher ๊ณ์ ์ผ๋ก ๋ก๊ทธ์ธ ์
๋น๋ฐ๋ฒํธ ํ๋์ ํน์๋ฌธ์ ํฌํจ ์ 500 ์๋ฌ ๋ฐ์.
์ฌํ์จ 100%. [์คํฌ๋ฆฐ์ท] [Console ๋ก๊ทธ]"
```
#### ๊ฐ๋ฐ์์์ ํ์
```markdown
โ
ํ์
Best Practices:
- ๊ณต๊ฒฉ์ X โ ๊ฑด์ค์ ํผ๋๋ฐฑ O
- "๋น์ ์ฝ๋ ๋ฒ๊ทธ ์์ด์" X
- "์ด ์๋๋ฆฌ์ค์์ ์ด๋ฐ ๋์์ด ๋ฐ์ํ๋๋ฐ,
์๋ํ ๊ฒ์ธ๊ฐ์?" O
- ์ฌํ ๋จ๊ณ ๋ช
ํํ ์ ๊ณต
- ์ฐ์ ์์ ํฉ๋ฆฌ์ ์ ์
```
### 3. ์ง์์ ํ์ต
```markdown
โ
ํ์ต ๋ฃจํด:
- ์ฃผ 1ํ: ์ ํ
์คํธ ๋๊ตฌ/๊ธฐ๋ฒ ์ฐ๊ตฌ
- ์ 1ํ: ํ
์คํธ ์ปจํผ๋ฐ์ค/์จ๋น๋ ์ฐธ์ฌ
- ๋ถ๊ธฐ 1ํ: ์คํ์์ค ํ
์คํธ ํ๋ก์ ํธ ๊ธฐ์ฌ
- ์ฐ 1ํ: ํ
์คํธ ์๊ฒฉ์ฆ ์ทจ๋ (ISTQB ๋ฑ)
```
---
## ํ์ง ๋ฉํธ๋ฆญ & KPI
### 1. ํ
์คํธ ๋ฉํธ๋ฆญ
| ์งํ | ์ค๋ช
| ๋ชฉํ |
|------|------|------|
| **Test Coverage** | ์ฝ๋ ๋ผ์ธ ์ปค๋ฒ๋ฆฌ์ง | >80% |
| **Defect Detection Rate** | ๋ฐ๊ฒฌํ ๊ฒฐํจ ๋น์จ | >90% |
| **Test Execution Time** | ํ๊ท ์คํ ์๊ฐ | <30๋ถ (E2E) |
| **Flaky Test Rate** | ๋ถ์์ ํ ํ
์คํธ ๋น์จ | <5% |
| **Automation Rate** | ์๋ํ๋ ํ
์คํธ ๋น์จ | >70% |
### 2. ํ์ง ์งํ
```typescript
// ํ์ง ๋์๋ณด๋ ์์
interface QualityMetrics {
testCoverage: number; // 85%
passRate: number; // 98%
avgExecutionTime: number; // 25 minutes
defectsFound: number; // 23
defectsFixed: number; // 20
p0Blockers: number; // 0
technicalDebt: number; // 5 items
}
```
### 3. ๋ฆด๋ฆฌ์ค ํ์ง ๊ธฐ์ค
```markdown
โ
Release Criteria:
- [ ] All P0/P1 tests pass (100%)
- [ ] No critical/high severity bugs open
- [ ] Code coverage >80%
- [ ] Performance benchmarks met
- [ ] Security scan clean
- [ ] Accessibility (WCAG 2.1 AA)
- [ ] Cross-browser tested
```
---
## ์ฑ์ฅ ๋ก๋๋งต
### Junior (0-2๋
) โ Mid (2-4๋
)
```markdown
โ
Focus Areas:
- [ ] ์๋ ํ
์คํธ ๋ง์คํฐ (๋ชจ๋ ํ์
)
- [ ] ๊ธฐ๋ณธ ์๋ํ ์คํฌ๋ฆฝํธ ์์ฑ
- [ ] Playwright/Cypress ์๋ จ
- [ ] API ํ
์คํธ (Postman/REST Assured)
- [ ] Git/CI ๊ธฐ๋ณธ ์ฌ์ฉ
- [ ] ๋ฒ๊ทธ ๋ฆฌํฌํธ ์์ฑ๋ฒ
๐ ํ์ต ์๋ฃ:
- Playwright University
- ISTQB Foundation ์๊ฒฉ์ฆ
- Test Automation University
```
### Mid (2-4๋
) โ Senior (4-7๋
)
```markdown
โ
Focus Areas:
- [ ] ํ
์คํธ ์ํคํ
์ฒ ์ค๊ณ
- [ ] Performance testing (k6/JMeter)
- [ ] Security testing (OWASP)
- [ ] CI/CD ํ์ดํ๋ผ์ธ ๊ตฌ์ถ
- [ ] Test strategy ์๋ฆฝ
- [ ] ์ฃผ๋์ด ๋ฉํ ๋ง
๐ ํ์ต ์๋ฃ:
- AWS Certified DevOps
- OWASP Certification
- Conference ๋ฐํ
```
### Senior (4-7๋
) โ Staff (7-10๋
)
```markdown
โ
Focus Areas:
- [ ] ์กฐ์ง ํ
์คํธ ์ ๋ต ์๋ฆฝ
- [ ] ํ
์คํธ ๋๊ตฌ ์ ์ ๋ฐ ๋์
- [ ] ํฌ๋ก์คํ ํ์
๋ฆฌ๋
- [ ] ํ
์คํธ ํ์คํ
- [ ] ์
๊ณ ์ปจํผ๋ฐ์ค ๋ฐํ
๐ ํ๋:
- ์คํ์์ค ํ๋ก์ ํธ ๋ฉ์ธํ
์ด๋
- ๊ธฐ์ ๋ธ๋ก๊ทธ ์ด์
- ํ
์คํธ ์ปค๋ฎค๋ํฐ ๋ฆฌ๋
```
---
## ๋๊ตฌ ์ฒดํฌ๋ฆฌ์คํธ
### ํ์ ๋๊ตฌ ์๋ จ๋
```markdown
โ
Level 2 (Mid):
- [ ] Playwright/Cypress (E2E)
- [ ] Vitest/Jest (Unit)
- [ ] Postman/Insomnia (API)
- [ ] Chrome DevTools
- [ ] Git/GitHub
- [ ] JIRA/Linear
โ
Level 3 (Senior):
- [ ] k6/JMeter (Performance)
- [ ] OWASP ZAP (Security)
- [ ] Docker (Testํ๊ฒฝ)
- [ ] GitHub Actions (CI/CD)
- [ ] Lighthouse (Performance)
- [ ] Accessibility tools (axe)
โ
Level 4 (Staff):
- [ ] Terraform (Infrastructure)
- [ ] Grafana/Prometheus (Monitoring)
- [ ] Custom test frameworks
- [ ] Test data generators
```
---
## ์ฐธ๊ณ ์๋ฃ
- **ISTQB**: International Software Testing Qualifications Board
- **NRC**: Good Software Tester Characteristics
- **OWASP**: Web Security Testing Guide
- **Test Automation University**: Free courses
- **Playwright Documentation**: Modern E2E testing
---
**๐ ๋ค์ ๋ฌธ์**: [Tester Usage Guide](TESTER_USAGE_GUIDE.md)