基本Python数据结构接口的测试
一个相当小的问题:是否有人知道预先制作的Python单元测试套件,这些测试只检查一个类是否符合标准Python数据结构接口之一(例如,列表、集合、字典、队列等)。写它们并不太难,但如果有人已经这么做了,我不想麻烦这么做。这似乎是一些人可能已经完成的非常基本的功能 用例是,由于与平台相关的不同限制,我使用工厂模式来创建数据结构。因此,我需要能够测试生成的创建对象是否仍然符合曲面上的标准接口。此外,我应该注意到,所谓“符合”,我的意思是测试不仅应该检查接口函数是否存在,还应该检查它们是否工作(例如,可以在映射中设置和检索值)。首选Python 2.7测试。标准模块中有基于ABC模块的基本Python数据结构接口的测试,python,testing,data-structures,Python,Testing,Data Structures,一个相当小的问题:是否有人知道预先制作的Python单元测试套件,这些测试只检查一个类是否符合标准Python数据结构接口之一(例如,列表、集合、字典、队列等)。写它们并不太难,但如果有人已经这么做了,我不想麻烦这么做。这似乎是一些人可能已经完成的非常基本的功能 用例是,由于与平台相关的不同限制,我使用工厂模式来创建数据结构。因此,我需要能够测试生成的创建对象是否仍然符合曲面上的标准接口。此外,我应该注意到,所谓“符合”,我的意思是测试不仅应该检查接口函数是否存在,还应该检查它们是否工作(例如,
集合
您必须从这些类继承类,以确保类符合标准行为:
import collections
class MyDict(collections.Mapping):
...
此外,您还可以测试显然不继承抽象类的现有类:
class MyPerfectDict(object):
... realization ...
def is_inherit(cls, abstract):
try:
class Test(abstract, cls): pass
test = Test()
except TypeError:
return False
else:
return True
is_inherit(MyPerfectDict, Mapping) # False
is_inherit(dict, Mapping) # True
首先,“标准Python数据结构接口”不是列表、集合、字典、队列等。这些是接口的具体实现。(从某种意义上讲,队列甚至不是一种数据结构,它的显著特点是其操作是原子的,put
和get
可以选择在条件下进行同步,依此类推。)
无论如何,这些接口是以五种不同但不完全兼容的方式定义的
文档的部分描述了迭代器类型、序列类型等的含义,但是,这些文档并不像您期望的那样严格,至少在使用时,例如,C++或java。
我不知道有任何针对这种东西的测试,所以我认为您必须从头开始构建它们
集合
模块包含定义接口的集合,并提供通过注册“虚拟子类”的方法。因此,您可以通过继承collections.mapping
,或调用collections.mapping.register来声明“我是一个映射”。但这并不能证明你是一个映射,只是你声称自己是。(如果您继承自映射
,它还充当一个mixin,通过实现来帮助您完成接口,例如,\uuuuuu包含在\uuu getitem\uuuuu
之上)
如果你想测试ABC的意思,defuz的答案非常接近,我想再多做点工作,他或其他人就可以完成
CPython C API定义了一个。虽然这实际上不是语言的权威性,但很明显,C-API协议和语言级接口应该匹配。而且,与后者不同,前者是严格定义的。当然,来自的源代码,也许还有其他类似的实现,可能会有所帮助
CPython附带了一些这方面的测试,但实际上,它们是为了测试从C调用PyMapping\u GetItem
正确地调用您的mymapping
实际的具体类在协议之上有额外的接口,您可能想要测试这些接口,但这很难描述。特别是,\uuuu new\uuu
和\uuu init\uuu
方法的工作方式通常很重要。实现映射
协议意味着有人可以构造一个空的Foo
实例,并使用Foo[key]=value
向其添加项,但这并不意味着有人可以构造Foo(key=value)
,或Foo({key:value})
或Foo([(key,value)]
对于这种情况,所有标准Python实现都附带了现有的测试。CPython附带了一个非常广泛的测试套件,其中包括以下内容。PyPy运行所有(Python级别)的CPython测试,此外还有一些额外的测试
显然,您必须修改这些测试以在任意类上运行,而不是在测试中硬编码的类上运行,并且您可能还必须修改它们以处理您选择的任何定义。另外,他们可能比你要求的测试更多。你只想知道一个类是否符合协议,而不是它的方法是否正确,对吗?但我仍然认为这是一个很好的起点
最后,C API定义了一个与前面的定义相匹配且定义更严格的定义,尽管它不是权威性的
不幸的是,这个测试肯定不会对您非常有用,因为它们会检查PyDict\u Check
和PyDict\u GetItem
是否对您的类起作用,它们不会对纯Python中定义的任何映射起作用
如果您确实为这些定义中的任何一个构建了完整的东西,我强烈建议您将其放在PyPI上,并将其发布到python列表中,这样您就可以得到反馈(和bug报告)。我还没有看到python中工厂的良好用例不知道有任何预先制作的,但正如您所说,使用collections
中的ABC作为旁注,并不太难推出自己的,queue
不是您所认为的数据结构,因为它的关键特性是多线程特性:所有操作都是原子的,它提供了一种让生产者或消费者相互封锁的方法。大家都同意,队列并不是一种完全的数据结构。但是,它是我希望工厂需要提供的类型之一,所以我列出了它。@Namey:但是如果你只是检查队列的协议,那就太没用了。我