dart-collect-coverage について
dart-collect-coverageは、DartおよびFlutterプロジェクトでテストカバレッジを収集・確認するためのスキルです。自動・手動収集、LCOVとHTMLのレポート、除外指示、CIでのチェックを扱います。
主な機能
- 01テストとカバレッジの自動収集
- 02LCOV・HTMLレポートの生成
- 03関数・分岐カバレッジの収集
- 04除外指示によるコードの除外
- 05CIへのカバレッジ検査の追加
活用シーン
- 01Dartプロジェクトのカバレッジ測定
- 02Flutterテストのレポート生成
- 03関数・分岐カバレッジの確認
- 04CIのカバレッジ基準の設定
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ dhruvanbhalara/ skills --skill dart-collect-coverageインストール後、Claude Code で/dart-collect-coverageを入力して読み込まれたか確認します。
詳細
目次
セットアップ
coverage は必ず dev_dependency として追加してください:
Dart プロジェクト:
dart pub add dev:coverage
Flutter プロジェクト:
flutter pub add dev:coverage
自動収集
同梱の test_with_coverage スクリプトを使えば、コマンド1つでカバレッジを取得できます:
dart run coverage:test_with_coverage
これは自動的に以下を実行します:
- すべてのテストを実行する
- Dart VM から JSON 形式のカバレッジを収集する
coverage/lcov.infoに LCOV レポートとしてフォーマットする
モノレポのサポート: テストディレクトリを明示的に指定します:
dart run coverage:test_with_coverage -- pkgs/foo/test pkgs/bar/test
Flutter 固有のカバレッジ
LCOV の生成
flutter test --coverage
プロジェクトルートに coverage/lcov.info を出力します。
HTML レポートの生成
# Install lcov (macOS)
brew install lcov
# Generate HTML from LCOV
genhtml coverage/lcov.info -o coverage/html
# Open in browser
open coverage/html/index.html
生成されたコードの除外
lcov --remove coverage/lcov.info \
'*.g.dart' \
'*.freezed.dart' \
'*.part.dart' \
-o coverage/lcov_cleaned.info
手動 VM サービスワークフロー
カバレッジ収集をきめ細かく制御する場合 (ブランチ/関数レベル):
1. VM サービスを有効にしてテストを実行
dart run --pause-isolates-on-exit \
--disable-service-auth-codes \
--enable-vm-service=8181 \
test &
2. 生のカバレッジを収集
dart run coverage:collect_coverage \
--wait-paused \
--uri=http://127.0.0.1:8181/ \
-o coverage/coverage.json \
--resume-isolates \
--function-coverage \
--branch-coverage
任意のフラグ:
--function-coverage: 関数レベルのメトリクス (Dart VM 2.17.0+)--branch-coverage: ブランチレベルのメトリクス (Dart VM 2.17.0+)
3. LCOV にフォーマット
dart run coverage:format_coverage \
--packages=.dart_tool/package_config.json \
--lcov \
-i coverage/coverage.json \
-o coverage/lcov.info \
--check-ignore
カバレッジ除外ディレクティブ
インラインコメントを使って、特定のコードをカバレッジのメトリクスから除外します。フォーマット時に --check-ignore を渡すと、これを強制できます。
| ディレクティブ | スコープ | 用途 |
|---|---|---|
// coverage:ignore-line | 単一行 | 到達不能な分岐、プラットフォームチェック |
// coverage:ignore-start / // coverage:ignore-end | ブロック | 生成されたコード、レガシーメソッド |
// coverage:ignore-file | ファイル全体 | 生成されたファイル、設定ファイル |
// coverage:ignore-file
// This entire file is excluded from coverage
class GeneratedRoutes {
// coverage:ignore-start
void legacyInit() {
print('Deprecated initialization');
}
// coverage:ignore-end
bool isProduction(String env) {
if (env == 'prod') return true;
return false; // coverage:ignore-line
}
}
CI 統合
GitHub Actions のカバレッジゲート
- name: Run tests with coverage
run: flutter test --coverage
- name: Check coverage threshold
run: |
COVERAGE=$(lcov --summary coverage/lcov.info 2>&1 | grep "lines" | awk '{print $2}' | sed 's/%//')
echo "Coverage: $COVERAGE%"
if (( $(echo "$COVERAGE < 80" | bc -l) )); then
echo "Coverage below 80% threshold!"
exit 1
fi
- name: Upload coverage
uses: codecov/codecov-action@v4
with:
files: coverage/lcov.info
カバレッジの目標 (AGENTS.md より)
domain層とbloc層は 100% のロジックカバレッジ。- すべての主要な UI コンポーネントに ウィジェットカバレッジ。
- 生成されたコード (
.g.dart、.freezed.dart) には// coverage:ignore-fileを使用します。
ワークフロー: カバレッジレポートの生成
タスクの進捗
- ステップ 1:
coverageをdev_dependenciesに追加します。 - ステップ 2:
flutter test --coverage(またはdart run coverage:test_with_coverage) を実行します。 - ステップ 3:
coverage/lcov.infoが存在することを検証します。 - ステップ 4: 生成されたコードを除外します:
lcov --remove ... '*.g.dart' '*.freezed.dart'。 - ステップ 5: HTML を生成します:
genhtml coverage/lcov.info -o coverage/html。 - ステップ 6: カバレッジが不足しているファイルを確認します: テストを追加するか、
// coverage:ignore-fileを付けます。 - ステップ 7: CI パイプラインにカバレッジゲートを追加します (最低 80%)。
例
pubspec.yaml の設定
name: my_app
environment:
sdk: ^3.0.0
dev_dependencies:
flutter_test:
sdk: flutter
coverage: ^1.15.0
bloc_test: ^9.1.0
mocktail: ^1.0.0
クイックカバレッジチェックスクリプト
#!/bin/bash
# scripts/coverage.sh
set -e
echo "Running tests with coverage..."
flutter test --coverage
echo "Filtering generated code..."
lcov --remove coverage/lcov.info \
'*.g.dart' '*.freezed.dart' '*.part.dart' \
-o coverage/lcov_cleaned.info
echo "Generating HTML report..."
genhtml coverage/lcov_cleaned.info -o coverage/html
echo "Opening report..."
open coverage/html/index.html
コメント
Markdown 対応