You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 07:45:01