どうも、テックバディ運営の大下です。AI駆動開発を学べるエンジニア向けスクール「テックバディ」でコードレビューをしていると、この誤解が一番多いかもしれません。
CIのチェックが全部緑になった瞬間、「よし、完成」とプルリクを出したくなる気持ちはよく分かります。特にAIにコードとテストを一緒に書いてもらえるようになった今は、テストが通ること自体のハードルが下がった分、「通った=正しい」という誤解がむしろ強まっている気がします。
でも緑のチェックマークは「書いたテストの範囲では壊れていない」を示しているだけで、「正しく作れている」の証明ではありません。今回は、初心者が見落としがちな3つの観点を整理します。
観点1:そのテストは「仕様」を検証しているか、「実装」をなぞっているだけか
AIにテストを書かせると、実装コードをそのままなぞるようなテストが生成されることがあります。
// 実装
function calculateDiscount(price, rate) {
return price - price * rate;
}
// NG:実装の計算式をそのままコピーしただけのテスト
test('割引計算', () => {
const price = 1000;
const rate = 0.1;
expect(calculateDiscount(price, rate)).toBe(price - price * rate);
});
このテストは実装にバグがあっても、そのバグごとテストの中に複製されているので絶対に落ちません。テストは「実装が何をしているか」ではなく「仕様として何が正しいか」を検証すべきです。
// OK:期待する具体的な結果値で検証する
test('1000円の商品を10%割引すると900円になる', () => {
expect(calculateDiscount(1000, 0.1)).toBe(900);
});
観点2:正常系だけで、異常系・境界値が抜けていないか
AIにテストを書かせたときに一番よく抜けるのがここです。「動く例」は書けても、「動いてはいけない例」「境界の例」は指示しないと出てこないことが多いです。
- 正常系:普通に動く入力(例:割引率10%)
- 境界値:ちょうど境目の入力(例:割引率0%、100%)
- 異常系:本来あってはいけない入力(例:割引率がマイナス、priceが未定義)
// 境界値・異常系を明示的に追加する
test('割引率が0の場合は元の価格のまま', () => {
expect(calculateDiscount(1000, 0)).toBe(1000);
});
test('割引率が100%の場合は0円になる', () => {
expect(calculateDiscount(1000, 1)).toBe(0);
});
test('価格がマイナスの場合はエラーを投げる', () => {
expect(() => calculateDiscount(-1000, 0.1)).toThrow();
});
「valid(正しい入力)は書くけどinvalid(不正な入力)が抜ける」というパターンは、AI生成コードのレビューでも繰り返し指摘されるポイントです。テストが緑になったら、まず「境界値と異常系を書いたか」を自分に問い直す習慣をつけると穴が減ります。
観点3:テストが「動いている」だけで、そもそも仕様として正しいかは別問題
テストが通っていても、その仕様理解自体が間違っていれば意味がありません。たとえば「割引率は0〜1の小数で受け取る」という前提を勘違いして「0〜100のパーセント値で受け取る」実装とテストを両方作ってしまえば、テストは緑のまま仕様とズレたコードが出来上がります。
これはコードを読むだけでは気づけません。要件定義書や仕様書と突き合わせて確認するしかない領域です。AIにテストを書かせる場合も、「この仕様のもとで正しいか」をレビューする役割は人間に残ります。
まとめ
テストが緑になっているかどうかは、あくまで「書いたテストの範囲で壊れていないか」というチェックにすぎません。
- 実装をなぞっているだけのテストになっていないか
- 境界値・異常系が抜けていないか
- そもそも仕様理解が正しいか
この3つは自動化された緑のチェックマークでは判定できず、人間が意識して確認する必要がある領域です。「テストが通った=完了」ではなく「テストが通った=次に何を確認すべきか考えるタイミング」と捉え直すと、レビューの精度が上がります。
AI駆動開発を実務レベルで学べるエンジニア向けスクール「テックバディ」について
「テックバディ」は、生成AIを使いこなして実務レベルの開発をやりきる力を、模擬案件を通じて身につけるエンジニア向けスクールです。「AIに書かせるだけ」で終わらせず、設計力・品質担保力・判断力まで鍛えるカリキュラムで、現場で任される仕事の幅を広げたい方をサポートしています。