mcpField
G
generating-unit-tests

generating-unit-tests

github.com/jeremylongshoreテスト・品質2.9k45 回インストール2 日前に更新
リポジトリ

generating-unit-tests について

generating-unit-tests はソースコードを分析し、複数の言語やテストフレームワーク向けにユニットテストを生成するスキルです。テストの実行とカバレッジ確認を行い、残る不足箇所も報告します。

主な機能

  1. 01テストのないソースファイルを特定
  2. 02正常系と境界値のテストを生成
  3. 03外部依存のモックを作成
  4. 04テスト実行とカバレッジ確認
  5. 05不足箇所と追加テスト案を報告

活用シーン

  1. 01未テストの関数にテストを追加
  2. 02エラー条件や境界値を検証
  3. 03テスト対象モジュールのカバレッジ不足を確認

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/jeremylongshore/tons-of-skills-marketplace --skill generating-unit-tests

インストール後、Claude Code で/generating-unit-testsを入力して読み込まれたか確認します。

同梱ファイル

SKILL.md と一緒にインストールされる参考資料やスクリプト。

assets/
README.md
references/
README.md
scripts/
README.md

詳細

単体テストジェネレーター

概要

ソースコードの分析から、正常系、エッジケース、境界条件、エラー処理を網羅する単体テストを自動生成します。Jest、Vitest、Mocha(JavaScript/TypeScript)、pytest(Python)、JUnit 5(Java)、および testify を使った Go testing に対応しています。

前提条件

  • テストフレームワークがインストールされ、設定されている(jest、vitest、pytest、junit-jupiter、または Go の testing)
  • 関数シグネチャ、型注釈、または JSDoc コメントが明確なソースコード
  • テストディレクトリ構成が整備されている(__tests__/、tests/、spec/、または *_test.go)
  • モックライブラリが利用可能である(jest.mock、unittest.mock、Mockito、または gomock)
  • テスト実行用のパッケージスクリプトが設定されている(npm test、pytest、go test)

手順

  1. Glob でコードベースをスキャンし、対応するテストファイルがないソースファイルを特定します(例:__tests__/parser.test.ts がない src/utils/parser.ts)。
  2. テストされていない各ソースファイルを読み、以下を抽出します。
    • シグネチャを含む、エクスポートされたすべての関数とクラスメソッド。
    • パラメーター型、戻り値型、スローされる例外。
    • 外部依存関係(他のモジュール、サードパーティライブラリ、I/O からのインポート)。
    • 純粋関数か不純関数かの分類。
  3. 各関数について、以下のカテゴリのテストケースを生成します。
    • 正常系:期待される出力を生成する有効な入力(少なくとも 2 ケース)。
    • エッジケース:空文字列、空配列、0、負の数、null、undefined、最大値。
    • エラー条件:無効な型、必須フィールドの欠落、ネットワーク障害、権限エラー。
    • 境界値:オフバイワン、整数オーバーフロー、文字列の長さ制限。
  4. すべての外部依存関係に対するモック宣言を作成します。
    • データベース呼び出しは予測可能なフィクスチャデータを返すようにします。
    • HTTP クライアントは、設定可能なステータスコードで用意されたレスポンスを返すようにします。
    • ファイルシステム操作には、メモリ内バッファーまたは一時ディレクトリを使用します。
  5. プロジェクトの規約に従ってテストファイルを作成します。
    • 既存のテストファイルの命名パターン(*.test.ts、*.spec.js、test_*.py)に合わせます。
    • 関数名ごとに describe/context ブロックでテストをグループ化します。
    • セットアップと後処理には beforeEach/afterEach を使用します。
    • 自明でないテストの根拠を説明するインラインコメントを含めます。
  6. 生成したテストを実行してパスすることを確認し、カバレッジをチェックして対象関数が完全に実行されていることを確認します。
  7. カバレッジの不足箇所を報告し、未実行の分岐に対する追加テストケースを提案します。

出力

  • ソースファイルと同じ場所、またはプロジェクトのテストディレクトリに配置されたテストファイル
  • 外部依存関係用のモック/スタブファイル
  • テスト対象モジュールの行、分岐、関数のカバレッジを示すカバレッジレポート
  • 残りのカバレッジ不足箇所と、提案するテストケースの一覧

エラー処理

エラー原因解決策
インポート時の Cannot find moduleテストファイルのパスがプロジェクトのモジュール解決方法と一致していないtsconfig.json のパスと、Jest 設定の moduleNameMapper を確認します
モックが呼び出しをインターセプトしないモジュールのインポート後にモックを定義したため、実際の実装がキャッシュされているすべてのインポートより前に、ファイルの先頭で jest.mock() を呼び出します
非同期テストのタイムアウトawait の欠落、または未処理の拒否により Promise が解決されない非同期呼び出しの前に await を追加します。jest.setTimeout() でタイムアウトを延長します
テスト単体ではパスするが、まとめて実行すると失敗するテスト間で共有される変更可能な状態が漏れているafterEach で状態をリセットします。モジュールレベルの変数を避け、jest.isolateModules() を使用します
初回実行時のスナップショット不一致既存のスナップショットのベースラインがない初回実行時に --updateSnapshot を指定して、ベースラインを作成します

例

文字列ユーティリティの Jest テスト:

import { slugify } from '../src/utils/slugify';

describe('slugify', () => {
  it('converts spaces to hyphens', () => {
    expect(slugify('hello world')).toBe('hello-world');
  });
  it('lowercases all characters', () => {
    expect(slugify('Hello World')).toBe('hello-world');
  });
  it('removes special characters', () => {
    expect(slugify('hello@world!')).toBe('helloworld');
  });
  it('handles empty string', () => {
    expect(slugify('')).toBe('');
  });
  it('trims leading and trailing whitespace', () => {
    expect(slugify('  spaced  ')).toBe('spaced');
  });
});

データバリデーターの pytest テスト:

import pytest
from myapp.validators import validate_email

class TestValidateEmail:
    def test_accepts_valid_email(self):
        assert validate_email("[email protected]") is True

    def test_rejects_missing_at_sign(self):
        assert validate_email("userexample.com") is False

    def test_rejects_empty_string(self):
        assert validate_email("") is False

    def test_rejects_none(self):
        with pytest.raises(TypeError):
            validate_email(None)

Resources

コメント