| name | test-generator |
| description | ユニットテスト・統合テストのコード生成。
テストケース設計、モック作成、カバレッジ向上支援。
テスト作成、テストコード生成、TDD実践時に使用。
|
| version | 1.0.0 |
Test Generator Skill
Overview
品質の高いテストコードを生成します。
Test Design Principles
1. テスト構造(AAA パターン)
Arrange(準備): テストデータとモックの設定
Act(実行): テスト対象の実行
Assert(検証): 結果の確認
2. テストケース設計
正常系
- 典型的な入力での動作
- 境界値(最小値、最大値)
- 空のコレクション、null許容
異常系
- 無効な入力
- 認証・認可エラー
- 外部サービスエラー
- タイムアウト
エッジケース
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)
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
):
user_data = {"name": "Test", "email": "test@example.com"}
mock_db.save.return_value = {"id": 1, **user_data}
result = user_service.create_user(user_data)
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
):
user_data = {"name": "Test", "email": "existing@example.com"}
mock_db.save.side_effect = DuplicateError("Email exists")
with pytest.raises(DuplicateError):
user_service.create_user(user_data)
TypeScript (Jest)
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 () => {
const userData = { name: 'Test', email: 'test@example.com' };
mockDb.save.mockResolvedValue({ id: '1', ...userData });
const result = await userService.createUser(userData);
expect(result.id).toBe('1');
expect(mockDb.save).toHaveBeenCalledWith(userData);
});
it('should throw error when email is duplicate', async () => {
mockDb.save.mockRejectedValue(new DuplicateError());
await expect(userService.createUser({}))
.rejects.toThrow(DuplicateError);
});
});
});
Coverage Goals
- ステートメントカバレッジ: 80%以上
- ブランチカバレッジ: 70%以上
- クリティカルパス: 100%