Agent Skills: write-test Skill

|

UncategorizedID: semicolon-devteam/semo/write-test

Install this agent skill to your local

pnpm dlx add-skill https://github.com/semicolon-devteam/semo/tree/HEAD/semo-system/semo-skills/write-test

Skill Files

Browse the full folder contents for write-test.

Download Skill

Loading file tree…

semo-system/semo-skills/write-test/SKILL.md

Skill Metadata

Name
write-test
Description
|

πŸ”” 호좜 μ‹œ λ©”μ‹œμ§€: 이 Skill이 호좜되면 λ°˜λ“œμ‹œ [SEMO] Skill: write-test μ‹œμŠ€ν…œ λ©”μ‹œμ§€λ₯Ό 첫 쀄에 좜λ ₯ν•˜μ„Έμš”.

write-test Skill

ν…ŒμŠ€νŠΈ μ½”λ“œ μž‘μ„± 및 μ‹€ν–‰ μžλ™ν™”

μ—­ν•  λ²”μœ„

| 이 μŠ€ν‚¬μ—μ„œ 처리 | λ‹€λ₯Έ μŠ€ν‚¬μ—μ„œ 처리 | |-----------------|-------------------| | βœ… ν…ŒμŠ€νŠΈ μ½”λ“œ μž‘μ„± | ❌ QA ν…ŒμŠ€ν„° ν• λ‹Ή β†’ change-to-testing | | βœ… ν…ŒμŠ€νŠΈ μ‹€ν–‰ | ❌ ν”„λ‘œμ νŠΈ λ³΄λ“œ μƒνƒœ λ³€κ²½ β†’ change-to-testing | | βœ… 컀버리지 확인 | ❌ Slack ν…ŒμŠ€νŠΈ μš”μ²­ μ•Œλ¦Ό β†’ request-test |

Workflow

ν…ŒμŠ€νŠΈ μ½”λ“œ μž‘μ„±

  1. ν…ŒμŠ€νŠΈ λŒ€μƒ 파일/ν•¨μˆ˜ 뢄석
  2. ν…ŒμŠ€νŠΈ μΌ€μ΄μŠ€ 섀계
  3. ν…ŒμŠ€νŠΈ μ½”λ“œ μž‘μ„±
  4. ν…ŒμŠ€νŠΈ μ‹€ν–‰ 및 κ²°κ³Ό 확인

ν…ŒμŠ€νŠΈ μ‹€ν–‰

# 전체 ν…ŒμŠ€νŠΈ
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)

References