一步步为 Python 库生成可靠的单元测试
先选一个能够独立验证的函数
为 Python 库补测试时,先挑一个输入输出明确、不依赖网络的函数。范围越小,越容易发现模型是否理解了需求,也能减少每次请求携带的内容。本文用一个计算折后金额的函数演示:输入原价和折扣比例,返回应付金额。
第一轮只处理这个函数。把相关实现、公开说明和现有测试风格交给模型即可。对于个人项目,先完成一个可信的小闭环,比一次生成整套测试更容易控制时间和费用。
把金额规则写成可以核对的约定
生成测试前,先明确正确行为。假设原价使用整数分,折扣使用零到一百的整数百分比,其中二十表示减免百分之二十。计算结果按分四舍五入,恰好半分时向上取整。原价不能为负数,折扣不能越界。
继续确定异常约定:类型错误抛出类型异常,数值越界抛出值异常。布尔值是否允许,也要明确;这里约定拒绝布尔值。如果库已有公开约定,就以它为准。遇到说明与实现冲突的地方,先确认预期,避免让模型把现有缺陷写进断言。
先让模型列出用例,再生成测试
第一轮可以这样描述任务:请根据这些行为约定列出测试用例,逐项说明输入、预期结果和验证目的,暂时不要生成测试实现。信息不足时请指出疑问,不要自行补充规则。
检查清单是否包含普通折扣、零元原价、不打折、全部减免、小数取整、负数、越界比例以及错误类型。优先保留能验证不同规则的用例,避免堆积大量只更换数字的重复测试。
自己算出几个关键的预期结果
测试清单需要人工核对。例如,原价一千分、减免百分之二十,应付八百分;原价一千零一分,同样减免后得到八百点八分,应取八百零一分;原价一分、减免百分之五十,应付一分。
这些数字应当直接成为预期值。不要让测试再次调用被测函数,或者复制整段业务算法来计算答案,否则实现和测试可能一起犯错。金额计算还要留意二进制浮点数带来的误差,断言应体现约定的取整规则。
按现有风格生成并运行一小组测试
确认清单后,再要求模型使用项目现有的测试框架生成测试,并保持断言清楚、用例相互独立。纯计算函数通常可以直接调用,无须增加模拟对象。只有遇到时间、网络或外部存储等依赖时,才考虑隔离这些依赖。
在本地运行这组测试。失败时同时检查三件事:需求是否明确、预期值是否正确、实现是否符合约定。不要为了让结果变绿就接受模型修改断言。需要继续求助时,只提供失败摘要、相关用例和必要实现,减少无关上下文。
故意改错一次,检查断言是否有效
测试通过后,可以临时把四舍五入改成直接舍去,确认取整用例会失败;再临时取消折扣范围检查,确认非法输入用例能够发现问题。每次验证后立即恢复实现,再运行测试。
这种检查能帮助你判断断言是否真正约束了行为。如果改错后测试依然通过,应该检查是否遗漏了边界输入、没有断言返回值,或者只验证了函数能够执行。覆盖率可以提示未执行的位置,但不能单独证明测试可靠。
用请求记录控制后续补测成本
通过 MyRelay 使用模型时,可以先用少量用例试跑,再根据质量决定是否扩大范围。创建一个 MyRelay 账号后,你可以在请求记录中查看每次消耗的词元和费用,把整理用例、生成测试与分析失败的开销分别核对。
后续每次增加一个函数或一类边界条件,复用已经确认的行为约定和测试风格。遇到缺陷时,先增加能够复现问题的测试,再修复实现,并把生成的测试与代码一起审查、提交,让它们持续帮助维护这个库。