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

如何使用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

我有一个方法,它返回某个类的对象列表(让我们用属性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_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。