testing-unit について
JavaScript、Python、Go、Ruby、Swift、Javaの開発者向け単体テストスキルです。各言語のテストフレームワークを使い、依存関係のモック化とテストの分離を支援します。
主な機能
- 01モックとスタブ応答の作成
- 02副作用を抑えたテスト分離
- 03複数言語のテストフレームワークに対応
- 04テストフレームワークと環境の設定
- 05CI/CDへの単体テスト統合
活用シーン
- 01新しい関数の単体テスト作成
- 02APIやデータベース依存のモック化
- 03リファクタリング時のテスト失敗の調査
- 04TDDワークフローでの実装検証
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ alphaonedev/ openclaw-graph --skill testing-unitインストール後、Claude Code で/testing-unitを入力して読み込まれたか確認します。
詳細
目的
このスキルは、JavaScript の Jest/Vitest、Python の pytest、Go の testify、Ruby の RSpec、Swift の XCTest、Java の JUnit5 などのフレームワークを使った単体テストを AI が支援できるようにします。依存関係のモックやスタブの作成、テストの分離に重点を置き、制御された環境でコードの動作を検証します。
使用するタイミング
新しい単体テストを作成するとき、既存のテストをデバッグするとき、または分離されたテストが必要なコードをリファクタリングするときに、このスキルを使用します。TDD ワークフロー、外部 API やデータベースのモック、関数が独立して動作することの確認にも適用します。たとえば、ネットワーク呼び出しに依存する関数では、実際の依存関係を使わずローカルでテストできるよう、呼び出しをモックします。
主な機能
- モック:関数やモジュールのモックを作成します。たとえば Jest では、
jest.mock('module')を使って実際の実装を置き換えます。 - スタブ:スタブの応答を定義します。たとえば pytest では、
monkeypatch.setattr()を使ってオブジェクトのメソッドを偽装します。 - 分離:テストを分離して実行します。たとえば、Go の testify で副作用を起こさずにアサーションを行ったり、JUnit5 の
@TempDirでファイル操作を分離したりします。 - フレームワーク固有の機能:Jest/Vitest のアサーション(例:
expect().toBe())、セットアップ/ティアダウン用の pytest フィクスチャ、モック用の RSpec のdouble、分離用の XCTest のsetUp()、JUnit5 の@Mockアノテーションをサポートします。 - 設定形式:カスタムモックには Jest の
jest.config.jsで{ testEnvironment: 'node', setupFilesAfterEnv: ['<rootDir>/setupTests.js'] }を使用します。詳細な出力には pytest のpytest.iniで[pytest] addopts = -vを使用します。
使用パターン
単体テストのタスクを実行するには、次の手順に従います。1) モックする依存関係(例:HTTP 呼び出し)を特定します。2) テストファイルでモックまたはスタブを設定します。3) 出力を検証するアサーションを記述します。4) 適切なフラグを指定してテストを実行します。TDD では、まず失敗するテストを記述してから、コードを実装します。Jest では describe() ブロックを使ってテストを構成し、pytest では共有するセットアップにフィクスチャを使用します。グローバル状態を避けてテストを常に分離します。Jest では beforeEach()、pytest では @pytest.fixture(scope='function') を使用します。
一般的なコマンド/API
- Jest/Vitest:対話モードでは
npx jest --watchAllを使ってテストを実行します。jest.mock('axios', () => ({ get: jest.fn().mockResolvedValue({ data: {} }) }));でモジュールをモックします。API:アサーションにはexpect(value).toEqual(expected)を使用します。 - pytest:カバレッジを計測するには
pytest tests/ -v --covで実行します。def test_function(monkeypatch): monkeypatch.setattr('module.func', lambda: 'stubbed')で関数をスタブ化します。API:分離には@pytest.fixtureを活用します。例:def mock_db(): return {'query': lambda: []}。 - Go(testify):
go test -v ./...でビルドし、testify のmock.Mockを使用します。例:mockCtrl := gomock.NewController(t); mockObj := NewMockInterface(mockCtrl); mockObj.EXPECT().Method().Return(value)。 - RSpec:
rspec spec/で実行します。double('Object', method: -> 'stubbed')でダブルを作成します。API:expect { code }.to change { something }を使用します。 - XCTest:
xcodebuild testでコンパイルして実行します。Swift ではprotocolのスタブを使ってモックします。例:class MockService: ServiceProtocol { func fetchData() -> Data { return Data() } }。 - JUnit5:
./gradlew testで実行します。Mockito は@ExtendWith(MockitoExtension.class) public class TestClass { @Mock private Dependency dep; @InjectMocks private ClassUnderTest cut; }のように使用します。外部サービスを統合する場合は、テストの認証に$API_KEYなどの環境変数を設定します。
統合に関する注意事項
単体テストを CI/CD パイプラインに組み込んで、このスキルを統合します。たとえば、Jest を GitHub Actions のワークフローに追加し、run: npm test を実行します。複数の言語を使用するプロジェクトでは、Jest と pytest などのツールを使うモノレポ構成にします。シークレット用の環境変数を設定します。たとえば、テストランナーで $DATABASE_URL をエクスポートします。Jest 用の Istanbul や pytest 用の Coverage.py など、コードカバレッジツールと連携します。デバッグ時に --no-cov フラグを使用し、モックがこれらのツールに適切に対応するようにします。API に依存するテストでは、$SERVICE_API_KEY などの環境変数をテストコマンドに渡します。たとえば、pytest --api-key=$SERVICE_API_KEY を実行します。
エラー処理
よくあるエラーには、適切な方法で対処します。Jest でアサーションに失敗した場合は、スタックトレースを確認し、jest.fn().mockImplementation() を使ってモックをデバッグします。モックが呼び出されていない場合は、.toHaveBeenCalled() アサーションを追加します。pytest では、フィクスチャのエラーを try/except で囲んで捕捉します。例:def test_with_fixture(fix): try: fix.setup() except Exception as e: pytest.fail(str(e))。Go では、testify の assert.NoError(t, err) を使い、エラーが発生したテストを失敗させます。RSpec では、allow(double).to receive(:method).and_raise(Error) を使ってダブルのエラーを処理します。JUnit5 では、想定される失敗に @Test(expected = Exception.class) を使います。連鎖的な失敗を防ぐため、エラーが起きやすいコードは常にスタブで分離します。詳細な出力を確認するには、jest --debug や pytest -s などの詳細表示フラグを指定して再実行します。
具体的な使用例
-
Jest のモックの例:データを取得する関数をテストするには、fetch API をモックします。
jest.mock('node-fetch'); const fetch = require('node-fetch'); fetch.mockResolvedValue({ json: () => Promise.resolve({ data: 'mocked' }) }); test('fetches data', async () => { expect(await fetchData()).toEqual('mocked'); }); -
pytest のフィクスチャの例:データベースに依存するテストを分離するには、フィクスチャを使います。
import pytest @pytest.fixture def mock_db(): return {'query': lambda: [{'id': 1}]} def test_query(mock_db): assert mock_db['query']()[0]['id'] == 1
グラフ上の関係
- 関連:testing-integration(より幅広いテストワークフロー向け)、code-debugging(テスト失敗の修正向け)
- クラスター:testing(テストクラスターの一部)、code-execution(分離された環境でのテスト実行向け)
- 依存:environment-setup(モックなどのテスト依存関係の管理向け)