レガシーコードや引き継いだコードベースにテストがまったくない――これは多くの開発者が直面する「地雷原」のような状況です。リファクタリングしたくても既存の動作が不明で手を出せず、修正するにも何が壊れるかわからない。本記事では、Claude Codeを活用してテストカバレッジゼロのコードに段階的にテストを追加していく実践的なワークフローを紹介します。
この記事のポイント
- テストなしのレガシーコードに対して「特性テスト(Characterization Tests)」から始めるアプローチ
- コードを「修正」するのではなく、まず「現在の動作を理解・記録」することの重要性
- Claude Codeにコードを読ませてから、観察された振る舞いに基づいてテストを生成させる手法
テストを「盲目的に」書く問題点
コードの動作を理解しないままテストを書くと、コードが「実際にやっていること」ではなく「こうだろうと思い込んでいること」をテストしてしまいがちです。結果としてエッジケースを見逃し、テストは通るのにバグがすり抜けるという最悪のパターンに陥ります。
より良いアプローチは、まずClaude Codeにコードを「読ませる」ことです。修正や改善を求めるのではなく、純粋にコードの現在の振る舞いを分析・観察させ、その観察結果に基づいてテストを生成させます。これにより、開発者の思い込みに左右されない、実態に即したテストが得られます。
フェーズ1:特性テスト(Characterization Tests)で現状を記録する
筆者がテスト未整備のコードベースに取り組む際、最初に行うのが「特性テスト」の作成です。特性テストとは、コードの正しさを検証するものではなく、現在の動作がどうなっているかをそのまま記録するテストです。バグであっても、意図しない動作であっても、現時点での振る舞いをキャプチャします。
具体的には、Claude Codeに対して次のように指示します:
Claude、この認証ミドルウェア(src/auth/middleware.js)を読んでください。
何も修正しないでください。現在何をしているかだけを理解してください。
そして、実際の動作を文書化するJestの特性テストを書いてください。
気づいた奇妙なエッジケースや予期しない出力も含めてください。
このアプローチの強みは、Claude Codeが開発者自身も気づいていなかった動作を発見してくれることです。コードの隠れた分岐や、暗黙のデフォルト値、予期しないエラーハンドリングなど、人間のコードレビューでは見落としがちな部分を網羅的にテストケースとして洗い出してくれます。
なぜ「読む→テスト」の順番が重要なのか
従来のアプローチでは、「コードを貼り付けてテストを書いて」と一気に依頼しがちです。しかし筆者のワークフローでは、意図的に2段階に分けています。
最初のステップでClaude Codeにコードを「読む」ことだけに集中させることで、AIはコードの構造、依存関係、データフロー、例外処理のパターンを深く理解します。その理解をベースにテストを書かせることで、ハッピーパス(正常系)だけでなく、エラーケースやエッジケースまでカバーした質の高いテストスイートが生成されます。
この「理解してからテスト」という原則は、人間の開発者がテストを書く際のベストプラクティスとも一致しています。違いは、Claude Codeがこのプロセスを高速かつ網羅的に実行できることです。
実践してみよう
以下はClaude Code CLIを使って、テスト未整備のExpressミドルウェアにテストを追加する例です:
curl -X POST https://api.simplylouie.com/v1/chat/completions \
-H 'Authorization: Bearer YOUR_KEY' \
-H 'Content-Type: application/json' \
-d '{"model":"claude-opus-4-5","messages":[{"role":"user","content":"Read these 500 lines of untested Express middleware and write Jest tests covering the happy path, error cases, and edge cases: [paste code]"}]}'
ただし、より実践的にはClaude Code CLIを直接使い、対話的にコードを読ませてからテストを生成させるワークフローが推奨されます。
知っておくと便利なTips
- 特性テストは「現状のスナップショット」として機能するため、後のリファクタリング時に回帰テストとして活用できる
- Claude Codeに「修正しないで」と明示的に伝えることで、コードの理解に集中させられる
- エッジケースや予期しない動作もテストに含めることで、将来のバグ修正時に「意図した変更」と「予期しない破壊」を区別できる
- 一度に大量のコードを渡すより、モジュール単位で段階的にテストを追加していく方が精度が高い
まとめ
テスト未整備のレガシーコードへのテスト追加は、多くの開発者が避けたい作業の筆頭です。しかしClaude Codeを活用することで、このプロセスを大幅に効率化できます。ポイントは「まず読ませて理解させ、次にテストを書かせる」という2段階アプローチです。特性テストから始めることで、コードの現在の動作を安全に記録し、そこからリファクタリングや改善を進める足場を築けます。AIをテスト作成のパートナーとして活用する実践的な手法として、ぜひ試してみてください。


コメント