如何测试与Python的文档测试封装字典的平等?(How do I test dictionary-

2019-07-22 08:50发布

我正在写输出字典的功能的文档测试。 该文档测试看起来像

>>> my_function()
{'this': 'is', 'a': 'dictionary'}

当我运行它,它失败

Expected:
    {'this': 'is', 'a': 'dictionary'}
Got:
    {'a': 'dictionary', 'this': 'is'}

我最好的猜测,这种故障的原因是文档测试不检查字典的平等,而是__repr__平等。 这篇文章表明,有一些方法来欺骗文档测试到检查字典平等。 我怎样才能做到这一点?

Answer 1:

文档测试不检查__repr__平等本身,它只是检查输出是完全一样的。 你必须确保无论是印刷将是相同的字典一样。 你可以做到这一点与此一行代码:

>>> sorted(my_function().items())
[('a', 'dictionary'), ('this', 'is')]

虽然您的解决方案这种变化可能是清洁剂:

>>> my_function() == {'this': 'is', 'a': 'dictionary'}
True


Answer 2:

另一个好方法是使用pprint (标准库)。

>>> import pprint
>>> pprint.pprint({"second": 1, "first": 0})
{'first': 0, 'second': 1}

根据它的源代码,它的排序类型的字典为您提供:

http://hg.python.org/cpython/file/2.7/Lib/pprint.py#l158

items = _sorted(object.items())


Answer 3:

最后我用这个。 哈克,但它的作品。

>>> p = my_function()
>>> {'this': 'is', 'a': 'dictionary'} == p
True


Answer 4:

把它变成通过dict.items()列表,然后排序呢?

>>> l = my_function().items()
>>> l.sort()
>>> l
[('a', 'dictionary'), ('this', 'is')]


Answer 5:

您可以创建一个实例unittest.TestCase的文档测试内部类,并用它来比较字典:

def my_function(x):
    """
    >>> from unittest import TestCase
    >>> t = TestCase()

    >>> t.assertDictEqual(
    ...     my_function('a'),
    ...     {'this': 'is', 'a': 'dictionary'}
    ... )

    >>> t.assertDictEqual(
    ...     my_function('b'),
    ...     {'this': 'is', 'b': 'dictionary'}
    ... )

    """
    return {'this': 'is', x: 'dictionary'}

注意:这种方法比简单地检查,如果字典是平等的,因为它会显示两个库之间的差异比较好。



Answer 6:

它的大部分已经被说这里..反正JSYK:有文档测试文档的专用部分:

https://docs.python.org/3.5/library/doctest.html#warnings



文章来源: How do I test dictionary-equality with Python's doctest-package?