如何使用Python中的unittest模块将两个对象列表与断言进行比较?
我有一个方法,它返回某个类的对象列表(让我们用属性a、bc调用该类a,并将该方法称为my_method)如何使用Python中的unittest模块将两个对象列表与断言进行比较?,python,unit-testing,Python,Unit Testing,我有一个方法,它返回某个类的对象列表(让我们用属性a、bc调用该类a,并将该方法称为my_method) 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)]) 我想对这个方法进行单元测试,但我真的不知道应该使用哪种断言方法 我想写一些类似于: my_metho
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)])
我想对这个方法进行单元测试,但我真的不知道应该使用哪种断言方法
我想写一些类似于:
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
还有一个细节显示这些第一个对象有不同的地址(这当然是正常的),但这不是我想要比较的。我只想比较属性是否相等(仅供参考,属性a、b和c是“基本”类型,也就是说字符串或数字)
元素的顺序并不重要。因此,我只想在两个列表中包含有效不同的元素(并且顺序不同)时失败。我正在使用Python3
谢谢,我不确定如何可伸缩地实现eq,但您可以简单地尝试一下:
import unittest
class A:
def __init__(self, a, b, c):
self.a = a
self.b = b
self.c = c
def __eq__(self, other):
return self.a == other.a and self.b == other.b and self.c == other.c
a1, a2, a3 = ('a1', 'a2', 'a3')
b1, b2, b3 = ('b1', 'b2', 'b3')
c1, c2, c3 = ('c1', 'c2', 'c3')
def my_method():
return [
A(a1, b1, c1),
A(a2, b2, c2),
A(a3, b3, c3)
]
class BasicsTestCase(unittest.TestCase):
def test_list_of_objects(self):
self.assertListEqual(my_method(), [A(a1, b1, c1), A(a2, b2, c2), A(a3, b3, c3)])
但是,如果my_method()中存在实际错误,我不确定解析结果是否容易,因此这只是一个快速而肮脏的解决方案…actual=my_method()
预期=[A(a1,b1,c1),A(a2,b2,c2),A(a3,b3,c3)]
assertListQual(列表(映射(变量,预期)),列表(映射(变量,实际)))
您可以将var
应用于列表的元素。
作为旁注,
assert()
参数的正确顺序是(预期,实际)
,而不是(实际,预期)
。顺序很重要,因为在测试失败的情况下,如果顺序错误,错误消息将是错误的。如果元素的顺序不重要,则比较集合
s而不是列表
s;此外,您也不会说A
是否实现\uuuueq\uu
(需要它和\uuuuuuuuuuuuuuuuuuuuu
用于字典和集合)。好的,让我们假设我已经实现了\uuuuuuueq\uuuuuuuuuuuu
并且\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu hash
您对单元测试我的方法有什么建议?…比较集相等,集(
是的,但我的意思是使用unittest模块,我不应该使用unittest.TestCase类中的方法吗?然后只使用assertEqual
(您不需要直接使用“类型”方法),但我建议使用py.test
。好的,我将此解决方案与JonSharpe建议结合使用集合(这样元素的顺序就不重要了).我实现了eq和hash,它工作正常。Thx。