qa-test-code-coverage について
qa-test-code-coverageは、QA・開発チーム向けに、既存の手動Markdownケースと自動E2Eテストをソースファイルに対応づけ、coverage.tests.ymlを作成するスキルです。テスト識別子を使った共通マップにより、Testomat.ioのreporterがコード変更に応じてテストを選べます。
主な機能
- 01手動・自動テストの棚卸し
- 02テスト識別子とソースファイルの対応付け
- 03coverage.tests.ymlの生成と検証
- 04コード変更に基づくテスト選択
- 05書き込み先とキャッシュの制限
活用シーン
- 01プロジェクトのテスト・コード対応表を作成
- 02手動ケースとE2Eテストを一元的に関連付け
- 03コード差分に応じて実行対象を選択
- 04未対応または対応不能なテストスイートを特定
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ testomatio/ skills --skill qa-test-code-coverageインストール後、Claude Code で/qa-test-code-coverageを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
references/COVERAGE_FILE_FORMAT.mdE2E_FRAMEWORKS.mdscripts/check-coverage.mjs詳細
テストからコードカバレッジへ
プロジェクトのテスト(Markdown 形式の手動テストケースと、自動化された E2E テスト)およびソースコードを分析します。ソースファイル(または glob)からテスト識別子(スイート ID、テスト ID、タグ)への対応表 coverage.tests.yml を作成します。Testomat.io では手動テストと自動テストを 1 つのプロジェクトで管理するため、両方に同じカバレッジファイルを使用します。@testomatio/reporter はこのファイルを読み込み、差分の影響を受けるテストのみを実行します(Step 6)。
重要な制約
- 存在するテスト(Markdown 形式の手動テストケース、自動化された E2E テスト、またはその両方)をマッピングします。 ユニットテストは対象外です。新しいテストの作成を提案しないでください。
- 書き込みが許可されるのは、次の 3 か所のみです。それ以外には何も書き込まないでください。
- カバレッジファイル。デフォルトは
coverage.tests.yml、またはユーザーが指定したパスです。 .testeiya/キャッシュディレクトリ。自動テストリポジトリのクローン、および Testomat.io からの手動テストケースの取得に使用します(Step 1)。.gitignore。.testeiya/の行がない場合に追加します。
- カバレッジファイル。デフォルトは
- ソースファイルやテストファイルは絶対に変更しないでください。
- 追跡対象のフォルダーにテストを取得またはクローンしないでください。gitignore 対象の
.testeiya/にのみ取得してください。 - カバレッジファイルのすべての内容は、このプロジェクトに由来する必要があります。 ファイルキーはソースツリーから、識別子は Step 2 の一覧から取得してください。このスキルのドキュメントにあるパスや ID はコピーしないでください。これらはプレースホルダーです。
- 場当たり的なスクリプトやパーサーは使用せず、Python は絶対に使用しないでください。 ファイルの読み取りと
grepのみ使用できます。唯一の例外は Step 5 の同梱チェッカーです。それ以外では、1 行のnode -e '…'までにしてください。 - 積極的に作業し、代表的なサンプルだけで止めないでください。 ドメインごとのエントリーが数件だけでは、作業未完了です。Step 4 の完了条件を満たすまで、続行の許可を求めずマッピングを続けてください。
- 出力ファイルに書き込めない場合、またはテストが見つからず、ユーザーが Step 1 のすべての選択肢を拒否した場合は中止してください。
ワークフロー
Step 1:プロジェクトを調査する
scan-automation-projectスキルを実行して、プロジェクトの一覧を作成します。その出力を信頼できる情報源として使用し、スキャンを重複して実行しないでください。- 結果から次の情報を取得します。
- 手動テスト —
.test.mdファイルと、スイート/テストのタイトル。 - 自動テスト — E2E テストファイルとフレームワーク。スキャン結果が不明瞭な場合は、E2E Frameworks を参照してください。
- プロジェクト概要 — 言語、フレームワーク、複雑さ(Step 4 でのサブエージェント分担に使用)。
- 手動テスト —
- 存在するものをすべてマッピングします。両方ある場合は 1 つのカバレッジファイルにまとめます。どちらか一方だけでもかまいません。
- ❓ スキャンでテストが 1 件も見つからなかった場合(
.testeiya/キャッシュも確認します)、ユーザーに次の選択肢を尋ねます。- Testomat.io から手動テストケースを取得する —
sync-test-cases-with-tmsを使ってキャッシュに取得します:npx check-tests pull -d .testeiya/test-cases。.gitignoreに.testeiya/がない場合は追加し、再度スキャンします。 - 自動テストのリポジトリをクローンする:
git clone <url> .testeiya/e2e-tests。.gitignoreに.testeiya/がない場合は追加し、再度スキャンします。 - スキャン対象から漏れているディレクトリを指定してもらい、そのディレクトリを再度スキャンします。
- 中止します。
- Testomat.io から手動テストケースを取得する —
- ❓ 自動テストのフレームワークが 2 つ検出された場合(Jest と Playwright など)、どちらが E2E フレームワークかをユーザーに尋ねます。カバレッジのフィルタリングはランナーごとに実行されます。
ステップ 2:テスト情報を抽出する
次の 2 種類から識別子を 1 つの一覧にまとめます。
- スイート ID —
@S+ 8 文字。 - テスト ID —
@T+ 8 文字。 - タグ — その他の
@wordマーカー。 - コンテキスト — タイトル、ステップ、ページオブジェクト、アクセスしたルート。これはステップ 4 のマッピングに使用します。
ID の記載場所:
- 手動テストケースは Classical Tests Markdown Format に従います。ID は
/ブロック内、タグはタイトルとtags:行に記載されています。 - 自動テストでは、
describe/it/test/Feature/Scenarioのタイトルに ID が含まれます。E2E Frameworks を参照してください。
ファイルを読むか、テストを格納するディレクトリで grep を実行します。
grep -rnE 'id:[[:space:]]*@[ST]' <dir> # manual suite/test IDs
grep -rnoE '@[ST][0-9a-f]{8}' <dir> # IDs in automated test titles
grep -rhoE '@[A-Za-z0-9_-]+' <dir> | sort -u # every @token, tags included
ID がない場合、テストは Testomat.io と同期されていないため、レポーターはそれらを選択できません。
- ❓ ID のない手動テストファイルがある場合:先に
sync-test-cases-with-tmsでプッシュするか、該当ファイルをスキップするかを確認します。 - ほとんどのファイルに ID のない自動テストがある場合:作業を中断し、まずユーザーに
npx check-tests@latest <Framework> "<glob>" --update-idsを実行するよう案内します(フレームワークごとのコマンドは E2E Frameworks を参照してください)。
ステップ 3:ドメインごとにカバレッジマップを計画する
コードベースをファイルごとに調べないでください。 まずアプリケーションのドメイン領域を特定し、ステップ 4 で領域ごとにマッピングします。
- 両方の情報源から領域を導き出します。
- ステップ 2 のスイートツリー — スイートの階層は、QA チーム独自の製品マップです。
- ソースの構造 — モジュール、ルート、サービス、エントリーポイント。
- 各領域を、それをテストするスイートおよび実装するソースフォルダーと対応づけます。
- 重要度の高い順に領域を並べます。最も重要なのは決済/請求、認証とアクセス制御、データの整合性、コアビジネスフローです。次にサポート機能、最後に周辺的な UI を並べます。スイートの規模も重要度の指標です。QA が重点的にテストしているものは、重要と見なされています。
- マッピングを始める前に、優先順位を付けた計画をユーザーに提示します。
- ビジネスコードのみを対象とします。テストコード、手動テスト用ディレクトリ、依存関係/ビルド/ベンダーフォルダー、フレームワーク設定、ロックファイルは除外します。
- テンプレートとビューはマッピング対象のソースです(
.vue、.erb、.blade.phpなど)。テストではレンダリングされた UI を確認するため、コードと同様にマッピングします。 - ❓ 領域やその優先順位が不明確な場合は、ユーザーに確認します。
ステップ 4:ソースファイルをテストに対応付ける
ステップ 2 のインベントリが作業リストです。インベントリ内のすべてのスイートがカバレッジファイルに含まれるか、理由を添えて未対応として記録された場合にのみ、対応付けは完了です。 ステップ 3 の順序で作業してください。最も重要なものから着手し、中断されても重要な領域を確実にカバーできるようにします。必ず両方のパスを実行してください。
- コード → テスト:各領域について、ソースファイルとサブツリーを、それらを確認するテストの識別子に対応付けます。
- テスト → コード:インベントリを確認し、マップにまだ含まれていない各スイートについて、対象となるソースを見つけて追加するか、対応付けできない理由(この機能のコードがここにない、外部システム、ユーザー入力が必要)を記録します。
プロジェクトの規模(ステップ 1 で確認したコードベースのサイズとスイート数)に応じて、パスの実施方法を調整します。
- 小規模なコードベースでスイート数も少ない場合は、このセッション内で両方のパスを実行します。
- 大規模なコードベース、または数十個のスイートがある場合は、サブエージェントを並行して起動します。コード → テストのパスでは領域ごとに 1 つ、続いてテスト → コードのパスでは未対応のまま残ったスイートのバッチごとに 1 つ起動します。各サブエージェントには次の情報を渡します。
- 担当範囲:1 つの領域(その領域のスイートとソースフォルダー)、またはスイートのバッチ。
- ステップ 2 のテストインベントリ全体。サブエージェントに再抽出させないでください。
- 以下の対応付けルールと カバレッジファイル形式。
- 担当範囲のみの YAML 断片を返すよう指示します。
- 断片を 1 つのマップに統合し、重複キーと空のエントリを削除します。ファイルを書き込むのはメインセッションのみです(ステップ 5)。
候補となる各ソースファイルについて、テストスイートの拡大後も適切なテストを選択し続けられる識別子を選びます。
- スイート(
@S)— デフォルトです。スイート内の大半のテストがそのファイルに関連します。 - タグ(
@word)— 該当するテストが複数のスイートにまたがっています。 - テスト(
@T)— 例外です。スイート内の 1、2 個のテストだけがそのファイルに一致する場合に限り使用します。
ルール:
- 同じスイートまたはカテゴリから複数のテスト ID を指定する場合は、スイートまたはタグに置き換えます。 後から追加されるテストも自動的に対象になります。テスト ID のリストは古くなります。
- 同じエントリにそのスイートがすでに含まれている場合、そのスイートのテスト ID は列挙しないでください。
- キーにはリポジトリルートからの相対パスでソースファイルのパスまたは glob を指定します。サブツリー全体が同じ識別子に対応する場合は glob を使用します。
- 手動の識別子と自動の識別子は、1 つのエントリに自由に混在させられます。
- 空のエントリを作成しないでください。
- 各識別子には、そのスイート/テスト/タグのタイトルを示す
#コメントを付けます。
YAML の構文:カバレッジファイル形式。
ステップ 5:カバレッジファイルを保存して検証する
#コメントを残したまま、YAML を出力パスに書き込みます。- キーにはこのリポジトリ内のソースファイルのパスを指定します。
.testeiya/...のパスは使用しないでください。 - 同梱のチェッカーで確認します。このチェッカーはプロジェクト内ではなく、このスキルの
scripts/ディレクトリ(この SKILL.md と同じ場所)にあります。スキルの場所からパスを解決してください。
npx js-yaml coverage.tests.yml | node <path-to-this-skill>/scripts/check-coverage.mjs
- チェッカーはディスク上に存在しないキーと空のエントリを検出し、参照されているすべての識別子を表示します。それらをステップ 2 のインベントリと照合してください。どれが実在するか判断できるのはあなただけです。
- 逆方向も確認します。インベントリ内のすべてのスイートがファイルに含まれているか、未対応リストに記録されている必要があります。どちらにもないものがあれば、テスト → コードのパスは完了していません。ステップ 4 に戻ってください。
ステップ 6:カバレッジの完全性を報告する
ユーザーに次の内容を提示します。
- 対応付け済みのスイート数とインベントリ内の総スイート数。意味がある場合は、テスト数とタグ数についても同様に示します。
- 未対応の各スイートとその理由。
- 作成した YAML(大きい場合は、そのパスとエントリ数)。
Step 7: 次の手順を提示する
@testomatio/reporter でファイルを使用する方法をユーザーに伝えます。
# Automated tests — the project's runner command must be passed in
npx @testomatio/reporter run "npx playwright test" \
--filter "coverage:file=coverage.tests.yml,diff=main"
# Manual tests — creates a pending run with only the affected cases
npx @testomatio/reporter run --kind manual \
--filter "coverage:file=coverage.tests.yml,diff=main"
- フレームワークごとのランナーコマンドと GitHub Actions の例:Coverage File Format。
- 1 つの回帰サイクルにおける手動実行と自動実行をまとめるには、両方のコマンドで同じ
TESTOMATIO_RUNGROUP環境変数を設定します。 - CI とチームメンバーが同じマッピングを使用できるよう、カバレッジファイルをコミットすることを推奨します。
- CI ではベースブランチとの差分を取ります —
diff=origin/main— また、fetch-depth: 0でチェックアウトします。 - プルまたはクローンしたテストは、再実行用に Git で無視される
.testeiya/キャッシュに保持されます。削除したり、追跡対象のフォルダーに移動したりしないでください。
Step 8: 次のアクションを提案する
- マップを CI に組み込みます — PR ごとに実行を作成し、プレビューまたはマージ時に起動します。
setup-change-aware-pr-testingに委任します。 - 影響を受けるテストを今すぐターミナルから実行します。
run-tests-with-testomatio-reporterに委任します。 - カバレッジの不足 — ソース内の機能に対応するテストがありません。承認を得たうえで、新しいケースを提案します(
qa-write-test-casesに委任します)。 - デッドテスト — ソースに存在しなくなった機能のテストです。
- インベントリーを参照して、「X のテストはありますか?」などの質問に答えます。
- プルした手動テストケースを編集する場合は、
.testeiya/test-cases/で編集し、sync-test-cases-with-tmsでプッシュして戻します。
参考資料
- Coverage File Format — カバレッジ YAML の文法、レポーターの契約、GitHub Actions の例。
- E2E Frameworks — フレームワークの検出シグナル、ID の格納場所、フレームワークごとの
check-testsコマンド。 - Manual test markdown format —
qa-write-test-casesが管理する正式な形式。