测试:你的安全网
测试就是用来检查其它代码是否如你预期那样运行的代码。一旦写好,它会在几秒内运行完,并立即告诉你是否有东西回退(regression)了。
你不需要 100% 的覆盖率。先从那些一旦坏掉就最伤的东西开始测:登录、支付、无法重新生成的数据、核心业务逻辑。AI 非常擅长写测试——往往比写功能还要强,因为预期行为是具体明确的。
下面这个 prompt 效果很好:
Write tests for the calculateDiscount function in src/pricing.js.
Cover: a normal case, the zero/empty case, the maximum-discount
boundary, and one invalid input. Use the existing test setup in
this repo (check how other *.test.js files are structured).
Run the tests and show me they pass before you finish.
最后那一行很关键。一定要让 AI 运行测试,而不只是写出来。一个从未被执行过的测试只是一个猜测。具体说明要覆盖哪些情况也很有价值,因为放任不管的话,AI 倾向于写出三种 happy path 的变体,然后就声称很周全了。真正能抓出 bug 的,是那些无聊的情况:空输入、边界值、本应抛出异常的东西。
它应当产出的东西的一个简单示例:
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 修复一个 bug 时,让它补一个针对旧行为会失败的测试——这样这个 bug 就不会悄无声息地卷土重来。这个习惯有个名字:回归测试(regression test)。你遇到的每一个 bug,都是代码库付出代价换来的教训;回归测试就是你保住这个教训的方式。
一个提醒:测试本身也可能是错的。如果 AI 写了一个断言有 bug 的行为是正确的测试,它会永远通过,而你的应用会一直坏着。所以要读断言,而不只是看绿色对勾。一个通过的测试只意味着"代码做了测试所说的事"——你仍然得确认这个测试说的是对的事。