π νΈμΆ μ λ©μμ§: μ΄ Skillμ΄ νΈμΆλλ©΄ λ°λμ
[SEMO] Skill: write-testμμ€ν λ©μμ§λ₯Ό 첫 μ€μ μΆλ ₯νμΈμ.
write-test Skill
ν μ€νΈ μ½λ μμ± λ° μ€ν μλν
μν λ²μ
| μ΄ μ€ν¬μμ μ²λ¦¬ | λ€λ₯Έ μ€ν¬μμ μ²λ¦¬ |
|-----------------|-------------------|
| β
ν
μ€νΈ μ½λ μμ± | β QA ν
μ€ν° ν λΉ β change-to-testing |
| β
ν
μ€νΈ μ€ν | β νλ‘μ νΈ λ³΄λ μν λ³κ²½ β change-to-testing |
| β
컀λ²λ¦¬μ§ νμΈ | β Slack ν
μ€νΈ μμ² μλ¦Ό β request-test |
Workflow
ν μ€νΈ μ½λ μμ±
- ν μ€νΈ λμ νμΌ/ν¨μ λΆμ
- ν μ€νΈ μΌμ΄μ€ μ€κ³
- ν μ€νΈ μ½λ μμ±
- ν μ€νΈ μ€ν λ° κ²°κ³Ό νμΈ
ν μ€νΈ μ€ν
# μ 체 ν
μ€νΈ
npm test
# νΉμ νμΌ
npm test -- {test_file}
# 컀λ²λ¦¬μ§
npm test -- --coverage
ν μ€νΈ νμΌ μμΉ κ·μΉ
| νλ‘μ νΈ μ ν | ν
μ€νΈ νμΌ μμΉ |
|--------------|-----------------|
| Next.js | __tests__/ λλ *.test.ts(x) |
| Node.js | test/ λλ *.spec.ts |
| React | *.test.tsx (μ»΄ν¬λνΈμ λμΌ λλ ν 리) |
ν μ€νΈ μ νλ³ μμ± κ°μ΄λ
Unit Test
describe('ν¨μλͺ
', () => {
it('should μμ λμ', () => {
// Arrange
const input = ...;
// Act
const result = fn(input);
// Assert
expect(result).toBe(expected);
});
});
Integration Test
describe('API μλν¬μΈνΈ', () => {
it('should return 200 OK', async () => {
const response = await request(app)
.get('/api/resource')
.expect(200);
expect(response.body).toHaveProperty('data');
});
});
E2E Test (Playwright)
test('μ¬μ©μ μλ리μ€', async ({ page }) => {
await page.goto('/');
await page.click('button[data-testid="login"]');
await expect(page.locator('h1')).toContainText('Dashboard');
});
μΆλ ₯ νμ
ν μ€νΈ μμ± μλ£
[SEMO] Skill: write-test β ν
μ€νΈ μμ± μλ£
π νμΌ: {test_file_path}
β
ν
μ€νΈ μΌμ΄μ€: {count}κ°
π 컀λ²λ¦¬μ§: {coverage}%
ν μ€νΈ μ€ν κ²°κ³Ό
[SEMO] Skill: write-test β ν
μ€νΈ μ€ν μλ£
β
Passed: {pass_count}
β Failed: {fail_count}
β±οΈ μμ μκ°: {duration}
π΄ Post-Action: 체μ΄λ ν둬ννΈ (NON-NEGOTIABLE)
β οΈ ν μ€νΈ μμ± μλ£ ν λ°λμ λ€μ λ¨κ³λ₯Ό νμΈν©λλ€.
체μ΄λ νλ‘μ°
skill:write-test μλ£
β
ββ "λ€μ λ¨κ³" ν둬ννΈ
β
ββ "κ²μ¦ν΄μ€" β skill:quality-gate
β β
β ββ "컀λ°ν΄μ€" β skill:git-workflow
β
ββ "컀λ°ν΄μ€" β skill:git-workflow (κ²μ¦ 건λλ)
μλ£ μ μΆλ ₯
[SEMO] Skill: write-test β ν
μ€νΈ μμ± μλ£
π νμΌ: {test_file_path}
β
ν
μ€νΈ μΌμ΄μ€: {count}κ°
π 컀λ²λ¦¬μ§: {coverage}%
---
π‘ **λ€μ λ¨κ³**:
- "κ²μ¦ν΄μ€" β skill:quality-gate νΈμΆ
- "컀λ°ν΄μ€" β skill:git-workflow νΈμΆ
- "μλ" β λκΈ°
μ¬μ©μ μλ΅λ³ λμ
| μ¬μ©μ μλ΅ | λμ |
|------------|------|
| "κ²μ¦ν΄μ€" | skill:quality-gate νΈμΆ |
| "컀λ°ν΄μ€" | skill:git-workflow νΈμΆ |
| "νΈμκΉμ§ ν΄μ€" | skill:git-workflow νΈμΆ (push ν¬ν¨) |
| "μλ", "κ³μ" | μΆκ° μμ
λκΈ° |
QA ν μ€νΈ μμ²μ΄ νμν κ²½μ°
μ΄ μ€ν¬μ μ½λ ν μ€νΈλ§ λ΄λΉν©λλ€. QA νλ‘μΈμ€λ λ³λ μ€ν¬μ μ¬μ©νμΈμ.
"ν
μ€νΈ μμ²ν΄μ€", "QAμκ² μλ €μ€"
β
ββ μν λ³κ²½ + QA ν λΉμ΄ νμνλ©΄
β ββ skill:change-to-testing (ops/qa)
β
ββ Slack μλ¦Όλ§ νμνλ©΄
ββ skill:request-test (biz/management)