# Test Generator

> ユニットテスト・統合テストのコード生成。 テストケース設計、モック作成、カバレッジ向上支援。 テスト作成、テストコード生成、TDD実践時に使用。

- Skill: `atomic-kanta-sasaki/test-generator` (Agent Skill)
- Install (CLI): `npx skillmds@latest add atomic-kanta-sasaki/test-generator`
- Raw SKILL.md: https://api.skillmd.com/api/skills/atomic-kanta-sasaki/test-generator/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Coding & Dev Tools
- Author: atomic-kanta-sasaki (https://skillmd.com/u/atomic-kanta-sasaki)
- Updated: 2026-09-22
- Page: https://skillmd.com/skills/atomic-kanta-sasaki/test-generator

---


# Test Generator Skill

## Overview
品質の高いテストコードを生成します。

## Test Design Principles

### 1. テスト構造（AAA パターン）
```
Arrange（準備）: テストデータとモックの設定
Act（実行）: テスト対象の実行
Assert（検証）: 結果の確認
```

### 2. テストケース設計

#### 正常系
- 典型的な入力での動作
- 境界値（最小値、最大値）
- 空のコレクション、null許容

#### 異常系
- 無効な入力
- 認証・認可エラー
- 外部サービスエラー
- タイムアウト

#### エッジケース
- 並行処理
- 大量データ
- 特殊文字、Unicode

### 3. モック戦略
- 外部サービス（API、DB）はモック
- ビジネスロジックはモックしない
- モックの検証（呼び出し回数、引数）

### 4. 命名規則
```
test_[対象]_[条件]_[期待結果]

例:
test_create_user_with_valid_data_returns_user
test_create_user_with_duplicate_email_raises_error
```

## Framework Templates

### Python (pytest)
```python
import pytest
from unittest.mock import Mock, patch

class TestUserService:
    @pytest.fixture
    def user_service(self):
        """テスト対象のセットアップ"""
        return UserService()
    
    @pytest.fixture
    def mock_db(self):
        """DBモック"""
        return Mock()
    
    def test_create_user_with_valid_data_returns_user(
        self, user_service, mock_db
    ):
        # Arrange
        user_data = {"name": "Test", "email": "test@example.com"}
        mock_db.save.return_value = {"id": 1, **user_data}
        
        # Act
        result = user_service.create_user(user_data)
        
        # Assert
        assert result["id"] == 1
        assert result["name"] == "Test"
        mock_db.save.assert_called_once()
    
    def test_create_user_with_duplicate_email_raises_error(
        self, user_service, mock_db
    ):
        # Arrange
        user_data = {"name": "Test", "email": "existing@example.com"}
        mock_db.save.side_effect = DuplicateError("Email exists")
        
        # Act & Assert
        with pytest.raises(DuplicateError):
            user_service.create_user(user_data)
```

### TypeScript (Jest)
```typescript
import { UserService } from './user-service';

describe('UserService', () => {
  let userService: UserService;
  let mockDb: jest.Mocked<Database>;

  beforeEach(() => {
    mockDb = {
      save: jest.fn(),
      find: jest.fn(),
    };
    userService = new UserService(mockDb);
  });

  describe('createUser', () => {
    it('should return user when data is valid', async () => {
      // Arrange
      const userData = { name: 'Test', email: 'test@example.com' };
      mockDb.save.mockResolvedValue({ id: '1', ...userData });

      // Act
      const result = await userService.createUser(userData);

      // Assert
      expect(result.id).toBe('1');
      expect(mockDb.save).toHaveBeenCalledWith(userData);
    });

    it('should throw error when email is duplicate', async () => {
      // Arrange
      mockDb.save.mockRejectedValue(new DuplicateError());

      // Act & Assert
      await expect(userService.createUser({}))
        .rejects.toThrow(DuplicateError);
    });
  });
});
```

## Coverage Goals
- ステートメントカバレッジ: 80%以上
- ブランチカバレッジ: 70%以上
- クリティカルパス: 100%

