tdd-workflows-tdd-red について
TDD のレッドフェーズ向けに、期待する動作を定義する失敗テストを生成するスキルです。新しい機能の実装開始や境界ケースの追加を行う開発者向けで、設定ミスではなく未実装の動作が原因の失敗かを確認します。
主な機能
- 01期待動作に基づく失敗テストの生成
- 02境界ケースとエラー処理のカバー
- 03既存のテストフレームワークの利用
- 04失敗原因と診断メッセージの確認
- 05テスト実行と検証手順の提示
活用シーン
- 01新機能の期待動作の定義
- 02実装前の境界ケースのカバー
- 03未実装の動作による失敗の確認
- 04テストデータの分離と外部依存の回避
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ sickn33/ agentic-awesome-skills --skill tdd-workflows-tdd-redインストール後、Claude Code で/tdd-workflows-tdd-redを入力して読み込まれたか確認します。
詳細
包括的な失敗するテストを、TDD のレッドフェーズの原則に従って作成します。
[拡張思考:test-automator エージェントを使用して、期待される動作を適切に定義する失敗するテストを生成します。]
このスキルを使用する場面
- 新しい動作の TDD レッドフェーズを始めるとき
- 期待される動作を捉えた失敗するテストが必要なとき
- 実装前にエッジケースを網羅したいとき
このスキルを使用しない場面
- グリーンフェーズまたはリファクタリングフェーズにいるとき
- パフォーマンスベンチマークだけが必要なとき
- 本番システムに対してテストを実行する必要があるとき
手順
- 動作、制約、エッジケースを特定します。
- 期待される結果を定義する失敗するテストを生成します。
- セットアップエラーではなく、動作の欠如が原因で失敗することを確認します。
- テストの実行方法と失敗の確認方法を記載します。
安全性
- テストデータを隔離し、本番環境を避けます。
- レッドフェーズでは不安定な外部依存関係を避けます。
役割
現在のプロジェクトのテストフレームワークと利用可能なツールを使用します。上流の Task/サブエージェントの種類はホスト固有であり、同梱されていません。また、委任が許可されるわけではありません。権限のある適合エージェントが存在しない場合は、テストを直接作成します。
プロンプトテンプレート
「次の内容について、包括的な失敗するテストを生成してください:$ARGUMENTS
主な要件
-
テスト構成
- フレームワークに適したセットアップ(Jest/pytest/JUnit/Go/RSpec)
- Arrange-Act-Assert パターン
- should_X_when_Y 形式の命名規則
- 相互依存のない隔離されたフィクスチャ
-
動作の網羅
- 正常系のシナリオ
- エッジケース(空、null、境界値)
- エラー処理と例外
- 並行アクセス(該当する場合)
-
失敗の検証
- テストは実行時に必ず失敗すること
- 正しい理由で失敗すること(構文/インポートエラーではない)
- 意味のある診断エラーメッセージ
- 連鎖的な失敗がないこと
-
テストカテゴリ
- ユニット:コンポーネントの分離された動作
- 統合:コンポーネント間の連携
- コントラクト:API/インターフェースのコントラクト
- プロパティ:数学的不変条件
フレームワークのパターン
JavaScript/TypeScript(Jest/Vitest)
- 依存関係を
vi.fn()またはjest.fn()でモックします - React コンポーネントには
@testing-libraryを使用します - プロパティテストには
fast-checkを使用します
Python(pytest)
- 適切なスコープのフィクスチャを使用します
- 複数のテストケースにはパラメーター化を使用します
- プロパティベースのテストには Hypothesis を使用します
Go
- サブテストを使ったテーブル駆動テスト
- 並列実行には
t.Parallel()を使用します - より簡潔なアサーションには
testify/assertを使用します
Ruby(RSpec)
- 遅延読み込みには
let、即時読み込みにはlet!を使用します - シナリオごとにコンテキストを使用します
- 共通の動作には共有例を使用します
品質チェックリスト
- 意図を明確に示す、読みやすいテスト名
- 1 つのテストにつき 1 つの動作
- 実装の詳細が漏れていないこと
- 意味のあるテストデータ(「foo」/「bar」ではない)
- テストが生きたドキュメントとして機能すること
避けるべきアンチパターン
- 最初からパスするテスト
- 動作ではなく実装をテストすること
- 複雑なセットアップコード
- 1 つのテストに複数の責務を持たせること
- 特定の詳細に依存する壊れやすいテスト
エッジケースのカテゴリ
- Null/空:undefined、null、空の文字列/配列/オブジェクト
- 境界値:最小値/最大値、単一要素、容量制限
- 特殊ケース:Unicode、空白、特殊文字
- 状態:無効な遷移、同時変更
- エラー:ネットワーク障害、タイムアウト、権限
出力要件
- インポートを含む完全なテストファイル
- テストの目的に関するドキュメント
- 失敗を実行・確認するコマンド
- 指標:テスト数、網羅する領域
- グリーンフェーズに向けた次のステップ」
検証
生成後:
- テストを実行し、失敗することを確認します
- 役立つ失敗メッセージであることを確認します
- テストの独立性を確認します
- 包括的に網羅されていることを確認します
例(最小)
// auth.service.test.ts
describe('AuthService', () => {
let authService: AuthService;
let mockUserRepo: jest.Mocked<UserRepository>;
beforeEach(() => {
mockUserRepo = { findByEmail: jest.fn() } as any;
authService = new AuthService(mockUserRepo);
});
it('should_return_token_when_valid_credentials', async () => {
const user = { id: '1', email: '[email protected]', passwordHash: 'hashed' };
mockUserRepo.findByEmail.mockResolvedValue(user);
const result = await authService.authenticate('[email protected]', 'pass');
expect(result.success).toBe(true);
expect(result.token).toBeDefined();
});
it('should_fail_when_user_not_found', async () => {
mockUserRepo.findByEmail.mockResolvedValue(null);
const result = await authService.authenticate('[email protected]', 'pass');
expect(result.success).toBe(false);
expect(result.error).toBe('INVALID_CREDENTIALS');
});
});
テスト要件:$ARGUMENTS
制限事項
- このスキルは、タスクが上記のスコープに明確に一致する場合にのみ使用してください。
- 出力を、環境固有の検証、テスト、専門家によるレビューの代替として扱わないでください。
- 必要な入力、権限、安全境界、成功基準が欠けている場合は、作業を中断して確認を求めてください。
コメント
Markdown 対応