Claude Codeにテストを作らせる方法|期待値を先に決める
更新日:2026年10月6日
Claude Codeへテスト生成を頼むときは、実装を読む前に「入力と期待結果」を決めます。この記事では合計関数の5テストを実行し、意図的に壊した実装を検出できるか確かめる手順を示します。
対象は、小さなPython関数とテストをターミナルで実行できる開発者です。掲載コードは手動作成した検証用教材です。Claude Codeで実際に生成したコードや利用体験としては掲載していません。 Claude Codeへの依頼文と、返ってきたテストのレビュー方法を、ローカルで検証した参照例と分けて説明します。
1. 期待値と異常入力を先に定義する
この教材のtotalは「整数だけを含むlistを受け取り合計を返す」関数です。Pythonではboolを整数として扱える場面がありますが、今回はTrue / Falseを受け付けない仕様にします。
| テスト | 入力 | 期待結果 | 検証したい条件 |
|---|---|---|---|
| 正常 | [1, 2, 3] | 6 | 複数要素を合計 |
| 境界 | [] | 0 | 空リスト |
| 負数 | [-2, 3] | 1 | 負数を落とさない |
| 不正な容器 | None | TypeError | 空入力とNoneを混同しない |
| 不正な要素 | [True], [1.5], ["1"] | 各TypeError | 勝手な型変換をしない |
この表は今回の仕様です。別の業務で小数やtupleも受け付けたい場合は、先に表を変更します。現状の実装から期待値を逆算して作ると、実装に含まれる誤りを固定してしまいます。
2. Claude Codeへの依頼文
Claude Codeが使える既存の開発環境で、対象の関数と上の表を参照させます。導入・認証の手順はこの記事では扱いません。生成テストを実行する操作の流れはClaude Codeの公式ワークフローも参照してください。
total(values)は整数だけを含むlistを受け取ります。True、float、str、NoneはTypeErrorです。正常[1,2,3]→6、空[]→0、負数[-2,3]→1と、異常入力のunittestを作成してください。実装ファイルは変更せず、テストファイルだけ追加してください。期待値は仕様から決め、totalをもう一度呼んで期待値を計算しないでください。各ケースの意図と実行コマンドを説明してください。
生成後は差分を見て、変更対象がテストだけか確認します。テストを通すために「Noneも0」「負数を除く」などの仕様変更が混ざっていれば、採用前に戻して検討します。テスト数だけで品質を評価せず、期待値の根拠を表へ対応させます。
3. 手動の参照コードで工程を試す
検証環境はmacOS(Darwin arm64)、Python 3.14.2です。外部ライブラリ、APIキー、ネット接続は不要です。Pythonが入った端末で python3 --version を確認し、空の作業フォルダーを作ってください。Windowsでは以下の python3 を、利用環境に応じて py に読み替えます。掲載コード・入力はすべて架空の学習用です。
以下を total_test.py に保存します。実装とテストを1ファイルにまとめた学習用です。実プロジェクトではtotalを実装ファイルからimportし、生成されたテストを別ファイルへ保存してください。MUTATIONの分岐は意図的な不具合を試す教材専用で、製品コードへは入れません。
import os
import unittest
# Hand-written reference implementation, not generated by Claude Code.
def total(values):
if os.environ.get("MUTATION") == "zero":
return 0
if os.environ.get("MUTATION") == "positive":
return sum(v for v in values if v > 0)
if not isinstance(values, list) or any(type(v) is not int for v in values):
raise TypeError("list of integers required")
return sum(values)
class TotalChecks(unittest.TestCase):
def test_normal(self):
self.assertEqual(total([1, 2, 3]), 6)
def test_empty(self):
self.assertEqual(total([]), 0)
def test_negative(self):
self.assertEqual(total([-2, 3]), 1)
def test_none(self):
with self.assertRaises(TypeError):
total(None)
def test_invalid_elements(self):
for values in [[True], [1.5], ["1"]]:
with self.subTest(values=values):
with self.assertRaises(TypeError):
total(values)
if __name__ == "__main__":
unittest.main(verbosity=2)
python3 total_test.py
2026年10月5日の実行では、5テストメソッドすべてがok、Ran 5 tests / OK、終了コード0でした。不正要素は1メソッド内の3つのsubTestとして実行しています。
assertEqual と assertRaises を使うことで、値が一致することと、想定の例外が出ることを別々に検査できます。仕組みはPython unittest公式ドキュメントで確認できます。
4. 意図的に壊して、テストの検出力を確かめる
macOS / Linuxのターミナルでは、次のコマンドで2種類の変異を試せます。
MUTATION=zero python3 total_test.py
MUTATION=positive python3 total_test.py
WindowsのPowerShellなら $env:MUTATION="zero"; py total_test.py として実行し、次にpositiveへ変更します。終わったら Remove-Item Env:MUTATION で設定を消し、通常のテストを実行してください。
| 状態 | 教材へ入れた誤り | 実際の検出 | 結果 |
|---|---|---|---|
| 通常 | なし | 5テスト成功 | 終了コード0 |
| zero | 型検証前に常に0を返す | 正常・負数・異常入力が失敗 | 終了コード1、failures=6 |
| positive | 型検証前に正の値だけ加算 | 負数が3となり期待値1と不一致。不正要素でも仕様違反 | 終了コード1、failures=3 |
zeroでは、空リストのテストだけは通ります。空入力だけを用意しても、常に0を返す誤実装を見逃すことが分かります。positiveでは正常[1,2,3]と空入力が通っても、負数を扱うケースで誤りを検出します。失敗数にはsubTestが含まれるため、5メソッドでもfailures=6と表示される場合があります。
これら2変異を検出しても、すべての誤実装に対する検出力を保証するものではありません。桁の大きな整数や、入力listを変更してしまう実装の検査などは、必要に応じて追加します。
生成されたテストを採用する前のレビュー
表の5項目がそれぞれテストへ対応するか、期待値が固定されているか、TypeErrorを別の例外と取り違えていないかを確認します。次に、生成テストを正常実装で通し、コピーした検証用コードへ上の変異を入れて失敗することを確かめます。実ファイルを壊したまま残さず、最後に元の実装でもう一度通します。
テストの期待値を sum(values) で計算すると、この単純な題材では実装と同じ考え方になり、別の仕様違反を見逃しやすくなります。少数の既知ケースでは6・0・1のように仕様から独立して決めた値を使ってください。
今回実行したのは手動教材のテスト・変異検出です。Claude Codeの生成品質、必要な契約・料金、モデル別の違いは未検証で、この結果から評価できません。次にClaude Codeで生成する場合は、利用したバージョン、モデル、依頼文、生成差分、実行コマンド、通常時・変異時の結果を自分のプロジェクトへ記録します。
この記事の完了条件は、仕様を説明でき、正常5ケースを通し、意図的な2変異で失敗を再現できることです。生成物を採用するかは、この記録と実プロジェクトの既存テストで判断します。
独学かスクールかでは、学習支援が必要になる場面を整理しています。
出典と確認日
- Claude Code:一般的なワークフロー(2026年10月5日確認)
- Python unittest(2026年10月5日確認)
- ローカル検証:2026年10月5日、Python 3.14.2 / Darwin arm64。Claude Codeによる実際のテスト生成は未実施。


コメント