Python单元测试:对象相等与值相等的测试时机及代码验证
你的直觉是对的,这里用对象相等断言更合适
先看你的代码场景:do_something的逻辑非常明确——接收参数后,直接返回helpers.help_do_something的返回值,没有任何额外处理。这种情况下用assertIs(断言对象身份相等)完全正确,原因很简单:你要验证的是函数没有对依赖的返回值做任何修改或包装,原封不动地返回了同一个对象。如果换成assertEqual(值相等),就算哪天有人给do_something加了类似return copy.deepcopy(helpers.help_do_something(some_arg))的代码,只要值没变测试就会通过,但这其实违背了原函数的设计意图。
单元测试中对象相等与值相等的适用场景
用对象相等(assertIs)的场景
- 验证函数/方法返回的是同一个内存对象:比如你的转发逻辑、单例模式的实例一致性、缓存返回的对象复用;
- 确认变量指向某个特定的全局/预定义对象:比如测试函数是否返回了
None(assertIs(ret, None)比assertEqual(ret, None)更严谨)、或者某个全局配置实例; - 测试引用传递的逻辑:比如函数接收一个对象,处理后返回的是同一个对象而非新生成的副本。
用值相等(assertEqual)的场景
- 只关心数据内容,不关心对象身份:比如返回数字、字符串、列表等基础类型,或者自定义业务对象只要属性值一致就符合要求;
- 依赖的返回值是动态生成的新对象:比如每次调用依赖函数都会生成新实例,只要实例的属性/值符合预期即可;
- 测试业务逻辑的输出结果:比如计算结果、格式化后的文本、数据库查询返回的数据集等,核心是结果内容正确,而非对象是否为同一个。
内容的提问来源于stack exchange,提问作者aydow
相关产品推荐
相关产品推荐

