test-generator について
test-generatorは、新しい関数やコンポーネントの作成時に基本的なテストを用意するコーディングスキルです。プロジェクトのテストフレームワークを検出し、包括的なテストや統合テストは@test-engineerに委ねます。
主な機能
- 01テストの自動提案
- 02基本ケースとエッジケースのテスト作成
- 03プロジェクトのテストフレームワーク検出
- 04Jest、Vitest、Mocha、pytest、unittest、JUnit、Go testingに対応
活用シーン
- 01新しい関数のテスト作成
- 02新しいコンポーネントの基本テスト追加
- 03テストファイルがない実装へのテスト作成
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ alirezarezvani/ claude-code-tresor --skill test-generatorインストール後、Claude Code で/test-generatorを入力して読み込まれたか確認します。
同梱ファイルREADME.md
詳細
テスト生成スキル
新しいコードを書くと、テストを自動で提案します。
有効になるタイミング
- ✅ 新しい関数を作成したとき
- ✅ 新しいコンポーネントを追加したとき
- ✅ ユーザーがテストについて言及したとき
- ✅ 実装に対応するテストファイルがないとき
- ✅ ユーザーが「これをテストしてもらえますか?」と尋ねたとき
生成する内容
テストの基本的なスキャフォールディング
- 基本的な正常系テスト
- null/undefined のエッジケース
- シンプルなエラーシナリオ
- フレームワークに適した構文(Jest/Vitest/Pytest)
対応しない内容
- 包括的なテストスイート → @test-engineer サブエージェントを使用
- 統合テスト → @test-engineer サブエージェントを使用
- E2E テストの設計 → @test-engineer サブエージェントを使用
- テスト戦略の計画 → @test-engineer サブエージェントを使用
@test-engineer サブエージェントとの関係
私(スキル): テストの基本的なスキャフォールディング @test-engineer(サブエージェント): 包括的なテスト戦略
ワークフロー
- 関数を作成します
- 私が基本的なテスト構造を自動生成します
- テストスイート全体が必要になったら → @test-engineer サブエージェントを呼び出します
- サブエージェントが包括的なテストを作成します
例
JavaScript 関数
// You write:
function calculateDiscount(price, percentage) {
if (price <= 0) throw new Error('Invalid price');
return price * (percentage / 100);
}
// I auto-generate:
describe('calculateDiscount', () => {
it('calculates discount correctly', () => {
expect(calculateDiscount(100, 10)).toBe(10);
});
it('throws error for invalid price', () => {
expect(() => calculateDiscount(0, 10)).toThrow('Invalid price');
});
it('handles zero percentage', () => {
expect(calculateDiscount(100, 0)).toBe(0);
});
// TODO: Add more edge cases
// Consider: negative percentages, decimal values, very large numbers
});
React コンポーネント
// You write:
function UserCard({ user, onEdit }) {
return (
<div className="user-card">
<h2>{user.name}</h2>
<button onClick={() => onEdit(user.id)}>Edit</button>
</div>
);
}
// I auto-generate:
import { render, screen, fireEvent } from '@testing-library/react';
describe('UserCard', () => {
const mockUser = { id: 1, name: 'John Doe' };
const mockOnEdit = jest.fn();
it('renders user name', () => {
render(<UserCard user={mockUser} onEdit={mockOnEdit} />);
expect(screen.getByText('John Doe')).toBeInTheDocument();
});
it('calls onEdit with user id when button clicked', () => {
render(<UserCard user={mockUser} onEdit={mockOnEdit} />);
fireEvent.click(screen.getByText('Edit'));
expect(mockOnEdit).toHaveBeenCalledWith(1);
});
// TODO: Add tests for edge cases
// - Missing user data
// - Undefined onEdit
// - Long names (UI testing)
});
Python 関数
# You write:
def fetch_user_data(user_id: int) -> dict:
if user_id <= 0:
raise ValueError("Invalid user ID")
return db.query("SELECT * FROM users WHERE id = ?", [user_id])
# I auto-generate:
import pytest
def test_fetch_user_data_success():
"""Test successful user data retrieval"""
result = fetch_user_data(1)
assert isinstance(result, dict)
assert 'id' in result
def test_fetch_user_data_invalid_id():
"""Test with invalid user ID"""
with pytest.raises(ValueError, match="Invalid user ID"):
fetch_user_data(0)
def test_fetch_user_data_negative_id():
"""Test with negative ID"""
with pytest.raises(ValueError):
fetch_user_data(-1)
# TODO: Add integration tests with database
# TODO: Test database connection failures
フレームワークの検出
使用しているテストフレームワークを自動で検出します。
- JavaScript/TypeScript:Jest、Vitest、Mocha
- Python:pytest、unittest
- Java:JUnit
- Go:testing パッケージ
検出は以下に基づいて行います。
- package.json の依存関係
- requirements.txt
- 既存のテストファイル
- インポート文
テストパターン
ユニットテスト
// Function testing
test('adds numbers correctly', () => {
expect(add(2, 3)).toBe(5);
});
コンポーネントテスト
// React component testing
test('button click triggers callback', () => {
const onClick = jest.fn();
render(<Button onClick={onClick} />);
fireEvent.click(screen.getByRole('button'));
expect(onClick).toHaveBeenCalled();
});
エッジケース
// Boundary testing
test('handles empty input', () => {
expect(processData([])).toEqual([]);
});
test('handles null input', () => {
expect(processData(null)).toBeNull();
});
サブエージェントを使用するタイミング
以下の場合は @test-engineer を呼び出してください。
- 完全なテストスイート(20 件以上のテスト)
- 統合テスト戦略
- E2E テストの計画
- テストカバレッジの目標
- 複雑なモックのシナリオ
例:
Me: "Generated 3 basic tests for calculateDiscount()"
You: "@test-engineer create comprehensive test suite with all edge cases"
Sub-agent: [Creates 25+ tests covering all scenarios]
サンドボックスとの互換性
サンドボックスなしで動作: ✅ はい サンドボックスありで動作: ✅ はい
- ファイルシステム:プロジェクトにテストファイルを書き込みます
- ネットワーク:不要です
- 設定:不要です
カスタマイズ
テストテンプレートを編集します。
cp -r ~/.claude/skills/development/test-generator \
~/.claude/skills/development/my-test-generator
# Edit SKILL.md to customize:
# - Test patterns
# - Framework preferences
# - Coverage expectations
コマンドとの連携
/test-gen コマンド
/test-gen --file utils.js --framework jest --coverage 90
# Combines:
# 1. My quick scaffolding
# 2. @test-engineer comprehensive tests
# 3. Full test file generation
ヒント
- まずスキャフォールディングを作成させる - サブエージェントを呼び出す前に確認してください
- TODO を追加する - 複雑なケースには TODO コメントを含めます
- フレームワークの一貫性 - プロジェクトのテストスタイルに合わせます
- 素早く反復する - 満足できない場合は再生成してください
関連ツール
- @test-engineer:包括的なテストスイートの作成
- code-reviewer skill:テストが必要なコードを指摘
- /test-gen command:テスト生成の全ワークフロー
コメント
Markdown 対応