mutation-testing について
Metabase の開発環境で Clojure 名前空間のミューテーションテストを自動化するスキルです。Claude にテスト作成を依頼して変異が検出されるか確認し、Linear の課題とドラフト PR も扱います。
主な機能
- 01ミューテーションカバレッジレポートの生成
- 02カバレッジ関係による関数のグループ化
- 03Claude によるテスト作成
- 04変異の検証とグループの再試行
- 05Linear 課題とドラフト PR の作成
活用シーン
- 01名前空間のミューテーションカバレッジ評価
- 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 で認証済みの
ghCLI - PATH 上で利用可能な
claudeCLI
参照ファイル
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 マップを渡します。
これは以下を実行します:
- ベースラインのミューテーションテストレポートを生成します
- 名前空間用の Linear プロジェクトを作成します
- カバレッジの関係に基づいて関数をグループ化します
- 各グループごとに: ブランチを作成 → Claude を呼び出してテストを作成 → 検証 → 必要に応じて再試行 → コミット & プッシュ → Linear イシューを作成 → ドラフト PR を作成します
- 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 プロジェクトを再利用します
コメント
Markdown 対応