如何对字典的函数输出列表进行单元测试?
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】:
这里我对assertEqual
和assertCountEqual
做了一个简单的比较,作为增值。
对于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 中完成的
【讨论】:
以上是关于如何对字典的函数输出列表进行单元测试?的主要内容,如果未能解决你的问题,请参考以下文章