AI 生成的单元测试有没有抓到错误?注入三种错误检查断言

让 AI 写测试后全部变绿,并不能证明测试抓得住错误。可以保留正确实现,再故意让程序漏去重、丢排序或误改大小写,看原有断言是否拒绝这些版本。

让 AI 写测试后全部变绿,并不能证明测试抓得住错误。可以保留正确实现,再故意让程序漏去重、丢排序或误改大小写,看原有断言是否拒绝这些版本。

已经有AI生成测试、希望检查测试是否有效的开发者。本文使用 Python 3.11 或以上版本的标准库,先验证一组人工构造的小样本。AI 负责提出实现或解释差异,结果由本地检查决定;这里没有把模型回答当成真实运行结果。

AI 生成的单元测试有没有抓到错误?注入三种错误检查断言

用错误实现检查测试断言前,先定规则

本文契约是输入字符串列表,按大小写敏感的精确值去重,再按Python默认字符串顺序排序。A和a是两个不同值,空输入返回空列表。

错误版本用来审查测试,不替换真实业务代码。三个变体分别忘记去重、保持输入顺序、统一转小写,对应三个不同规则缺口。

选择能触发缺陷的输入比堆更多随机用例更重要。比如输入本来有序且没有重复,忘记去重的实现仍会通过。

给 AI 的输入要包含什么

把下面这份输入说明和你的实际样本一起交给可用的 AI 编程助手。示例只含虚构数据;对真实材料先去除账号凭据和个人信息。

为normalize(items)=sorted(set(items))写行为测试;大小写敏感。除正常用例,还检查空列表、重复、无序、A/a同时出现。再构造forget_dedupe、forget_sort、lowercase三种错误实现,说明哪个测试会失败。不要修改正确预期。

要求模型保留检查条件,并把它认为缺少的业务定义列出来。若回答改变了输入字段、忽略异常分支或直接删除原材料,先要求修正,再运行。提示词的作用是缩小任务范围,验收仍以代码和数据为准。

保存并运行最小验证程序

下方程序把关键规则和验证用例放在同一个可复跑示例中,便于先理解输入如何变成输出,再用它检查 AI 给出的实现。

新建一个空目录,把下面代码保存为 check.py,在该目录打开终端,运行 python -X utf8 check.py。代码自带示例输入,不需要安装第三方库。

def good(items): return sorted(set(items))
def forget_dedupe(items): return sorted(items)
def forget_sort(items): return list(dict.fromkeys(items))
def lowercase(items): return sorted(set(x.lower() for x in items))
cases=[([],[]),(['b','a','b'],['a','b']),(['a','A'],['A','a'])]
def failures(fn):
    return [i for i,(given,want) in enumerate(cases,1) if fn(given)!=want]
assert failures(good)==[]
print('correct',failures(good))
for name,fn in [('forget_dedupe',forget_dedupe),('forget_sort',forget_sort),('lowercase',lowercase)]:
    failed=failures(fn)
    assert failed, name+'没有被发现'
    print(name,'caught_by',failed)

怎样判断结果符合要求

正确实现的失败列表为空。三个错误实现都必须至少出现一个失败编号;如果有一个没有被抓住,先补能区分正确与错误行为的输入。

下方是这份最小示例在本地执行得到的输出。它验证示例程序与断言的关系,不代表任何 AI 模型一次就能生成同样代码,也不构成性能或生产可靠性结论。

correct []
forget_dedupe caught_by [2]
forget_sort caught_by [2, 3]
lowercase caught_by [3]

caught_by中的编号是用例位置,不是模型成绩。样本是人为设计的,不用于宣称测试覆盖率达到某个百分比。

这里用轻量比较器使错误版本的结果容易阅读;迁入unittest时,把每组given/want写为subTest,并用assertEqual保留同样语义。

哪些失败必须停下来处理

如果模型把期望值改成错误实现的输出,测试将再次变绿,但已失去独立判据。预期结果必须来自契约或人工核对。

发现三个错误不代表所有错误都被覆盖。性能、并发、Unicode排序语义和超大输入不在本例范围。

若业务规定大小写不敏感,必须先改契约和预期,再修改实现,不能把当前lowercase错误版本当正确修复。

接入自己的任务前再核对一次

把每个已发生的缺陷加入错误变体库,修复后确认旧断言确实会拒绝回退版本。

让AI分别列规则与生成代码,再用独立测试核对。避免测试与实现共同复制同一个误解。

资料与适用范围

unittest 的断言与失败信息用于表达预期行为;测试通过只反映已有用例。以下链接核对于 2026-10-03;运行环境及额外依赖按本文前述说明。

相关基础可阅读 Cursor 怎么帮代码补测试?先锁定边界用例,再运行回归命令。本文的重点是用错误实现检查测试断言,可以把两项检查作为不同步骤保留。

Ai菜鸟网。发布者:AI小管家,转载请注明出处:https://www.alyyhw.com/33325.html

赞 (0)
AI小管家的头像AI小管家
AI 生成批量重命名脚本怎么验收?先预览冲突,再检查改名前后映射
上一篇 3小时前
AI 改写 SQL 后怎么验收优化?比较查询计划,并确认结果等价
下一篇 3小时前

相关推荐

联系我们

联系我们

1

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信
关注微信
分享本页
返回顶部