メインコンテンツへスキップ
AIが書いたコード、ほんとに大丈夫?(テスト)
レッスン 2 / 8|11分で読めます

AIが書いたコード、ほんとに大丈夫?(テスト)

動いてるように見えても、中でバグってるかも。特に薬用量とか、間違うと命に関わる系は絶対テスト。

このレッスンで終わる頃には

  • AIが書いたコードを 確信を持って使える 状態になる
  • テストの書き方をClaudeに任せつつ、最終確認は自分でやる 型が身につく
  • TDD(テスト駆動開発)の基本が分かる

このレッスンで作るもの


動いてるように見えても、大丈夫?

Claudeに薬用量計算機を作らせたとする。動いた。ボタンも効く。見た目もちゃんとしてる。

でも、計算は本当に合ってる?

体重10kgの子にアセトアミノフェン、10-15mg/kgが適量。計算機が 150mg を返せば正解。1500mg を返してきたら 10倍の過量投与

画面見てるだけじゃ分からない。これが医療アプリの怖いところです。

答えは テスト。「このインプットならこのアウトプットが返るはず」を自動で確認する仕組み。


テストって何?

ざっくり言うと、「こうなるはず」のリスト を別ファイルで書いておく。実行すると、合ってたら緑、間違ってたら赤。

BMI計算器ならこんなリスト:

  • 身長170cm・体重70kg → 24.2が返るはず
  • 身長0cm → エラーになるはず
  • 体重マイナス → エラーになるはず

これをコードで書く。ボタン1つで全部チェックできる状態になる。

テストの色: 緑=期待通り、赤=期待値とずれている、を信号機で示した図
テストランナーは交通信号と同じ。緑は進んでOK、赤は止まれ

やってみる: BMI計算器+テスト

Claudeにこう頼む:

Claude Code
$BMI計算器をTypeScriptで作って。身長(cm)と体重(kg)を渡してBMIを返す関数。テストも一緒に書いて。エッジケースも含めて。

本体とテストの2ファイルができる。テストはこんな感じ:

import { calculateBMI } from './bmi'

test('普通の入力', () => {
  expect(calculateBMI(170, 70)).toBeCloseTo(24.22, 1)
})

test('身長0はエラー', () => {
  expect(() => calculateBMI(0, 70)).toThrow()
})

test('体重マイナスはエラー', () => {
  expect(() => calculateBMI(170, -5)).toThrow()
})

読めなくていい。英語部分がさっき日本語で書いた「はず」のリストと同じことをやってる。

実行

Terminal
$npx vitest run
✓ src/bmi.test.ts (3)
✓ 普通の入力
✓ 身長0はエラー
✓ 体重マイナスはエラー
Test Files 1 passed (1)
Tests 3 passed (3)

全部緑ならOK。計算は信頼できる


赤くなったら?(わざとバグ入れてみる)

Claude Code
$BMI計算で、わざと割り算を間違えて。それからテストを走らせて。

赤くなる:

Terminal
FAIL src/bmi.test.ts
✗ 普通の入力
Expected: 24.22
Received: 2422.15
差分: 100倍

期待値と実際の値が両方出る。100倍のズレが一目で分かる。

テストが無かったら、このバグに気づかないまま使い続けてた可能性がある。


Claudeへの頼み方、3パターン

3つ目、医療アプリでは必須。バグは普通のケースより、変な入力(体重0、身長9999、文字列)で出る。


「テスト先に書く」という選択肢(TDD)

ちょっと上級。テストを先に書いて、テストが通るようにコードを書く やり方もある。TDD(テスト駆動開発)と呼ばれる。

Claudeへの頼み方:

Claude Code
$小児のアセトアミノフェン用量計算、まずテストだけ書いて。
$条件:
$- 体重10kg×10mg/kg → 100mgが返る
$- 体重0以下 → エラー
$- 最大用量を超えたら警告
$
$テストを書いて、赤になることを確認。その後、テストが通るように実装して。

先に「こうなってほしい」を決めてから作る。仕様書代わりにもなるのがメリット。

医療アプリではテスト = 命綱

計算ミス、単位の取り違え、ゼロ除算。これらが患者に届くのはまずい。

AIに任せっきりにしないで、テストを書かせた上で、結果を自分の目で確認する。ここだけは譲れない。

テストのコード自体はClaudeに任せていい。大事なのは「テストがある」「結果を見た」の2つです。


テストフレームワーク、どれを使う?

迷ったら Vitest(TS/JS)/ pytest(Python)。Claudeに「テスト書いて」と頼めば、これらで書いてくれる。

Vitest 公式ドキュメント Getting Started ページのスクリーンショット
Vitest 公式ドキュメント。Claudeに「テスト書いて」と頼むと、このGetting Startedの構成に沿って書いてくれる
Vitest 公式ドキュメント

高速で書き味の良いテストランナー。ClaudeがTS/JSでテスト書く時の標準。

Webvitest.dev
pytest 公式ドキュメント

Pythonの定番テストランナー。医療系のスクリプトを書くなら必須。

Webdocs.pytest.org
TDD: Test-Driven Development(Martin Fowler)

TDDの考え方を簡潔に解説。なぜテストを先に書くのかが分かる原典。

記事martinfowler.com

習慣にすると楽

新しい機能を頼むたびに「テストも書いて」と一言添える。それだけで、AIが書いたコードの信頼度が跳ね上がる。

テストがあると、後から修正するのが怖くなくなる。変更→テスト実行→全部緑なら他の機能は壊れてない、と確認できる。

テストが無いコードは、逆に何を直すたびに「他は大丈夫?」って目視確認する羽目になる。未来の自分への保険、と思って書かせる。


まとめ

  • 動いてるように見えても、計算が合ってるかは別問題
  • テスト = 「こうなるはず」の自動チェック
  • Claudeに「テストも書いて、エッジケースも含めて」と頼むのが基本
  • 医療アプリでは必須。結果は自分の目で確認
  • 「テスト先に書く」TDDも選択肢

次は マルチエージェント。複数のClaudeを同時に走らせる話。


明日のアクション

入門編で作ったアプリ、または新しいプロジェクトで、何か1つ計算系の関数をClaudeに作ってもらってください。

テストもエッジケースを含めて書いて」を忘れず添える。

テスト実行して、全部緑になることを自分の目で確認。このサイクルを1回通すと、「あー、こういう感じか」が分かります。