Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ms-access/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
基本Python数据结构接口的测试_Python_Testing_Data Structures - Fatal编程技术网

基本Python数据结构接口的测试

基本Python数据结构接口的测试,python,testing,data-structures,Python,Testing,Data Structures,一个相当小的问题:是否有人知道预先制作的Python单元测试套件,这些测试只检查一个类是否符合标准Python数据结构接口之一(例如,列表、集合、字典、队列等)。写它们并不太难,但如果有人已经这么做了,我不想麻烦这么做。这似乎是一些人可能已经完成的非常基本的功能 用例是,由于与平台相关的不同限制,我使用工厂模式来创建数据结构。因此,我需要能够测试生成的创建对象是否仍然符合曲面上的标准接口。此外,我应该注意到,所谓“符合”,我的意思是测试不仅应该检查接口函数是否存在,还应该检查它们是否工作(例如,

一个相当小的问题:是否有人知道预先制作的Python单元测试套件,这些测试只检查一个类是否符合标准Python数据结构接口之一(例如,列表、集合、字典、队列等)。写它们并不太难,但如果有人已经这么做了,我不想麻烦这么做。这似乎是一些人可能已经完成的非常基本的功能

用例是,由于与平台相关的不同限制,我使用工厂模式来创建数据结构。因此,我需要能够测试生成的创建对象是否仍然符合曲面上的标准接口。此外,我应该注意到,所谓“符合”,我的意思是测试不仅应该检查接口函数是否存在,还应该检查它们是否工作(例如,可以在映射中设置和检索值)。首选Python 2.7测试。

标准模块中有基于ABC模块的
集合

您必须从这些类继承类,以确保类符合标准行为:

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:但是如果你只是检查队列的协议,那就太没用了。我