テスト: あなたのセーフティネット
テストとは、別のコードが期待どおりに動くかをチェックするコードです。一度書けば数秒で実行でき、何かが退行したらすぐに教えてくれます。
カバレッジ100%は必要ありません。壊れたときに最も痛い部分から始めましょう。ログイン、決済、再生成できないデータ、コアとなるビジネスロジックです。AIはテストを書くのが非常に得意で、しばしば機能を書くより上手です。期待される振る舞いが具体的だからです。
うまくいくプロンプトの例です。
src/pricing.js の calculateDiscount 関数のテストを書いて。
通常ケース、ゼロ/空ケース、最大割引の境界値、不正な入力を1つ、
これらをカバーして。このリポジトリの既存のテスト構成を使うこと
(他の *.test.js ファイルがどう構成されているか確認して)。
完了する前にテストを実行して、パスすることを見せて。
最後の一文が重要です。テストを書くだけでなく、必ずAIにテストを実行させましょう。一度も実行されていないテストは、ただの推測です。どのケースをカバーするかを具体的に伝えることにも価値があります。放っておくと、AIは正常系のバリエーションを3つ書いて「網羅した」と言いがちだからです。実際にバグを捕まえるのは、退屈なケースです。空の入力、境界値、例外を投げるべきもの。
AIが生成すべきものの簡単な例です。
import { calculateDiscount } from "./pricing.js";
import { describe, it, expect } from "vitest";
describe("calculateDiscount", () => {
it("applies a normal percentage discount", () => {
expect(calculateDiscount(100, 0.2)).toBe(80);
});
it("returns the full price when discount is zero", () => {
expect(calculateDiscount(100, 0)).toBe(100);
});
it("never discounts below zero", () => {
expect(calculateDiscount(100, 1.5)).toBe(0);
});
it("rejects a negative price", () => {
expect(() => calculateDiscount(-10, 0.2)).toThrow();
});
});
あとで機能を変更するときは、先にテストを実行しましょう。レッドになれば、ユーザーより先に壊れた箇所を見つけられます。AIがバグを直したら、古い振る舞いで失敗するテストを追加させましょう。そうすれば、そのバグがこっそり戻ってくることはありません。この習慣には名前があります。リグレッションテストです。あなたが遭遇したすべてのバグは、コードベースが代償を払って得た教訓です。リグレッションテストは、その教訓を保ち続ける方法です。
一つ警告を。テストもまた間違うことがあります。AIがバグのある振る舞いを正しいと主張するテストを書けば、そのテストは永遠にパスし続け、アプリは壊れたままになります。だから、緑のチェックマークだけでなく、アサーションを読みましょう。パスするテストは「コードがテストの言うとおりに動く」ことしか意味しません——そのテストが正しいことを言っているかは、あなたが確認しなければなりません。