dart-collect-coverage について
Dart と Flutter のテストカバレッジガイドです。カバレッジ指定、LCOV レポート生成、手動収集の手順を説明します。
主な機能
- 01package:test または flutter_test の利用
- 02コメントによる対象コードの除外
- 03テスト実行と LCOV レポート生成
- 04VM カバレッジデータの手動収集
- 05カバレッジファイルとレポートの確認
活用シーン
- 01Dart プロジェクトのカバレッジレポート生成
- 02Flutter プロジェクトのテストカバレッジ収集
- 03生成コードや指定範囲の除外
- 04関数・分岐カバレッジの手動収集
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ flutter/ agent-plugins --skill dart-collect-coverageインストール後、Claude Code で/dart-collect-coverageを入力して読み込まれたか確認します。
詳細
Dart および Flutter のテストカバレッジの実装
目次
テストの基礎
標準的な Dart のテスト手法に従ってテストスイートを構成します。Dart プロジェクトでは package:test を、Flutter プロジェクトでは flutter_test を使用します。
- ユニットテスト: 個々の関数、メソッド、クラスを検証します。
- コンポーネント/ウィジェットテスト: モックオブジェクト(
package:mockito)を使用して、コンポーネントの動作、レイアウト、インタラクションを検証します。 - 統合テスト: シミュレートされたデバイスまたは実機で、アプリ全体のフローを検証します。
カバレッジのディレクティブ
インラインコメントを使用して、特定の行、ブロック、ファイル全体をカバレッジ指標から除外します。これらのディレクティブを適用するには、フォーマット時に --check-ignore フラグを渡します。
- 1 行を無視する:
// coverage:ignore-line - コードブロックを無視する:
// coverage:ignore-startおよび// coverage:ignore-end - ファイル全体を無視する:
// coverage:ignore-file
ワークフロー:カバレッジレポートの設定と生成
以下の順序でワークフローに従い、coverage パッケージを追加し、テストを実行して LCOV レポートを生成します。
タスクの進行状況チェックリスト:
- 1.
coverageをdev_dependencyとして追加します。 - 2. 自動カバレッジスクリプトを実行します。
- 3. LCOV の出力を検証します。
1. 依存関係の追加
coverage パッケージを dev_dependency としてプロジェクトに追加します。通常の依存関係には追加しないでください。
標準的な Dart プロジェクトの場合:
dart pub add dev:coverage
Flutter プロジェクトの場合:
flutter pub add dev:coverage
2. カバレッジの収集と LCOV の生成
同梱されている test_with_coverage スクリプトを使用します。このスクリプトはすべてのテストを自動的に実行し、Dart VM から JSON カバレッジデータを収集して、LCOV レポートに変換します。
dart run coverage:test_with_coverage
注:Dart ワークスペース(モノレポ)で作業している場合は、テストディレクトリを明示的に指定します(例:dart run coverage:test_with_coverage -- pkgs/foo/test pkgs/bar/test)。
3. フィードバックループ:出力の検証
バリデーターを実行 -> エラーを確認 -> 修正:
- プロジェクトのルートに
coverage/ディレクトリが作成されていることを確認します。 coverage/coverage.json(生データ)とcoverage/lcov.info(フォーマット済みレポート)が存在することを確認します。- 特定のファイルのカバレッジが欠落している場合は、そのファイルがテストファイルからインポートされ、実行されていることを確認します。意図的に除外する場合は、
// coverage:ignore-fileを追加します。
ワークフロー:高度な手動カバレッジの収集
VM サービスをきめ細かく制御する必要がある場合、アイソレートの一時停止を個別に扱う場合、またはブランチ/関数レベルのカバレッジが必要な場合は、手動収集ワークフローを使用します。
タスクの進行状況チェックリスト:
- 1. VM サービスを有効にしてテストを実行します。
- 2. 生の JSON カバレッジを収集します。
- 3. JSON を LCOV に変換します。
1. VM サービスを有効にしてテストを実行
終了時にアイソレートを一時停止し、特定のポート(例:8181)で VM サービスを公開するようにしてテストを実行します。
dart run --pause-isolates-on-exit --disable-service-auth-codes --enable-vm-service=8181 test &
2. 生のカバレッジを収集
実行中の VM サービスからカバレッジデータを抽出し、JSON ファイルに出力します。
dart run coverage:collect_coverage --wait-paused --uri=http://127.0.0.1:8181/ -o coverage/coverage.json --resume-isolates
任意:より詳細な指標を収集するには、--function-coverage と --branch-coverage を追加します(Dart VM 2.17.0 以降が必要です)。
3. LCOV に変換
生の JSON データを標準的な LCOV 形式に変換します。
dart run coverage:format_coverage --packages=.dart_tool/package_config.json --lcov -i coverage/coverage.json -o coverage/lcov.info --check-ignore
例
例:pubspec.yaml の設定
pubspec.yaml で coverage パッケージが dev_dependencies のみに指定されていることを確認します。
name: my_dart_app
environment:
sdk: ^3.0.0
dependencies:
path: ^1.8.0
dev_dependencies:
test: ^1.24.0
coverage: ^1.15.0
例:除外ディレクティブの適用
除外ディレクティブを使用して、生成コードやテストできないエッジケースによってカバレッジスコアが低下するのを防ぎます。
// coverage:ignore-file
import 'package:meta/meta.dart';
class SystemConfig {
final String env;
SystemConfig(this.env);
// coverage:ignore-start
void legacyInit() {
print('Deprecated initialization');
}
// coverage:ignore-end
bool isProduction() {
if (env == 'prod') return true;
return false; // coverage:ignore-line
}
}