如何对字典的函数输出列表进行单元测试?

Posted

技术标签:

【中文标题】如何对字典的函数输出列表进行单元测试?【英文标题】:How to unit test if function output list of dictionaries? 【发布时间】:2016-11-04 06:21:30 【问题描述】:

我正在为一个返回字典列表的函数编写单元测试。检查输出是否符合预期的最佳方法是什么? 在这里,“如预期”意味着列表中的字典具有相同的键和值,而与字典中键的顺序或字典在列表中的顺序无关。所以是这样的:

expect_output = [ "c":4 , "a" : 4 , "b" : 3]
actual_ouput = ["b" : 3, "a" : 4 , "c":4]
# some function that would return true in this case.

【问题讨论】:

sorted(actual_output) == sorted(expected_output)? 你可以以某种方式对列表进行排序。 @jonrsharpe 我认为您需要对两者进行排序 .. +1 虽然这是最清晰的(并且可能是最快的) @JoranBeasley 很好,谢谢 ***.com/a/25851972/2390362 基本上用作者编写的递归函数来回答这个问题。它有效,但我更喜欢@chepner 的答案,因为它已经内置到 unittest 模块中 【参考方案1】:

如果您使用unittest,则有a method for this:

self.assertItemsEqual(actual_output, expected_output)

在 Python-3 中,这个方法被重命名为assertCountEqual

【讨论】:

这似乎适用于 Python2,但不适用于 Python3(我收到 AttributeError,它说它找不到该断言函数) 我不知道 assertItemsEqual 已从 Python 3 中删除。请参阅 bugs.python.org/issue17866。 您链接的文档虽然很巧妙地指出它在 Python 3 中已重命名为 assertCountEqual 关于字典本身可能包含字典作为值的情况的任何指导?这个方法给ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all() 那些不是字典;它们是numpy.array 值。错误消息告诉您该怎么做:您不能将数组用作真值,因为有多种方法可以这样做(如果任何值为真,数组是否为真?如果 all 值是真的吗?)。无论如何,这应该是一个单独的问题,它准确地显示了您要测试的内容。 (我假设像a == b 这样的数组比较会根据元素比较生成一个布尔值数组,而不是单个布尔值。)【参考方案2】:

这里我对assertEqualassertCountEqual做了一个简单的比较,作为增值。

对于assertEqual -> 列表的顺序很重要。

对于assertCountEqual -> 列表的顺序并不重要。

def test_swapped_elements_1(self):
    self.assertEqual(["b": 1, "a": 1, "b": 1], ["b": 1, "a": 1, "b": 1])

def test_swapped_elements_2(self):
    self.assertCountEqual(["b": 1, "a": 1, "b": 1], ["b": 1, "a": 1, "b": 1])

def test_non_swapped_elements_1(self):
    self.assertEqual(["a": 1, "b": 1, "b": 1], ["b": 1, "a": 1, "b": 1])

def test_non_swapped_elements_2(self):
    self.assertCountEqual(["a": 1, "b": 1, "b": 1], ["b": 1, "a": 1, "b": 1])

以上结果:

失败的人说:

因此,assertCountEqual 应该用于 OP 的情况。


此测试是在 PyCharm 最新版本和 Python 3.5 中完成的

【讨论】:

以上是关于如何对字典的函数输出列表进行单元测试?的主要内容,如果未能解决你的问题,请参考以下文章

如何对绘制 PDF 图形的 Python 函数进行单元测试?

如何在 python 中对装饰器工厂输入进行单元测试

对生成随机输出的代码进行单元测试的最佳方法是啥?

如何使用私有构造函数对类进行单元测试?

如何对非导出函数进行单元测试?

如何对 python 异步函数进行单元测试?