调用preprocess函数触发非list类型AssertionError的排查与解决
报错根因
这个断言报错和preprocess函数的返回逻辑完全无关,核心是测试断言方法的语义用错了:self.assertIs(a, b) 的判断逻辑等价于 a is b,作用是校验两个对象在内存中是否为同一个引用、完全等同的对象。你当前代码里写的 self.assertIs(pre[i], list),本质是在判断“pre[i]这个列表实例是不是等于list这个类本身”——哪怕pre[i]是结构完全正确的列表,这个判断也永远为False,自然会触发断言失败。
从报错信息里打印的列表内容、还有你代码里单独输出的type(pre[i])结果来看,preprocess返回的元素确实是标准列表结构,业务逻辑没有问题。你可以在测试环境里实际跑一下 [1,2,3] is list,返回值就是False,和当前报错场景完全一致。
可落地的解决方法
根据你“校验pre[i]的数据类型为list”的测试本意,任选其一调整断言逻辑即可:
- 替换为专门的实例校验断言:把原有断言行改成
self.assertIsInstance(pre[i], list)。这个方法的作用就是检查传入的对象是不是指定类的实例,完全匹配你的测试需求。 - 保留类型严格相等的判断逻辑:把原有断言行改成
self.assertEqual(type(pre[i]), list)。和前一种方法的区别是,这种写法不会认可list的子类实例,只会校验对象的类型严格为list,适合需要精确匹配原生list类型的场景。
注意:如果没有特殊的严格类型校验需求,优先使用
assertIsInstance,对继承场景的兼容性更好,也是单元测试框架官方推荐的类型校验写法。
内容的提问来源于stack exchange,提问作者Harsh
相关产品推荐
相关产品推荐

