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 ワークスペース(monorepo)内で作業する場合は、テストディレクトリを明示的に指定します(例: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
}
}