Python unittest测试自定义List类报fastseq无TestList错误原因
错误原因分析
- 核心原因是测试类
TestList的定义位置错误:你将TestList类写在了if __name__ == "__main__"的判断代码块内部。 - 该代码块的逻辑是只有当脚本被直接作为执行入口运行时,块内代码才会执行;而
unittest的测试加载器查找测试用例时,会将当前脚本作为模块导入,此时模块的__name__值为脚本文件名(也就是报错信息里的fastseq),不满足if __name__ == "__main__"的判断条件,TestList类根本不会被注册为fastseq模块的属性,因此测试加载器查找时就会抛出属性不存在的错误。
修复方案
将TestList类的整体定义移动到if __name__ == "__main__"代码块外面即可,调整后代码结构参考:
# 先导入依赖、定义List类 import unittest from collections.abc import MutableSequence from collections import OrderedDict class List(MutableSequence): # 你的List类实现代码 def __init__(self, seq=None): self.seq = {} if seq is None else self._dict_from_seq(seq) # 补充__eq__方法,否则assertEqual判断两个List实例相等会失效(默认对比内存地址) def __eq__(self, other): if not isinstance(other, List): return False return self.seq == other.seq def __getitem__(self, item): try: return self.seq[item] except KeyError: raise IndexError("list index out of range") from None def __setitem__(self, key, value, *, usage=None): if key > max(self.seq.keys()) and usage != "append": raise IndexError("list index out of range") self.seq[key] = value def __delitem__(self, key): try: del self.seq[key] except KeyError: raise IndexError("list index out of range") from None @classmethod def _dict_from_seq(cls, seq): return OrderedDict(enumerate(seq)) def _next_available_slot(self): return max(self.seq) + 1 def append(self, item): self.__setitem__(self._next_available_slot(), item, usage="append") def insert(self, index, value): if index > max(self.seq.keys()): raise IndexError("list index out of range") self[index] = value # 注意MutableSequence要求实现__len__方法,你省略的代码里需要补充该方法,否则初始化会报错 def __len__(self): return len(self.seq) # 再定义测试类 class TestList(unittest.TestCase): def setUp(self): self.li = List(["ABC", 5.6, (3, 6)]) def test_append(self): self.li.append(1) self.assertEqual(self.li, List(["ABC", 5.6, (3, 6), 1])) def test_insert(self): self.li.insert(1, "ABC") # 最后写入口判断 if __name__ == "__main__": unittest.main()
内容的提问来源于stack exchange,提问作者Alan Bagel
相关产品推荐
相关产品推荐

