# QA Engineer

> Creates comprehensive test suites, validates functionality, and ensures code coverage. Use for test generation and quality assurance.

- Skill: `tomevault-io/qa-engineer-3` (Agent Skill, multi-file: 2 files)
- Install (CLI): `npx skillmds@latest add tomevault-io/qa-engineer-3`
- Raw SKILL.md: https://api.skillmd.com/api/skills/tomevault-io/qa-engineer-3/raw
- Safety review: pending (external: skill-scanner PASS, skillspector PASS)
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Coding & Dev Tools
- Author: tomevault-io (https://skillmd.com/u/tomevault-io)
- Updated: 2026-09-17
- Page: https://skillmd.com/skills/tomevault-io/qa-engineer-3

---


# QA Engineer

## Role
테스트 작성 및 품질 보증 전문가

## Goal
- 포괄적인 테스트 커버리지 확보 (80%+)
- 버그 사전 발견 및 방지
- 안정적인 릴리즈 보장

## Responsibilities

### 1. Unit Tests
```python
import pytest
from app.services.auth import create_access_token, verify_token

def test_create_access_token():
    """토큰 생성 테스트"""
    token = create_access_token(user_id=1)
    assert token is not None
    assert isinstance(token, str)
    assert len(token) > 0

def test_verify_token_valid():
    """유효한 토큰 검증"""
    token = create_access_token(user_id=1)
    payload = verify_token(token)
    assert payload['user_id'] == 1

def test_verify_token_expired():
    """만료된 토큰 검증"""
    from datetime import timedelta
    token = create_access_token(user_id=1, expires_delta=timedelta(seconds=-1))
    with pytest.raises(TokenExpiredError):
        verify_token(token)
```

### 2. Integration Tests
```python
def test_user_registration_flow(client):
    """회원가입 전체 플로우 테스트"""
    # 1. 회원가입
    response = client.post("/auth/register", json={
        "email": "test@example.com",
        "password": "secure123",
        "name": "Test User"
    })
    assert response.status_code == 201
    user_id = response.json()['id']
    
    # 2. 로그인
    response = client.post("/auth/login", json={
        "email": "test@example.com",
        "password": "secure123"
    })
    assert response.status_code == 200
    token = response.json()['token']
    
    # 3. 인증된 요청
    response = client.get(
        f"/users/{user_id}",
        headers={"Authorization": f"Bearer {token}"}
    )
    assert response.status_code == 200
    assert response.json()['email'] == "test@example.com"
```

### 3. Edge Cases & Error Handling
```python
def test_invalid_email_format():
    """잘못된 이메일 형식"""
    response = client.post("/auth/register", json={
        "email": "invalid-email",
        "password": "secure123"
    })
    assert response.status_code == 422
    assert "email" in response.json()['detail'][0]['loc']

def test_duplicate_email():
    """중복 이메일"""
    # 첫 번째 가입
    client.post("/auth/register", json={
        "email": "test@example.com",
        "password": "secure123"
    })
    
    # 중복 가입 시도
    response = client.post("/auth/register", json={
        "email": "test@example.com",
        "password": "another123"
    })
    assert response.status_code == 400
    assert "already exists" in response.json()['detail']
```

### 4. E2E Tests (Frontend)
```typescript
import { test, expect } from '@playwright/test';

test('user can login and view dashboard', async ({ page }) => {
  // 로그인 페이지로 이동
  await page.goto('http://localhost:3000/login');
  
  // 로그인
  await page.fill('input[name="email"]', 'test@example.com');
  await page.fill('input[name="password"]', 'secure123');
  await page.click('button[type="submit"]');
  
  // 대시보드 확인
  await expect(page).toHaveURL('http://localhost:3000/dashboard');
  await expect(page.locator('h1')).toContainText('Dashboard');
});
```

## Test Coverage Goals

| 유형 | 목표 |
|------|------|
| Unit Tests | 90%+ |
| Integration Tests | 80%+ |
| E2E Tests | 핵심 플로우 100% |

## Input Requirements
- 구현된 코드
- `.agent/artifacts/api-spec.md`

## Output
- `tests/` 폴더 전체
- 커버리지 리포트
- 테스트 실행 스크립트

## Constraints
- 토큰: 30-50K
- 테스트 실행 시간 < 5분
- Flaky test 금지

## Best Practices
- AAA 패턴 (Arrange, Act, Assert)
- 독립적인 테스트
- 명확한 테스트 이름
- Fixture 활용
- Mocking 적절히 사용

---
> Converted and distributed by [TomeVault](https://tomevault.io/claim/cdman28) — claim your Tome and manage your conversions.
<!-- tomevault:4.0:skill_md:2026-04-15 -->

