mcpField
T
test-generator

test-generator

github.com/alirezarezvaniテスト・品質78236 回インストール35 週間前に更新
リポジトリ

test-generator について

test-generatorは、新しい関数やコンポーネントの作成時に基本的なテストを用意するコーディングスキルです。プロジェクトのテストフレームワークを検出し、包括的なテストや統合テストは@test-engineerに委ねます。

主な機能

  1. 01テストの自動提案
  2. 02基本ケースとエッジケースのテスト作成
  3. 03プロジェクトのテストフレームワーク検出
  4. 04Jest、Vitest、Mocha、pytest、unittest、JUnit、Go testingに対応

活用シーン

  1. 01新しい関数のテスト作成
  2. 02新しいコンポーネントの基本テスト追加
  3. 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(サブエージェント): 包括的なテスト戦略

ワークフロー
  1. 関数を作成します
  2. 私が基本的なテスト構造を自動生成します
  3. テストスイート全体が必要になったら → @test-engineer サブエージェントを呼び出します
  4. サブエージェントが包括的なテストを作成します

例

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

ヒント

  1. まずスキャフォールディングを作成させる - サブエージェントを呼び出す前に確認してください
  2. TODO を追加する - 複雑なケースには TODO コメントを含めます
  3. フレームワークの一貫性 - プロジェクトのテストスタイルに合わせます
  4. 素早く反復する - 満足できない場合は再生成してください

関連ツール

  • @test-engineer:包括的なテストスイートの作成
  • code-reviewer skill:テストが必要なコードを指摘
  • /test-gen command:テスト生成の全ワークフロー

コメント