浏览 AI 知识库
AI 写的测试为什么会假通过,怎样检查断言有没有用
测试显示绿色,不一定真的验证了行为。检查断言对象、失败分支和故障注入,才能发现只调用不判断、先 mock 成功再证明成功的假测试。
测试名写着“应拒绝”,代码却从来没有检查拒绝结果
测试名写“should reject invalid email”,实现却只调用函数,没有断言;另一个测试先 mock 返回成功,再断言页面显示成功。全部绿灯只是因为从未验证失败。
- 测试曾在预期错误实现上失败
- 关键输出和副作用均有断言
- mock 没有替代被测逻辑
测试假通过怎么检查,先从“只断言状态或非空”这一类现象查起
只断言状态或非空
- 原因
- 断言过弱,错误内容仍满足条件。
- 怎么改
- 检查关键字段、业务不变量和副作用;用错误值验证断言真的区分。
Mock 了被测逻辑本身
- 原因
- 测试只验证自己配置的返回值。
- 怎么改
- 只替代真正外部边界,核心业务使用真实实现和可控输入。
异步任务没有等待
- 原因
- 测试在断言前结束,或异常未传播。
- 怎么改
- 等待实际完成条件,检查失败分支和未处理 Promise,避免固定 sleep。
选择器或用例没有执行
- 原因
- 测试被跳过、筛选错误或浏览器定位到错误元素。
- 怎么改
- 检查测试数量、跳过状态和定位唯一性;故意改页面文案确认用例失败。
复测前,固定原始现象、环境和目标
| 需要确认 | 本例内容 |
|---|---|
| 现有材料 | 注册函数、三个现有测试和可注入验证器;目标行为是无效邮箱抛出特定错误且不调用保存。 |
| 不能越过的边界 | 先让测试在错误实现上失败;断言输出与副作用;不要断言 mock 自己配置的结果。 |
| 要交付的结果 | 失败注入结果与有效断言清单 |
这个测试永远为真,折扣算错也会通过
假通过
断言只检查结果存在
it('applies a 10% discount', () => {
const total = calculateTotal([{ price: 100, quantity: 2 }], 0.10);
expect(total).toBeTruthy();
});有效断言
检查金额、输入不变和边界行为
it('subtracts 10% without mutating items', () => {
const items = [{ price: 100, quantity: 2 }];
expect(calculateTotal(items, 0.10)).toBe(180);
expect(items).toEqual([{ price: 100, quantity: 2 }]);
});
it('rejects a discount above 100%', () => {
expect(() => calculateTotal([{ price: 100, quantity: 1 }], 1.2))
.toThrow('discount must be between 0 and 1');
});示例使用教学函数。真实测试的精确值、舍入规则和异常契约必须来自当前业务要求。
故意把减法改成加法,测试必须红一次
| 操作 | 预期 | 实际判定 |
|---|---|---|
| 临时把 total * (1 - discount) 改为 total * (1 + discount) | 金额断言失败:expected 180, received 220 | 若仍通过,断言没有保护核心规则 |
| 恢复正确实现 | 全部相关测试通过 | 证明红绿变化来自这一处行为 |
| 查看测试清单 | 本文件 3 个用例均执行,0 skipped | 排除用例未运行造成的假绿 |
| 单独运行与全套运行 | 两种方式结果一致 | 排除共享状态和顺序依赖 |
测试假通过怎么检查:按原条件复测的结果
原始现象
删除邮箱校验后测试仍全绿,说明测试没有保护目标行为。
失败注入结果与有效断言清单
加入失败注入:暂时移除校验时测试红;恢复后断言错误码、保存调用为 0、错误提示可见。突变检查再把条件反转,测试同样失败,证明断言真正命中。
让 AI 审查测试是否真的会失败
把实现、测试和真实业务规则一起给AI,重点找假断言和漏测边界。
可复制使用
让 AI 审查测试是否真的会失败
请检查现有测试是否真的能发现【业务行为】的回归。不要通过改实现让测试变绿。 实现文件【】;测试文件【】;业务规则及反例【】;测试命令和实际输出【】。 逐个测试说明它失败时能捕获什么错误。重点找没有断言、只验证 mock 被调用、断言固定常量、关键分支未进入或错误值也会通过的用例。提出一个最小反例/变异来证明测试会失败,并给补充测试草案。没有实际运行的部分标“建议未验证”;不得删失败测试或宣称测试通过。
使用范围:把实现、测试和真实业务规则一起给AI,重点找假断言和漏测边界。不为了通过测试修改业务行为,不删除失败用例,不声称未运行的测试已通过。
