increase-coverage について
Dart と Flutter のモノレポで、コードカバレッジを実行し改善するための開発者向けガイドです。Melos のコマンド、カバレッジの集約と不足箇所の分析に加え、分岐、例外、深いコレクションのテスト方針を説明します。
主な機能
- 01パッケージテストとカバレッジの実行
- 02各パッケージのレポート集約
- 03HTML カバレッジレポートの生成
- 04lcov.info による未カバー行の特定
- 05分岐、例外、コレクションのテスト
活用シーン
- 01モノレポ全体のカバレッジ測定
- 02未テストのソース行の発見
- 03例外や破棄処理のテスト作成
- 04カバレッジ実行後のリポジトリ整理
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ rodydavis/ signals.dart --skill increase-coverageインストール後、Claude Code で/increase-coverageを入力して読み込まれたか確認します。
詳細
コードカバレッジの実行と最大化ガイド
この開発者向けスキルでは、モノレポ全体でコードカバレッジを 100% に引き上げるために、コードカバレッジツールを実行し、未テストのパス(ギャップ)を特定し、精度の高い単体テストを作成する手順とベストプラクティスを順を追って説明します。
1. モノレポ全体のカバレッジの実行と集約
このモノレポでは、Melos を使って複数のパッケージにまたがるテストを調整しています。次のコマンド手順に従って、カバレッジデータを生成して統合します。
A. カバレッジ付きでパッケージのテストを実行する
モノレポのテストランナーを実行します。これにより、すべてのパッケージで flutter test --coverage(または dart test --coverage)が実行されます。
melos run test
B. パッケージごとのカバレッジファイルを統合する
統合スクリプトを実行して、パッケージごとの coverage/lcov.info ファイルをマージし、ルートに統合済みの lcov.info ファイルを作成します。
melos run coverage
メモ
集約スクリプト(
scripts/combine_coverage.sh)は、パスのルートを動的に絶対パスへ書き換え、ワークスペースをクリーンな状態に保つために、一時的なパッケージのcoverageディレクトリを削除します。
C. HTML カバレッジレポートを生成する
genhtml(lcov ツールキットの一部)を使って、統合済みの lcov.info ファイルをインタラクティブな HTML ビジュアライゼーションレポートに変換します。
genhtml lcov.info -o coverage/html
2. 未カバー行の特定(ギャップ分析)
HTML レポート全体を確認せずに、テストされていないコード行をすばやく見つけるには、ルートの lcov.info ファイルに対して次の grep と awk のパイプラインを実行します。
grep -E "SF:|DA:" lcov.info | awk -F: '/SF/ {file=$2} /DA/ {split($2,a,","); if(a[2]==0) print file, a[1]}'
この出力には、絶対ファイルパスの後に、カバーされていない各ステートメントの正確な行番号が表示されます。例:
/workspace/packages/preact_signals/lib/src/model.dart 21
/workspace/packages/preact_signals/lib/src/model.dart 25
3. カバレッジ 100% 達成のための戦略
未カバー行を特定したら、次の対象を絞ったテスト戦略を適用し、意味のあるテストを作成します。
A. モデルとオプションの基本をテストする
値モデル、オプション、パラメーターを漏れなくテストします。
copyWithメソッド:現在の値へのフォールバックを確認するためにnullを指定した場合と、明示的な値を指定した場合の両方をテストします。- 等価性(
==)とhashCode:- 同一の参照(
identical(this, other))を比較するケースをテストします。 - プロパティが同じ別のインスタンスを比較するケースをテストします(等しいことを確認します)。
- プロパティが異なる別のインスタンスを比較するケースをテストします(等しくないことを確認します)。
null、またはまったく異なるクラスのインスタンスと比較するケースをテストします。
- 同一の参照(
B. 複雑な分岐/条件ロジックをテストする
ネストされたすべての if、else、三項演算子(? :)を確認します。
- 評価結果が
trueになる経路を通るテスト入力を作成します。 - 評価結果が
falseになる経路を通るテスト入力を作成します。 - 境界チェック、空のコレクション、null 安全性のフォールバックが明示的に実行されるようにします。
C. 例外/catch 経路をシミュレートして検証する
回復ロジックや診断アサーションをカバーするには、次の方法を使います。
catchブロック:互換性のない型を渡すか、実行時のTypeErrorまたはAssertionErrorが発生する状況を作成し、フォールバック分岐を検証します。- dispose とライフサイクルエラー:シグナル/プリミティブで
.dispose()を呼び出した後、読み取りまたは書き込み操作を試み、SignalsReadAfterDisposeErrorまたはSignalsWriteAfterDisposeErrorがスローされることを検証します。
D. 深くネストされたコレクション
カスタムの深いコレクション用アサーション(リスト、マップ、セット、ネストされたオブジェクトなど)が、すべての深さで一致する構成と一致しない構成の両方を評価することを確認します。
4. 整理とバージョンの安全性
カバレッジ最大化の実行を完了する前に、リポジトリが整理された状態であることを確認します。
- テストファイルをフォーマットする:
dart format . - Lint と静的解析を実行する:
melos run analyze - Git の状態をクリーンにする:
カバレッジファイル(
lcov.infoまたはcoverage/)を Git の履歴にコミットしてはいけません。誤ってステージングした場合は、削除します。git rm -r --cached coverage/ git rm lcov.info