Files
gh-allex-znews-cc-workflow-…/commands/create-tests.md
2025-11-29 17:52:09 +08:00

5.8 KiB
Raw Blame History

description, argument-hint
description argument-hint
テストケースを作成するTDD
追加の指示(オプション)

テストケースの作成(テスト駆動開発)

機能仕様書に基づいて、実装前にテストケースを作成します。 TDDTest-Driven Developmentのアプローチに従い、実装のガイドとなるテストを書きます。

追加の指示

$ARGUMENTS

前提条件の確認

テスト作成を開始する前に、以下を確認してください:

1. 前のステップの完了確認

const fs = require('fs');
const tasksFile = '.tasks.json';

if (!fs.existsSync(tasksFile)) {
  console.log('❌ タスクファイルが見つかりません');
  console.log('\n先に要件整理を実行してください:');
  console.log('  /new-feature [機能の説明]');
  process.exit(1);
}

const data = JSON.parse(fs.readFileSync(tasksFile, 'utf-8'));

// タスクID 2 (ドキュメント作成) が完了しているか確認
const docTask = data.tasks.find(t => t.id === 2);

if (!docTask || docTask.status !== 'completed') {
  console.log('❌ ドキュメント作成が完了していません');
  console.log('\n先にドキュメントを作成してください:');
  console.log('  /create-docs');
  console.log('\nまたは、ワークフローを再開:');
  console.log('  /resume');
  process.exit(1);
}

2. 重複実行の防止

// タスクID 3 (テスト作成) の状態を確認
const testTask = data.tasks.find(t => t.id === 3);

if (testTask && testTask.status === 'completed') {
  console.log('⚠️  テストは既に作成されています');
  console.log('\nテストファイルを確認してください。');
  console.log('次のステップに進む場合:');
  console.log('  /resume');
  process.exit(0);
}

テスト作成の指針

前提条件を満たしていることを確認したら、test-writer エージェントを使って、包括的なテストスイートを作成してください。

ステップ1: テスト環境の確認

まず、プロジェクトのテストフレームワークと規約を確認:

# package.jsonやrequirements.txtを確認
# 既存のテストファイルを参照
# テスト実行コマンドを確認

ステップ2: テスト計画

以下のテストタイプを計画します:

ユニットテスト

  • 個々の関数/メソッドのテスト
  • モジュールの単独動作検証
  • 外部依存をモック化

統合テスト

  • モジュール間の連携テスト
  • データベース操作のテスト
  • API統合のテスト

E2Eテスト必要な場合

  • ユーザーシナリオの完全な流れ
  • UI操作のテスト

ステップ3: テストケースの構造

各テストは AAA パターンに従います:

// JavaScript/TypeScript の例
describe('機能名', () => {
  test('should [期待される動作]', () => {
    // Arrange: テストデータとモックの準備
    const input = {...};
    const expected = {...};

    // Act: テスト対象を実行
    const result = functionUnderTest(input);

    // Assert: 結果を検証
    expect(result).toEqual(expected);
  });
});
# Python の例
def test_機能名_should_期待される動作():
    # Arrange
    input_data = {...}
    expected = {...}

    # Act
    result = function_under_test(input_data)

    # Assert
    assert result == expected

ステップ4: テストカバレッジ

以下の観点を網羅してください:

正常系

  • 典型的な入力パターン
  • 期待される出力の検証

異常系

  • 不正な入力
  • エラーハンドリング
  • 例外処理

境界値

  • 最小値/最大値
  • 空の値null, undefined, empty string, etc.
  • ゼロ除算など

エッジケース

  • 特殊文字
  • 大量データ
  • 同時実行

ステップ5: モックとスタブ

外部依存を適切にモック化:

// データベースのモック
const mockDb = {
  query: jest.fn().mockResolvedValue([...]),
};

// API呼び出しのモック
jest.mock('./api', () => ({
  fetchData: jest.fn().mockResolvedValue({...}),
}));

ステップ6: テストデータ

テストデータを適切に準備:

// テストフィクスチャ
const testData = {
  validUser: { id: 1, name: 'Test User' },
  invalidUser: { id: -1, name: '' },
};

// ファクトリー関数
function createTestUser(overrides = {}) {
  return { id: 1, name: 'Test User', ...overrides };
}

テスト作成のベストプラクティス

  1. 明確なテスト名: 何をテストしているか一目でわかる
  2. 独立性: 各テストは他のテストに依存しない
  3. 再現性: 何度実行しても同じ結果
  4. 高速: ユニットテストは数ミリ秒で完了
  5. 可読性: テストコードも本番コード同様に丁寧に書く

ファイル配置

プロジェクトの規約に従って配置:

  • __tests__/[feature-name].test.js
  • tests/test_[feature_name].py
  • [feature-name]_test.go
  • src/[feature-name].spec.ts

次のステップ

テストケースを作成したら(この時点でテストは失敗します - Red、ユーザーに以下を確認してください

テストケースを確認してください。
承認いただければ、次のステップ(実装タスクの作成)を自動的に開始します。

承認しますか? (yes/no)

ユーザーが承認した場合: SlashCommandツールを使って /create-tasks を実行してください。

注意:

  • post-test-check フックが自動的に実行され、テストの品質と網羅性をチェックします
  • タスクが作成された後、実装フェーズで各タスクを順次実行し、テストをGreenにしていきます