Anthropic Claudeソフトウェア開発⭐ リポ 0品質スコア 55/100
test-coverage
テストカバレッジを分析します。本番環境のファイルをテストにマッピングし、テストの漏れを検出し、品質を確認できます。以下のキーワードで起動できます:「テストカバレッジ」「テストが不足している」「何をテストする必要があるか」
description の原文を見る
Analyze test coverage. Maps production files to tests, finds gaps, checks quality. Triggers: 'test coverage', 'missing tests', 'what needs tests'.
SKILL.md 本文
テストカバレッジスキル
欠落しているテストを見つけ、重要度に基づいて優先順位をつけます。
引数
<path>- 分析対象のディレクトリ (デフォルト:./)--scope-file <path>- scope.json へのパス (premerge から取得)--changed- main 以降に変更されたファイルのみ--strict- カバレッジが 80% 未満または重要ファイルがテストされていない場合、終了コード 1 で終了
クイックフロー
- スコープをロード (premerge からの場合)
- プロダクションファイルを見つける (スコープされたもの)
- 予想されるテストファイルにマップ
- 欠落しているテストを優先度でも分類
- テストの品質シグナルをチェック
test-coverage.jsonを生成
ステップ 0: スコープをロード
# premerge から呼び出されているかチェック (スコープファイルが存在するか)
if [[ -f .review-output/scope.json ]]; then
SCOPE=$(jq -r '.scope' .review-output/scope.json)
FILES=$(jq -r '.files[]' .review-output/scope.json)
echo "Using scope: $SCOPE"
# プロダクション Java ファイルにフィルタリング
echo "$FILES" | grep "src/main/.*\.java$" | grep -v Test > /tmp/prod.txt
# テストファイルにフィルタリング
echo "$FILES" | grep "src/test/.*Test\.java$" > /tmp/tests.txt
elif [[ "$1" == "--changed" ]]; then
# レガシー --changed フラグ
MAIN=$(git symbolic-ref refs/remotes/origin/HEAD 2>/dev/null | sed 's@^refs/remotes/origin/@@' || echo "main")
git diff $(git merge-base $MAIN HEAD) --name-only | grep "\.java$" | grep -v Test > /tmp/prod.txt
git diff $(git merge-base $MAIN HEAD) --name-only | grep "Test\.java$" > /tmp/tests.txt
else
# デフォルト: リポジトリ全体を分析
find . -path "*/src/main/*" -name "*.java" ! -name "*Test.java" > /tmp/prod.txt
find . -path "*/src/test/*" -name "*Test.java" > /tmp/tests.txt
fi
ステップ 1: ファイルを集める
プロダクションファイルとテストファイルは、スコープに基づいて /tmp/prod.txt と /tmp/tests.txt に配置されました。
ステップ 2: プロダクション → テストのマップ
| プロダクション | 予想されるテスト |
|---|---|
src/main/.../Foo.java | src/test/.../FooTest.java |
FooServiceImpl.java | FooServiceImplTest.java |
for f in $(cat /tmp/prod.txt); do
test=$(echo "$f" | sed 's|/main/|/test/|; s|\.java$|Test.java|')
[[ -f "$test" ]] && echo "✓ $f" || echo "✗ $f → $test"
done
ステップ 3: 優先度の分類
| ファイルタイプ | 優先度 | 理由 |
|---|---|---|
*Service.java | 重要度高 | ビジネスロジック |
*ServiceImpl.java | 重要度高 | 実装 |
*Repository.java | 高 | データアクセス |
*Resource.java | 高 | API エンドポイント |
*Handler.java | 高 | イベント処理 |
*Mapper.java | 中 | 変換 |
*Validator.java | 中 | 検証 |
*Factory.java | 中 | 作成 |
*Config.java | 低 | 設定の配線 |
*Exception.java | 低 | シンプルなクラス |
*Dto/Request/Response.java | 低 | データクラス |
*Constants.java | スキップ | 動作なし |
ステップ 4: テストの品質
既存テストの品質シグナルをチェック:
| シグナル | 良好 | 警告 |
|---|---|---|
| テストあたりのアサーション数 | ≥1 | 0 |
| 命名 | should_*, when_* | test1, testIt |
| 長さ | <50 行 | >50 行 |
for t in $(cat /tmp/tests.txt | head -30); do
tests=$(grep -c "@Test" "$t")
asserts=$(grep -cE "assert|verify|expect" "$t")
[[ $asserts -eq 0 ]] && echo "⚠ $t - no assertions"
[[ $tests -gt 0 && $((asserts/tests)) -lt 1 ]] && echo "⚠ $t - low assertion ratio"
done
ステップ 5: 出力
test-coverage.json を生成:
{
"meta": { "path": "./", "mode": "full", "analyzedAt": "..." },
"summary": {
"productionFiles": 100,
"filesWithTests": 85,
"coveragePercent": 85
},
"missing": {
"critical": ["UserService.java", "PaymentService.java"],
"high": ["UserRepository.java"],
"medium": ["UserMapper.java"],
"low": ["UserConfig.java"]
},
"quality": {
"warnings": [
{ "file": "UserServiceTest.java", "issue": "no assertions" }
]
},
"grade": "B",
"strictPassed": false
}
サマリーを表示
## テストカバレッジ
**カバレッジ**: 85/100 (85%) | **評価**: B
### 優先度別の欠落テスト
| 優先度 | 件数 | ファイル |
|----------|-------|-------|
| 重要度高 | 2 | UserService, PaymentService |
| 高 | 1 | UserRepository |
| 中 | 3 | ... |
| 低 | 5 | ... |
### 品質警告
- ⚠ UserServiceTest.java - アサーションなし
- ⚠ OrderTest.java - テスト名が不適切
### 推奨事項
1. **[重要度高]** UserServiceTest.java を追加
2. **[重要度高]** PaymentServiceTest.java を追加
3. **[高]** UserRepositoryTest.java を追加
### 判定
⚠ 重要度高いファイルにテストが必要です
評価
| 評価 | ファイルカバレッジ | 欠落した重要ファイル |
|---|---|---|
| A | ≥90% | 0 |
| B | ≥80% | ≤1 |
| C | ≥70% | ≤3 |
| D | ≥60% | あり |
| F | <60% | あり |
ストリクトモード
coverage=$(cat /tmp/coverage-pct.txt)
critical=$(cat /tmp/critical-missing.txt | wc -l)
[[ $coverage -lt 80 ]] && exit 1
[[ $critical -gt 0 ]] && exit 1
exit 0
自律的な動作
このスキルは次の動作で自律的に動作します:
可能な限り自動生成:
| シナリオ | アクション |
|---|---|
| シンプルな DTO のテストファイルが欠落 | 基本的なテストスケルトンを生成 |
| テストファイルが存在するが空 | 推奨テストを含む TODO コメントを追加 |
| テストの名前が変更されたが存在 | マッピングを更新、警告なし |
自動修正できない (レポートのみ):
| シナリオ | 理由 |
|---|---|
| 複雑なサービスがテストなし | ビジネスロジックの理解が必要 |
| 統合テストが欠落 | アーキテクチャ判断が必要 |
| セキュリティ重要テストが欠落 | セキュリティの専門知識が必要 |
他のスキルとの協力
コラボレーション要求の受け取り
他のスキルがテスト必要性をフラグした場合:
{
"collaborationNeeded": [
{
"skill": "test-coverage",
"reason": "Security vulnerability needs regression test",
"files": ["UserRepository.java"],
"testType": "security",
"priority": "critical"
}
]
}
応答アクション:
| リクエストソース | テストアクション |
|---|---|
| security-review: 脆弱性修正 | セキュリティテストカバレッジを優先 |
| self-review: 新機能 | テストが欠落している場合はフラグ |
| solid-review: リファクタリングされたクラス | テストマッピングが引き続き機能することを確認 |
コラボレーション要求の送信
テスト分析がより広い問題を明らかにした場合:
{
"collaborationRequests": [
{
"targetSkill": "write-docs",
"reason": "Test requirements should be documented",
"suggestedContent": {
"section": "testing.md",
"topics": ["Coverage requirements", "Test patterns"]
}
},
{
"targetSkill": "self-review",
"reason": "Untested critical service - block merge?",
"files": ["PaymentService.java"],
"action": "WARN_OR_BLOCK"
}
]
}
コラボレーションからの優先順位付け
security-review が脆弱性をフラグした場合、このスキルは:
- それらのファイルを重要度高に昇格
- テスト推奨事項に「security」タグを追加
- 脆弱性リグレッションの特定のテストケースを提案
ライセンス: MIT(寛容ライセンスのため全文を引用しています) · 原本リポジトリ
詳細情報
- 作者
- samanthaci
- ライセンス
- MIT
- 最終更新
- 2026/2/6
Source: https://github.com/samanthaci/stormstack / ライセンス: MIT