参数化测试把同一测试函数配上多组输入,常让人产生一种直觉:每次调用都会拿到一份全新参数。对于列表、字典这类可变对象,这个直觉需要重新核对。
pytest官方参数化指南明确说明,参数值按原样传入测试,不作任何复制。文档随即指出,如果传入列表或字典,而测试代码修改了它,这种变化会反映在后续测试调用中。因此,参数化负责安排不同调用,并没有自动承担对象复制的工作。
这里应区分“值看起来相同”与“复用了同一个对象”。假设一份自拟测试资料让多个调用使用同一个列表,而前面的调用向列表添加了元素,后面的调用便可能面对已经改变的状态。本文没有运行这个示例,它只用来解释文档所说的对象变化;不能将其写成某个项目已经发生的测试故障。
反过来,也不宜把所有参数化测试都说成必然互相污染。原文的限定条件是可变对象被修改,并在后续调用中继续体现这种变化。若没有确认对象来源、共享关系和修改位置,只凭用例用了列表,就认定失败原因,仍然缺少证据。
阅读一组异常测试结果时,可以先记录每次调用使用什么输入,再核对测试函数或被测代码是否改变了该输入。参数声明时看到的内容,与后一次调用开始时对象的实际状态,可能不是同一时刻的信息。把这两个时刻分开,会比只比较用例名称更有帮助。
这也说明,用例数量增加不自动等于隔离条件已经完善。参数化可以减少重复的测试函数写法,但测试所需的初始状态仍要由设计本身说明。本文不提供某个未知项目的修复补丁,也不认定简单复制就适合所有含嵌套对象或外部资源的场景。
本稿采用读取时的pytest stable指南,不从示例中的占位版本推断本地安装版本。官方示例的通过与失败输出也没有被当成本项目的实测证据。准确理解参数传递,可以帮助测试团队提出更具体的复核问题;真正的通过情况仍需对应代码、环境和实际运行记录。
信息来源
本文基于上述公开资料整理,未使用来源页面的图片、视频或嵌入媒体。