コンテンツにスキップ

Test · メトリクス

オプトインの Test ファミリは、常時オンの Code ファミリの上にトップレベルのメトリクスを 3 つ追加します — coverage_pctskip_ratio・Test Hotspot です。これに加えて change_couplingchange_coupling.drift というサブメトリクスが乗ります。中心的なシグナルは 行カバレッジ で、外部生成された lcov.info を読み取り、Hotspot のスコアに反映させてカバレッジ未達の hot path がキューの上位に浮かぶようにします。

設定の調整値は Test › 設定、同梱スキルは Test › スキル を参照。

メトリクスレイヤ何を捕まえるか
coverage_pctソースファイル単位lcov.info から読んだ行カバレッジ。Finding は < 100% のファイルにのみ発行
skip_ratioテストファイル単位ファイル内の skip テスト数 / 総テスト数(%)
test_hotspotソースファイル単位commits × uncov_pct の合成スコア。coverage_pct Finding に hotspot=true を立てる
change_coupling.driftペア単位(サブメトリクス)ソースだけが先に変わっていて、テストがついていけていないペア

加えて構造的な追加: 各 Finding に is_test_file: bool フラグが付き、スキルがテスト側と本番側の Severity を独立に読めるようになります。

「テストスイートから見えていない本番コードはどこか?」

[features.test.coverage].lcov_paths の最初に存在する lcov.info から parse される、ソースファイル単位の行カバレッジ率です。Finding は < 100% のファイルにのみ発行されます。Calibration は 反転値(100 - coverage_pct)を保存するので、他のメトリクスと同じ「value が p95 に達したら Critical」のカスケードがそのまま使えます — フロアの調整は Test › 設定 を参照。

「skip テストの比率が無視できないファイルはどれか?」

テストファイル単位の skip 比率(skip 数 / 総テスト数、パーセンテージ)です。[features.test].test_paths でマッチしたファイルを歩き、言語別の skip マーカーをカウントします — Rust の #[ignore]、Python の @pytest.mark.skip / @unittest.skipIf、JS / TS の it.skip / xit / xdescribe、Go の t.Skip()、ScalaTest の ignore / pending。検出は構造的なので、コメントや文字列リテラル中のマーカーで false positive が出ることはありません。

「カバーするソースについていけていないテストはどれか?」

[features.test] を有効にすると、テスト ↔ ソースのペアの合算 co-change カウントがプロジェクトの中央値を 下回る(テストがソースの動きについていけていない)とき、change_coupling.expected(Advisory)から change_coupling.drift(Medium)に再タグ付けされます。「テストは存在するが、ソースの最近の変更がすべてテストなしで起きている」という意味で読んでください。

ドキュメント ↔ ソースのペアは drift に昇格しません。drift はテスト品質シグナルだからです。

Test Hotspot — 変更があるのにテストがない箇所はどこか

Section titled “Test Hotspot — 変更があるのにテストがない箇所はどこか”

Test Hotspot は code Hotspot の test ファミリ版です。src ファイルを commits × uncov_pct でランクします。スコアが高い = そのファイルは編集が続いている かつ 大部分がテストされていない、という意味です。30 commits ある低 CCN の config-loader でカバレッジ 0% なら本物のテスト対象ですが、code Hotspot は CCN が低いせいで取りこぼします。

lcov に出てこないが git 履歴では触られているファイルは 100% gap(= 未テスト)として扱います。100% カバレッジのファイルはスコア 0 で落ちます。

Test Hotspot 自体は常に Severity::Ok です。スコアの仕事は同じファイルの coverage_pct Finding に hotspot=true を立てることです。解消対象は「Critical AND hotspot=true」のままで、test ファミリ単位にスコープされます。

post-commit ナッジ:「uncovered hotspot」

Section titled “post-commit ナッジ:「uncovered hotspot」”
heal: recorded · 3 critical, 7 high · heal status
· 2 uncovered hotspot

カウントは coverage_pct Finding のうち Severity が High または Critical で、かつ hotspot=true のものです。「次のテストはここに書くべき」の最短リマインダ。[features.test.coverage] がオフのとき、または該当する Finding がないときはこの行は出ません。

/heal-test-review はテストピラミッドのレンズ(unit / integration / e2e)で findings をフレーム化します。/heal-test-patch は 1 コミット 1 件で消化していきます — coverage_pct には未カバーの hot path に unit テストを書く、skip_ratio には理由の成立しなくなった skip を再有効化、change_coupling.drift にはドリフトしたテストとソースを揃え直す。assertion を弱める / 本物の flake を覆い隠すといった refusal はスキル本体に encoded されています。詳しい契約は Test › スキル を参照。