如何在Python中使用unittest模块将两个对象列表与断言进行比较?

时间:2016-04-15 13:37:22

标签: python unit-testing

我有一个方法返回某个类的对象列表(让我们用属性a,b c和方法my_method调用该类A.所以我得到类似的东西:

my_method() -> [A(a1, b1, c1), A(a2, b2, c2), A(a3, b3, c3)]

我想对这个方法进行单元测试,但我真的不知道应该使用哪种断言方法。

我想写一些像:

self.assertListEqual(my_method(), [A(a1, b1, c1), A(a2, b2, c2), A(a3, b3, c3)])

注意,这行不起作用(我的测试失败),因为我认为它不适用于对象列表(只有基本类型列表,如数字列表)。我得到了:

First differing element 0

和一个细节显示那些第一个对象有不同的地址(当然是正常的),但它不是我想要比较的。我只想比较属性是否相等(FYI,属性a,b和c是“基本”类型,即字符串或数字)

元素的顺序无关紧要。因此,只有当两个列表包含有效的不同元素(并且以不同的顺序不同)时,我才想要失败。我正在使用Python3。

谢谢,

2 个答案:

答案 0 :(得分:2)

我不确定如何可扩展地实施 eq ,但你可以试试这个:

public

但是,如果my_method()中存在实际错误,我不确定是否很容易解析结果,因此这只是一个快速而肮脏的解决方案......

答案 1 :(得分:0)

actual = my_method() 
expected = [A(a1, b1, c1), A(a2, b2, c2), A(a3, b3, c3)]
self.assertListEqual(list(map(vars, expected)), list(map(vars, actual)))

您可以将var应用于列表的元素。 附带说明一下,assert()参数的正确顺序是(expected, actual),而不是(actual, expected)。该顺序很重要,因为如果测试失败,则如果顺序错误,则错误消息将是错误的。