test-quality-analysis について
テストスイートを見直し、品質を改善するためのスキルです。テストの臭い、モックの過剰使用、不安定なテスト、カバレッジ不足、アサーションを扱い、TypeScript、JavaScript、Python の分析コマンドも示します。
主な機能
- 01代表的なテストの臭いを特定
- 02モック過剰と不安定なテストを分析
- 03カバレッジとテスト不足を確認
- 04アサーションと分離性を評価
- 05TS、JS、Python のコマンドを提示
活用シーン
- 01テストスイートの保守性を確認
- 02断続的な失敗を起こすテストを特定
- 03重要な処理経路のカバレッジ不足を発見
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ laurigates/ claude-plugins --skill test-quality-analysisインストール後、Claude Code で/test-quality-analysisを入力して読み込まれたか確認します。
同梱ファイルREFERENCE.md
詳細
テスト品質分析
テストの品質を分析・改善するための専門知識です。テストのにおい、過剰なモック、不十分なカバレッジ、その他のテストに関するアンチパターンを検出します。
このスキルを使う場面
| このスキルを使う場面… | 代わりに別のスキルを使う場面… |
|---|---|
| テストの品質やにおいをレビューする | 新しい単体テストを作成する(vitest-testing を使用) |
| 過剰なモックや不安定なテストを検出する | E2E テストを設定する(playwright-testing を使用) |
| テストカバレッジの不足箇所を分析する | ミューテーションテストでテストを検証する(mutation-testing を使用) |
| テストの保守性を改善する | テストデータを生成する(property-based-testing を使用) |
| テストスイートのアンチパターンを監査する | Python のテストを作成する(python-testing を使用) |
主な専門分野
テスト品質の評価項目
- 正確性:テストが適切な動作を検証している
- 信頼性:テストが決定論的で、不安定ではない
- 保守性:テストが理解しやすく、変更しやすい
- パフォーマンス:テストの実行が速い
- カバレッジ:重要なコードパスをテストで網羅している
- 独立性:テストが外部の状態に依存しない
テストのにおい - クイックリファレンス
| におい | 症状 | 修正方法 |
|---|---|---|
| 過剰なモック | 1つのテストにモックが3つ以上ある、純粋関数をモックしている | I/O 境界のみをモックし、実際の実装を使用する |
| 壊れやすいテスト | 動作が変わっていないのにリファクタリングで失敗する | 公開 API をテストし、意味に基づいたセレクターを使用する |
| 不安定なテスト | 成功と失敗が非決定的に変わる | 適切に async/await を使用し、時間をモックして、独立性を確保する |
| テストの重複 | テスト間でセットアップがコピー&ペーストされている | beforeEach()、フィクスチャ、ヘルパーに切り出す |
| 遅いテスト | 単体テストのスイートに10秒以上かかる | コストの高いセットアップには beforeAll() を使用し、並列化する |
| 不十分なアサーション | toBeDefined() を使用している、アサーションがない、モックに対するアサーションしかない | 具体的なマッチャーを使い、出力と状態をアサートする |
| 不十分なカバレッジ | 重要なパスがテストされていない | ビジネスロジックは80%以上を目指し、エラーパスと境界値をテストする |
分析ツール
TypeScript/JavaScript
vitest --coverage # Coverage report
vitest --coverage --coverage.thresholds.lines=80 # Threshold check
vitest --reporter=verbose # Find slow tests
Python
uv run pytest --cov --cov-report=term-missing # Coverage with missing lines
uv run pytest --cov --cov-fail-under=80 # Threshold check
uv run pytest --durations=10 # Find slow tests
主なアンチパターン
動作ではなく実装をテストする
// BAD: Testing how
test('uses correct algorithm', () => {
const spy = vi.spyOn(Math, 'sqrt')
calculateDistance({ x: 0, y: 0 }, { x: 3, y: 4 })
expect(spy).toHaveBeenCalled()
})
// GOOD: Testing what
test('calculates distance correctly', () => {
const distance = calculateDistance({ x: 0, y: 0 }, { x: 3, y: 4 })
expect(distance).toBe(5)
})
弱いアサーション
// BAD
expect(users).toBeDefined() // Too vague
expect(mockAPI).toHaveBeenCalled() // Testing mock, not behavior
// GOOD
expect(user).toMatchObject({
id: expect.any(Number),
name: 'John',
email: '[email protected]',
})
カバレッジの不足
// BAD: Only tests happy path
test('applies discount', () => {
expect(calculateDiscount(100, 'SAVE20')).toBe(80)
})
// GOOD: Tests all paths
describe('calculateDiscount', () => {
it('applies SAVE20', () => expect(calculateDiscount(100, 'SAVE20')).toBe(80))
it('applies SAVE50', () => expect(calculateDiscount(100, 'SAVE50')).toBe(50))
it('invalid coupon', () => expect(calculateDiscount(100, 'INVALID')).toBe(100))
it('no coupon', () => expect(calculateDiscount(100)).toBe(100))
})
テストの構造(AAA パターン)
test('user registration flow', async () => {
// Arrange
const userData = { email: '[email protected]', password: 'secure123' }
const mockEmailService = vi.fn()
// Act
const user = await registerUser(userData, mockEmailService)
// Assert
expect(user).toMatchObject({ email: '[email protected]', emailVerified: false })
expect(mockEmailService).toHaveBeenCalledWith('[email protected]', expect.any(String))
})
エージェント向けの最適化
| 用途 | コマンド |
|---|---|
| カバレッジの確認(TS) | vitest --coverage --reporter=dot |
| カバレッジの確認(Python) | uv run pytest --cov --cov-fail-under=80 -q |
| 遅いテストを探す(TS) | vitest --reporter=verbose |
| 遅いテストを探す(Python) | uv run pytest --durations=10 -q |
| 未カバー行を確認する(Python) | uv run pytest --cov --cov-report=term-missing |
詳細な例、高度なパターン、ベストプラクティスについては、REFERENCE.md を参照してください。
関連項目
vitest-testing- TypeScript/JavaScript のテストpython-testing- Python の pytest テストplaywright-testing- E2E テストmutation-testing- テストの有効性を検証
参考資料
- テストのにおい:https://testsmells.org/
- テストダブルのパターン:https://martinfowler.com/bliki/TestDouble.html
- テストのベストプラクティス:https://kentcdodds.com/blog/common-mistakes-with-react-testing-library
コメント
Markdown 対応