◉CLAUDE LABEN
●2.1.301 — vim の % モーション、VS Code パネルでの LaTeX 数式表示、使用量上限待ちのリトライ監視の上限が入りました(10/15)●2.1.299 — 200K トークン超で約54分放置した会話はアイドル圧縮。MCP の許可ルールは名指ししたサーバーだけに一致します●SONNET 4.5 — Claude API での提供終了は 11/30、残り45日。移行先は Sonnet 5.5●WINDOWS — 日本語の環境でだけフックが黙って壊れる報告があり、文字コードの確認が呼びかけられています●FAST MODE — Opus 5.5 の Fast mode がリサーチプレビューを終え、ベータヘッダーが不要になりました(10/15)●NEW — Cowork に渡したフォルダの先頭に、十行の約束ファイルを置いてみました●2.1.301 — vim の % モーション、VS Code パネルでの LaTeX 数式表示、使用量上限待ちのリトライ監視の上限が入りました(10/15)●2.1.299 — 200K トークン超で約54分放置した会話はアイドル圧縮。MCP の許可ルールは名指ししたサーバーだけに一致します●SONNET 4.5 — Claude API での提供終了は 11/30、残り45日。移行先は Sonnet 5.5●WINDOWS — 日本語の環境でだけフックが黙って壊れる報告があり、文字コードの確認が呼びかけられています●FAST MODE — Opus 5.5 の Fast mode がリサーチプレビューを終え、ベータヘッダーが不要になりました(10/15)●NEW — Cowork に渡したフォルダの先頭に、十行の約束ファイルを置いてみました
記事一覧/API & SDK
⬡ API & SDK/2026-04-26上級

Claude API のReplay駆動テスト — 本番応答を録画して回帰テストを成立させる設計パターン

非決定的なClaude APIの応答を録画・再生し、回帰テストを安定させるReplay駆動テストの設計です。Messages API・Streaming・Tool Use多段それぞれのカセット実装、メッセージハッシュをキーにする理由、CIへの録画ガード組み込み、本番障害の再現への応用まで扱います。

api-sdk13testing5production87claude-api83ci-cd8

✦ プレミアム記事

「テストが LLM の気まぐれで毎回違う結果を返してきて、CI が落ちているのか本当に壊れているのか分からない」— Claude API を本番投入したチームの多くが、この壁にぶつかります。私もマルチエージェントの本番システムを運用していて、リファクタ後にテストが赤くなった原因を半日追いかけた末に「単に Claude が前回と少し違う言い回しをしただけだった」と気づいたことが何度もあります。

ここではRuby の VCR や Python の VCR.py、JavaScript の Polly.js が確立した「カセット(録画)方式」のテストパターンを、Claude API の Messages・Streaming・Tool Use の全シナリオに適用する設計と実装を扱います。単なる API モックではなく、本物の Claude 応答を一度だけ呼び出して保存し、CI ではそれを再生します。この仕組みが入ると、テストは決定的になり、CI コストはゼロに近づき、本番障害の再現も可能になります。

なぜ普通のモックでは足りないのか

Claude API のテストで最初に思いつくのは responses.create を unittest.mock で差し替える方法でしょう。私もそこから始めましたが、3 ヶ月運用して限界を感じました。理由は3つあります。

1つ目は「モックの応答が本物と乖離する」問題です。 Claude のレスポンス形式は頻繁に拡張されます。stop_reason の新しい値、content 配列の新ブロック型、usage オブジェクトのフィールド追加。手書きのモックは本物の応答を写し取っただけのスナップショットなので、SDK のバージョンアップや新機能リリースに追従できません。テストは緑のまま本番だけ壊れる、という最悪のパターンに陥ります。

2つ目は「Tool Use のフローが組み立てづらい」問題です。 Claude にツールを使わせるテストでは、API が「このツールを呼んでください」と返した後、ツール結果を渡してさらに API を呼ぶ、という最低2往復のシーケンスが発生します。これを手書きモックで組み立てると、tool_use_id の一致、role の順序、content ブロックの種類など、間違いやすい箇所が大量に出てきます。

3つ目は「Streaming の SSE イベント列を再現するのが面倒」です。 message_start、content_block_start、content_block_delta、content_block_stop、message_delta、message_stop を正しい順序で吐き出すモックを書くより、本物のストリームを録画してそのまま再生する方がはるかに信頼できます。

カセット方式は、これら全ての問題を「最初に1回だけ本物の API を叩いて、その応答を JSON または JSONL で保存し、テスト時はそれをそのまま返す」というシンプルな仕組みで解決します。

カセット方式の全体設計

実装に入る前に、骨格だけ先にお伝えします。私の手元では、以下の 3 層に分けて組み立てております。

第1層は「カセットストア」です。テストごとに固有の名前を持つ .json または .jsonl ファイルを tests/cassettes/ 配下に保存します。1テスト1カセットを徹底することで、どのテストが何を録画したかが grep で追えるようになります。

第2層は「インターセプター」です。anthropic.Anthropic クライアントの messages.create を実行時に差し替え、カセットが存在すれば再生、存在しなければ実 API を呼んで結果を保存します。record_mode というフラグで once(無ければ録画)、new_episodes(追加録画)、none(再生のみ。録画が無ければ失敗)の3モードを切り替えます。

第3層は「リクエストマッチャー」です。同じカセット内に複数のリクエストが録画されている場合、どの録画と現在のリクエストを照合するかのロジックです。messages・model・system・tools・サンプリング設定を 1 つの JSON にまとめ、そのハッシュをキーにします。ここに入れ忘れた引数は、変えても同じ録画が返ります——後の節で、私がこれに一度騙された話を書きました。

この3層が分離されていると、後からカセットフォーマットを変えたり、リクエスト一致の基準を緩めたりするときに、テスト側を書き換えずに済みます。

✦

ここまでお読みいただきありがとうございます。

この記事の続きを読む

この先には、実装コードやベンチマーク結果など、実務でお役に立てる内容をご用意しています。このサイトは広告を掲載しておらず、サーバーや開発にかかる費用はメンバーの皆様のご支援で成り立っています。もしお役に立てていましたら、ご支援いただけますと大変ありがたいです。

この記事で得られること
✦録画のキーに system を入れ忘れると、プロンプトを書き換えてもテストが緑のまま古い応答を再生し続けます。その再現と直し方まで含めて扱います
✦VCR.py や Polly.js のカセット方式を、Claude API の Messages・Streaming・Tool Use という 3 つの面すべてに適用する実装コードが手に入ります
✦本番障害が発生したときに当該リクエストを再現してデバッグできる仕組みが手に入り、再現できないバグに振り回されなくなります
Stripe による安全な決済 · いつでもキャンセル可能
✦

この記事を購入する

この先の内容をすべてお読みいただけます。一度のご購入で、いつでも何度でもアクセスできます。このサイトは広告を掲載しておらず、皆さまのご支援がサーバー費用などの運営を支えています。

または
メンバーシップなら全記事が読み放題 →
シェア

お読みいただきありがとうございます

Claude Lab は広告なしで運営しており、サーバー費用などの運営コストはメンバーシップのご支援で賄っています。実装コード・ベンチマーク・本番設計パターンなど、実務でお役立ていただける記事を毎日更新しています。もし読んでよかったと感じていただけましたら、ぜひご覧ください。

  • ✦コピー&ペーストで使える実装コード付き
  • ✦毎日新しい上級ガイドを追加
  • ✦¥580/月 または ¥1,480 の永久アクセス
メンバーシップを見る →

関連記事

⬡ API & SDK2026-03-27
Claude API LLM評価パイプライン構築ガイド — Claude-as-Judge・プロンプトA/Bテスト・品質スコアリングの実装パターン
Claude API を使った LLM アプリケーション評価パイプラインの設計と実装。Claude-as-Judge、プロンプト A/B テスト、品質スコアリング、回帰テストの本番実装パターンを扱います。
⬡ API & SDK2026-05-26
Claude API の構造化レスポンスを本番で安定させる — tool_use と JSON Schema、多層検証の実装メモ
Claude API の応答を JSON で受け取る実装は数行で書けますが、本番運用では「形は正しいが意味が壊れている」レスポンスにどう備えるかが分かれ目になります。tool_use・JSON Schema・ドメイン検証を組み合わせた多層パイプラインを、壁紙アプリの分類処理での実体験を交えて整理しました。
⬡ API & SDK2026-05-22
Claude API の tool_result could not be submitted が再発しないための回復ハンドラ設計
Claude API でエージェントを長時間動かしていると、ある日突然 'tool_result could not be submitted' が連発し始めることがあります。再試行しても直らない、ストリーミング途中で死ぬ、そして次のセッションでもまた出る — 常時稼働のエージェント基盤で実際に踏み抜いた4種類の原因と、TypeScript で書いた回復ハンドラの実装を整理しました。