mcpField
M
mutation-testing

mutation-testing

github.com/metabaseテスト・品質50.1k94 回インストール1 日前に更新
リポジトリ

mutation-testing について

Metabase の開発環境で Clojure 名前空間のミューテーションテストを自動化するスキルです。Claude にテスト作成を依頼して変異が検出されるか確認し、Linear の課題とドラフト PR も扱います。

主な機能

  1. 01ミューテーションカバレッジレポートの生成
  2. 02カバレッジ関係による関数のグループ化
  3. 03Claude によるテスト作成
  4. 04変異の検証とグループの再試行
  5. 05Linear 課題とドラフト PR の作成

活用シーン

  1. 01名前空間のミューテーションカバレッジ評価
  2. 02テスト作成と後続作業の追跡

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/metabase/metabase --skill mutation-testing

インストール後、Claude Code で/mutation-testingを入力して読み込まれたか確認します。

詳細

ミューテーションテストスキル

このスキルはミューテーションテストをエンドツーエンドで実行します。カバレッジレポートを生成し、関数をグループ化し、claude -p を呼び出してテストを作成し、ミューテーションがキルされたことを検証し、Linear のイシューを含むドラフト PR を作成します。

前提条件

  • Metabase の開発環境に接続された、稼働中の nREPL
  • 有効な Linear のパーソナル API キーを設定した LINEAR_API_KEY 環境変数
  • GitHub で認証済みの gh CLI
  • PATH 上で利用可能な claude CLI

参照ファイル

  • dev/src/dev/coverage.clj — ミューテーションテストエンジン (レポートを生成し、ミューテーションを実行します)
  • dev/src/dev/mutation_testing.clj — オーケストレーション、Linear API、PR ヘルパー

呼び出し

引数は Clojure の名前空間で、その後に任意でベースブランチを指定します:

/mutation-testing metabase.lib.order-by
/mutation-testing metabase.lib.order-by --base-branch release-x.52.x
/mutation-testing metabase.lib.order-by --project-id abc-123
/mutation-testing metabase.lib.order-by --base-branch release-x.52.x --project-id abc-123
  • --base-branch: 設定内の値 (set-config! で設定) にデフォルトし、設定されていない場合は "master" になります。
  • --project-id: 指定した場合、イシューは新規作成ではなく、この既存の Linear プロジェクトに追加されます。

手順

1. 引数を解析する

$ARGUMENTS を解析して以下を抽出します:

  • namespace (必須) — 最初の位置引数
  • --base-branch (任意) — 指定した場合、次の引数がベースブランチ名です
  • --project-id (任意) — 指定した場合、次の引数が既存の Linear プロジェクト ID です
2. 読み込みと設定
(require '[dev.mutation-testing :as mut-test] :reload)
(require '[dev.coverage :as cov] :reload)

これが最初の呼び出しである場合 (または REPL が再起動された場合) は、Linear チームを設定します:

(mut-test/list-teams!)
(mut-test/set-config! {:team-id "<id>"})
3. 実行
(mut-test/run! '<target-ns>)
;; Or with options:
(mut-test/run! '<target-ns> {:base-branch "release-x.52.x"})
(mut-test/run! '<target-ns> {:project-id "abc-123"})
(mut-test/run! '<target-ns> {:base-branch "release-x.52.x" :project-id "abc-123"})

引数でそれらのフラグが指定されていた場合は、:base-branch や :project-id を含む opts マップを渡します。

これは以下を実行します:

  1. ベースラインのミューテーションテストレポートを生成します
  2. 名前空間用の Linear プロジェクトを作成します
  3. カバレッジの関係に基づいて関数をグループ化します
  4. 各グループごとに: ブランチを作成 → Claude を呼び出してテストを作成 → 検証 → 必要に応じて再試行 → コミット & プッシュ → Linear イシューを作成 → ドラフト PR を作成します
  5. PR リンクを含むサマリーを出力します
4. 失敗の処理

グループの処理中に失敗した場合、run! はエラーを補足して次のグループへ進みます。単一のグループを手動で再試行するには:

;; Get the parsed namespace info
(def parsed (mut-test/parse-namespace '<target-ns>))

;; Run coverage to get the data
(def coverage-results (cov/test-namespace (:target-ns parsed) [(:test-ns parsed)]))

;; Group and find the one you want
(def groups (mut-test/group-functions coverage-results))

;; Process just that group
(mut-test/process-group! parsed (nth groups <index>))
5. プロンプトの検証 (ドライラン)

Claude を呼び出さずに、Claude が何を認識するかを確認するには:

(def parsed (mut-test/parse-namespace '<target-ns>))
(def coverage-results (cov/test-namespace (:target-ns parsed) [(:test-ns parsed)]))
(def groups (mut-test/group-functions coverage-results))
(println (mut-test/build-test-prompt
           (merge (select-keys parsed [:target-ns :test-ns :source-path :test-path])
                  (select-keys (first groups) [:fn-names :mutations]))))

設定

  • チーム ID: REPL セッションごとに 1 回、(mut-test/list-teams!) と (mut-test/set-config! {:team-id "..."}) で設定します
  • プロジェクト ID: run! が create-project-for-namespace! を呼び出したときに自動的に設定されます
  • ベースブランチ: デフォルトは "master" です。(mut-test/set-config! {:base-branch "release-x.52.x"}) で上書きするか、run! の第 2 引数として {:base-branch "..."} を渡します
  • プロジェクト ID: 設定されている場合 (set-config! または run! の opts 経由)、run! は新規作成せずに既存の Linear プロジェクトを再利用します

コメント