generating-unit-tests について
generating-unit-tests はソースコードを分析し、複数の言語やテストフレームワーク向けにユニットテストを生成するスキルです。テストの実行とカバレッジ確認を行い、残る不足箇所も報告します。
主な機能
- 01テストのないソースファイルを特定
- 02正常系と境界値のテストを生成
- 03外部依存のモックを作成
- 04テスト実行とカバレッジ確認
- 05不足箇所と追加テスト案を報告
活用シーン
- 01未テストの関数にテストを追加
- 02エラー条件や境界値を検証
- 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.mdreferences/README.mdscripts/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)
手順
- Glob でコードベースをスキャンし、対応するテストファイルがないソースファイルを特定します(例:
__tests__/parser.test.tsがないsrc/utils/parser.ts)。 - テストされていない各ソースファイルを読み、以下を抽出します。
- シグネチャを含む、エクスポートされたすべての関数とクラスメソッド。
- パラメーター型、戻り値型、スローされる例外。
- 外部依存関係(他のモジュール、サードパーティライブラリ、I/O からのインポート)。
- 純粋関数か不純関数かの分類。
- 各関数について、以下のカテゴリのテストケースを生成します。
- 正常系:期待される出力を生成する有効な入力(少なくとも 2 ケース)。
- エッジケース:空文字列、空配列、0、負の数、
null、undefined、最大値。 - エラー条件:無効な型、必須フィールドの欠落、ネットワーク障害、権限エラー。
- 境界値:オフバイワン、整数オーバーフロー、文字列の長さ制限。
- すべての外部依存関係に対するモック宣言を作成します。
- データベース呼び出しは予測可能なフィクスチャデータを返すようにします。
- HTTP クライアントは、設定可能なステータスコードで用意されたレスポンスを返すようにします。
- ファイルシステム操作には、メモリ内バッファーまたは一時ディレクトリを使用します。
- プロジェクトの規約に従ってテストファイルを作成します。
- 既存のテストファイルの命名パターン(
*.test.ts、*.spec.js、test_*.py)に合わせます。 - 関数名ごとに
describe/contextブロックでテストをグループ化します。 - セットアップと後処理には
beforeEach/afterEachを使用します。 - 自明でないテストの根拠を説明するインラインコメントを含めます。
- 既存のテストファイルの命名パターン(
- 生成したテストを実行してパスすることを確認し、カバレッジをチェックして対象関数が完全に実行されていることを確認します。
- カバレッジの不足箇所を報告し、未実行の分岐に対する追加テストケースを提案します。
出力
- ソースファイルと同じ場所、またはプロジェクトのテストディレクトリに配置されたテストファイル
- 外部依存関係用のモック/スタブファイル
- テスト対象モジュールの行、分岐、関数のカバレッジを示すカバレッジレポート
- 残りのカバレッジ不足箇所と、提案するテストケースの一覧
エラー処理
| エラー | 原因 | 解決策 |
|---|---|---|
インポート時の 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
- Jest documentation: https://jestjs.io/docs/getting-started
- Vitest documentation: https://vitest.dev/guide/
- pytest documentation: https://docs.pytest.org/
- JUnit 5 User Guide: https://junit.org/junit5/docs/current/user-guide/
- Go testing package: https://pkg.go.dev/testing
- AAA pattern (Arrange-Act-Assert):
コメント
Markdown 対応