Claude Codeにテストを作らせる方法|期待値を先に決める

Claude Codeにテストを作らせる方法|期待値を先に決める エンジニア
Claude Codeにテストを作らせる方法|期待値を先に決める

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変異で失敗を再現できることです。生成物を採用するかは、この記録と実プロジェクトの既存テストで判断します。

独学かスクールかでは、学習支援が必要になる場面を整理しています。

出典と確認日

コメント

タイトルとURLをコピーしました