test-automator について
test-automatorは、さまざまな言語やフレームワークで自動テストを作成・保守する開発者向けのスキルです。ユニット、統合、E2Eテストに加え、カバレッジやテスト設計の指針を扱います。
主な機能
- 01ユニット・統合・E2Eテストの指針
- 02カバレッジ目標とレポートコマンド
- 03テストの命名と設計原則
- 04フレームワーク別の例
- 05テスト雛形とレポート用スクリプト
活用シーン
- 01新機能のテスト計画
- 02既存プロジェクトのカバレッジ改善
- 03統合・E2Eテストの実践方法の検討
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ zhaono1/ agent-playbook --skill test-automatorインストール後、Claude Code で/test-automatorを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
README.mdreferences/best-practices.mdmocking.mdreferences/examples/README.mdunit-test-example.mdscripts/coverage_report.pygenerate_test.py詳細
テスト自動化
さまざまなフレームワークと言語で、自動テストを作成・保守するエキスパートです。
このスキルが有効になる条件
以下の場合に有効になります。
- テストの作成を依頼したとき
- テスト自動化について言及したとき
- テストカバレッジの改善を依頼したとき
- テストフレームワークの設定が必要なとき
テストピラミッド
/\
/E2E\ - Few, expensive, slow
/------\
/ Integration \ - Moderate number
/--------------\
/ Unit Tests \ - Many, cheap, fast
/------------------\
単体テスト
原則
- 実装ではなく、振る舞いをテストする
- 1つのテストにつきアサーションは1つ(通常)
- Arrange-Act-Assert パターン
- 説明的なテスト名
例(Jest)
describe('UserService', () => {
describe('createUser', () => {
it('should create a user with valid data', async () => {
// Arrange
const userData = {
name: 'John Doe',
email: '[email protected]'
};
// Act
const user = await userService.create(userData);
// Assert
expect(user.id).toBeDefined();
expect(user.email).toBe(userData.email);
});
it('should throw error for invalid email', async () => {
// Arrange
const userData = { email: 'invalid' };
// Act & Assert
await expect(userService.create(userData))
.rejects.toThrow('Invalid email');
});
});
});
統合テスト
原則
- コンポーネント間の連携をテストする
- 外部サービスにはテストダブルを使用する
- テストデータをクリーンアップする
- 独立した状態で実行する
例(Supertest)
describe('POST /api/users', () => {
it('should create a user', async () => {
const response = await request(app)
.post('/api/users')
.send({
name: 'John Doe',
email: '[email protected]'
})
.expect(201)
.expect((res) => {
expect(res.body.id).toBeDefined();
expect(res.body.email).toBe('[email protected]');
});
});
});
E2E テスト
原則
- 重要なユーザーフローをテストする
- 現実的なテストデータを使用する
- 非同期処理を適切に扱う
- テスト後にクリーンアップする
例(Playwright)
test('user can login', async ({ page }) => {
await page.goto('/login');
await page.fill('[name="email"]', '[email protected]');
await page.fill('[name="password"]', 'password123');
await page.click('button[type="submit"]');
await expect(page).toHaveURL('/dashboard');
await expect(page.locator('h1')).toContainText('Welcome');
});
テストカバレッジ
カバレッジ目標
| 種類 | 目標 |
|---|---|
| 行 | > 80% |
| 分岐 | > 75% |
| 関数 | > 80% |
| 文 | > 80% |
カバレッジレポート
# Jest
npm test -- --coverage
# Python (pytest-cov)
pytest --cov=src --cov-report=html
# Go
go test -coverprofile=coverage.out
go tool cover -html=coverage.out
テストのベストプラクティス
推奨事項
- バグを修正する前にテストを書く(TDD)
- エッジケースをテストする
- テストを独立させる
- 説明的なテスト名を使う
- 外部依存関係をモックする
- テストデータをクリーンアップする
禁止事項
- 実装の詳細をテストしない
- 壊れやすいテストを書かない
- 理由なくテストをスキップしない
- コメントアウトしたテストをコミットしない
- サードパーティ製ライブラリをテストしない
テストの命名規則
// Good: Describes what is being tested
it('should reject invalid email addresses')
// Good: Describes the scenario and outcome
it('returns 401 when user provides invalid credentials')
// Bad: Vague
it('works correctly')
よく使われるテストフレームワーク
| 言語 | フレームワーク | コマンド |
|---|---|---|
| TypeScript/JS | Jest, Vitest | npm test |
| Python | pytest | pytest |
| Go | testing | go test |
| Java | JUnit | mvn test |
| Rust | built-in | cargo test |
スクリプト
テストのひな形を生成します:
python3 scripts/generate_test.py --name <feature> --output tests/test-plan.md
テストカバレッジを確認します:
python3 scripts/coverage_report.py --name <service-name> --output coverage-report.md
参考資料
references/best-practices.md- テストのベストプラクティスreferences/examples/- フレームワーク別の例references/mocking.md- モックのガイドライン
コメント
Markdown 対応