testgen について
Gemini を使ったテスト生成とテストスイート管理のためのスキルです。ユニット、統合、回帰テストに加え、一般的な JavaScript テストランナーでの実行、カバレッジ分析、ミューテーションテストを扱います。
主な機能
- 01Gemini によるテスト生成
- 02ユニット、統合、回帰テストのワークフロー
- 03Jest、Vitest、Mocha でテストを実行
- 04カバレッジと未カバーコードの分析
- 05Stryker によるミューテーションテスト
活用シーン
- 01新しい関数や機能のテスト案を作成
- 02バグ修正後に回帰テストを作成
- 03未カバーコードを探してテスト案を得る
- 04テストがコード変更を検出できるか確認
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ johnlindquist/ claude --skill testgenインストール後、Claude Code で/testgenを入力して読み込まれたか確認します。
詳細
テスト生成
AI を活用したテスト生成とテストスイート管理。
前提条件
# Gemini for AI generation
pip install google-generativeai
export GEMINI_API_KEY=your_api_key
# Test runners (install as needed)
npm install -D jest vitest mocha
npm install -D @stryker-mutator/core # Mutation testing
AI テスト生成
ユニットテストの生成
# Read code and generate tests
CODE=$(cat src/utils.ts)
gemini -m pro -o text -e "" "Generate comprehensive unit tests for this code:
$CODE
Requirements:
1. Use Jest/Vitest syntax
2. Cover happy path, edge cases, and error conditions
3. Include descriptive test names
4. Mock external dependencies
5. Test each exported function
Output only the test code, ready to save to a file."
特定の関数のテストを生成
gemini -m pro -o text -e "" "Generate unit tests for this function:
\`\`\`typescript
export function calculateDiscount(price: number, percentage: number): number {
if (percentage < 0 || percentage > 100) {
throw new Error('Invalid percentage');
}
return price * (1 - percentage / 100);
}
\`\`\`
Include tests for:
- Valid inputs
- Boundary values (0%, 100%)
- Invalid inputs (negative, >100)
- Edge cases (zero price)
Use Jest syntax."
TDD ループ
# 1. Write failing test first
gemini -m pro -o text -e "" "Write a failing test for: [feature description]"
# 2. Run test (should fail)
npm test -- --watch
# 3. Implement minimal code to pass
# 4. Refactor
# 5. Repeat
テストランナー
Jest
# Run all tests
npx jest
# Watch mode
npx jest --watch
# Specific file
npx jest src/utils.test.ts
# With coverage
npx jest --coverage
# Update snapshots
npx jest -u
# Verbose output
npx jest --verbose
# Run matching pattern
npx jest -t "should calculate"
Vitest
# Run tests
npx vitest
# Watch mode
npx vitest --watch
# Run once
npx vitest run
# Coverage
npx vitest --coverage
# UI mode
npx vitest --ui
# Specific file
npx vitest src/utils.test.ts
Mocha
# Run tests
npx mocha
# Watch mode
npx mocha --watch
# Specific file
npx mocha test/utils.test.js
# With reporter
npx mocha --reporter spec
カバレッジ分析
カバレッジレポートの生成
# Jest
npx jest --coverage --coverageReporters=text --coverageReporters=html
# Vitest
npx vitest run --coverage
# View HTML report
open coverage/index.html
カバレッジのしきい値
// jest.config.js or vitest.config.ts
{
"coverageThreshold": {
"global": {
"branches": 80,
"functions": 80,
"lines": 80,
"statements": 80
}
}
}
カバーされていないコードを見つける
# Text coverage report
npx jest --coverage --coverageReporters=text
# Ask AI for suggestions
UNCOVERED=$(npx jest --coverage --coverageReporters=json --silent | jq '.coverageMap')
gemini -m pro -o text -e "" "Given this coverage report, suggest tests for uncovered code:
$UNCOVERED"
ミューテーションテスト
Stryker を使用して、テスト自体をテストします。
# Check if installed
npx stryker --version
# Initialize
npx stryker init
# Run mutation testing
npx stryker run
# With reporters
npx stryker run --reporters clear-text,json,html
結果の解釈
- キルされたミュータント:テストがバグを検出しました(良好)
- 生存したミュータント:テストがバグを見逃しました(テストを追加する必要があります)
- タイムアウトしたミュータント:ミュータントが無限ループを引き起こしました
- カバレッジなし:どのテストでもコードがカバーされていません
ワークフローパターン
新機能のテスト
# 1. Generate test scaffold
CODE=$(cat src/new-feature.ts)
gemini -m pro -o text -e "" "Generate test file scaffold for: $CODE" > src/new-feature.test.ts
# 2. Run tests (should fail)
npx jest src/new-feature.test.ts
# 3. Implement feature
# 4. Run tests (should pass)
# 5. Add edge case tests
# 6. Check coverage
npx jest src/new-feature.test.ts --coverage
回帰テストの生成
# After fixing a bug, generate regression test
BUG_DESC="Users could submit empty forms"
FIX=$(git diff HEAD~1)
gemini -m pro -o text -e "" "Generate a regression test for this bug fix:
Bug: $BUG_DESC
Fix:
$FIX
The test should fail if the bug is reintroduced."
統合テストの生成
gemini -m pro -o text -e "" "Generate integration tests for this API endpoint:
\`\`\`typescript
// POST /api/users
// Body: { name: string, email: string }
// Response: { id: string, name: string, email: string }
\`\`\`
Include:
- Success case
- Validation errors
- Duplicate email handling
- Authentication required
Use supertest or similar."
ベストプラクティス
- 実装ではなく動作をテストする - どのようにではなく、何をするかに注目します
- テストごとにアサーションを1つにする - 実用的な場合
- 説明的な名前を付ける - テスト対象を記録する名前にします
- Arrange-Act-Assert - 明確なテスト構造にします
- 外部依存関係をモックする - テスト対象のユニットを分離します
- CI でテストを実行する - 検証を自動化します
- カバレッジを維持する - 低下させないようにします
- ミューテーションテストを使用する - テストの品質を検証します
コメント
Markdown 対応