「テストを書く時間がない」「テストを書くのが面倒」——その悩み、Claude Codeが解決します。
筆者はC#のフルリモート案件に参画していますが、Claude Codeを使ったテスト自動化で手動テストの時間が週10時間以上削減できました。この記事では、pytest(Python)とxUnit(C#)を例に、Claude Codeを使ったテスト自動化の具体的なやり方を解説します。
pytest(Python)でのテスト自動化
基本的な使い方
以下のようなPython関数があるとします:
def calculate_discount(price: float, member_rank: str) -> float:
"""
会員ランクに応じた割引後の価格を返す。
ランク: 'bronze'=5%, 'silver'=10%, 'gold'=20%
"""
discounts = {'bronze': 0.05, 'silver': 0.10, 'gold': 0.20}
if price < 0:
raise ValueError("価格は0以上である必要があります")
discount = discounts.get(member_rank, 0)
return price * (1 - discount)
Claude Codeへの指示:
以下のPython関数のpytestテストを書いてください。
- 正常系(各ランクごと)
- 異常系(負の価格、未知のランク、価格が0)
- 境界値テスト
fixtureを適切に使い、テスト名は日本語コメントで意図を明記してください。
[関数コードを貼り付け]
Claude Codeが生成するテストコード:
import pytest
from discount import calculate_discount
class TestCalculateDiscount:
"""calculate_discount関数のテストスイート"""
# --- 正常系 ---
def test_bronze_member_gets_5_percent_discount(self):
"""ブロンズ会員は5%引きになる"""
assert calculate_discount(1000, 'bronze') == pytest.approx(950.0)
def test_silver_member_gets_10_percent_discount(self):
"""シルバー会員は10%引きになる"""
assert calculate_discount(1000, 'silver') == pytest.approx(900.0)
def test_gold_member_gets_20_percent_discount(self):
"""ゴールド会員は20%引きになる"""
assert calculate_discount(1000, 'gold') == pytest.approx(800.0)
def test_unknown_rank_gets_no_discount(self):
"""未定義ランクは割引なし"""
assert calculate_discount(1000, 'platinum') == pytest.approx(1000.0)
# --- 境界値 ---
def test_zero_price_returns_zero(self):
"""価格0円の場合は0円を返す"""
assert calculate_discount(0, 'gold') == pytest.approx(0.0)
# --- 異常系 ---
def test_negative_price_raises_value_error(self):
"""負の価格はValueErrorを発生させる"""
with pytest.raises(ValueError, match="価格は0以上"):
calculate_discount(-100, 'bronze')
これをClaude Codeが数秒で生成します。
C#(xUnit)でのテスト自動化
ASP.NET Core APIのテスト例
// Claude Codeへの指示
// 「このServiceクラスのxUnitテストを書いて。
// Moqでリポジトリをモックして、
// 正常系・異常系・エッジケースを網羅してください。」
Claude Codeはコードベース全体を把握しているため、既存のDI設定・インターフェース定義・テストのフォルダ構造を考慮した上でテストコードを生成します。
特に有効なケース:
- リポジトリのモック(
Mock<IUserRepository>)の自動生成 ILogger・IConfigurationのモック設定- 非同期メソッド(
async/await)のテスト - カスタム例外クラスの検証
Claude Codeを使ったテスト駆動開発(TDD)フロー
筆者が実践しているTDDフロー:
1. 仕様をClaudeに伝える
「〇〇する機能を実装したい。先にテストを書いて」
2. Claudeがテストコードを生成する
→ この時点では当然テストは失敗する
3. テストを実行して失敗を確認する
pytest test_xxx.py → FAILED
4. Claudeに実装を依頼する
「上のテストが全部通るように実装して」
5. テストを実行して成功を確認する
pytest test_xxx.py → PASSED
6. 必要なら追加テスト・リファクタリングをClaudeに依頼する
このフローにより、「動くコードを作る」と「テストを書く」を分離せずに並行して進められます。
既存コードへのテスト追加
レガシーコードにテストがない場合、Claude Codeへの指示:
このファイルにはテストがありません。
カバレッジを上げるためのpytestテストを追加してください。
既存の動作を壊さないことを前提に、
最も重要な関数から優先的にテストを書いてください。
Claude Codeはコードを読んで「どこにリスクがあるか」を判断し、優先度の高い関数から順にテストを生成します。
テスト自動化で得られた実際の効果
筆者の経験値:
- 新機能のテスト作成時間:1〜2時間 → 15〜30分
- レグレッションテストの発見率:向上(Claude Codeがエッジケースを網羅するため)
- テストを書く心理的ハードル:ほぼゼロ(「Claudeに頼めばいい」という安心感)
よくある質問
Claudeが生成したテストをそのまま使っていいですか?
A. 動作確認は必ず自分でしてください。Claudeが生成したテストがコンパイルエラーを起こしたり、ロジックを誤解している場合があります。「生成→確認→修正」のサイクルを回すことが重要です。
テストコードの保守はどうしますか?
A. 仕様変更でテストが壊れたときも「このテストが失敗しています。仕様変更内容は〇〇です。テストを修正してください」とClaudeに依頼できます。
CI/CDに組み込む方法は?
A. pytestであればpytest --covでカバレッジ計測も同時にできます。GitHub ActionsへのCI設定もClaudeに「GitHub Actionsのワークフローファイルを作って」と頼むだけで生成されます。
—
関連ツールを見る
この記事で紹介したツール・サービスをまとめてチェック。
![]()