使用pytest对Python对象进行单元测试

2 投票
3 回答
3862 浏览
提问于 2025-04-16 16:37

我有一个方法,它会返回一份符合特定条件的对象列表。

result = find_objects(some_criteria)
print("%r" % result)

>> [<my_object.my_object object at 0x85abbcc>]

我想写一个pytest来验证find_objects()这个方法的运行情况。

def test_finder(testbed):
    result = testbed.find_objects(some_criteria)

    assert result is [<my_object.my_object object at 0x85abbcc>]

到目前为止,pytest指向了左尖括号(<),并报出了“语法错误”。

我在想,即使我把这个问题解决了,将来当'my_object'存储在其他地方时,它可能还是会出错。如果我有多个实例,我该如何确认报告的数量是正确的呢?

在这种情况下,验证一个返回对象的方法输出的pythonic方式是什么?

js

3 个回答

2

这一行

assert result is [<my_object.my_object object at 0x85abbcc>]

其实在Python中是个语法错误哦 :)

如果你想检查数据的类型和长度,可以这样做:

assert len(result) == 1
for x in result:
    assert isinstance(result, my_object.my_object)
4

正如你所猜的,问题在于尝试进行一个“是”的比较。“is”意味着“是完全相同的对象”,即使两个看起来一模一样的对象,也可能在这个测试中不通过。

这里有一些你可能想要测试的内容:

  • 没有抛出异常
  • 返回的对象类型是正确的

    assert isinstance(object, ResultClass)

  • 返回的对象具有一些特定的属性

    assert result.attribute == attribute

就是这些。我觉得没有一种“公认”的方法来检查,只是有几个你可能想要检查的点,具体要检查什么由你自己决定。使用“is”来比较是个坏主意,因为比较内存中的位置也是不好的做法。

2

你可以试试:

assert isinstance(result, my_object.my_object)

你也可以尝试比较字符串的表现形式(这基本上就是你现在在做的,只是缺少了引号)。可以看看isinstance的文档。另外,可能还想看看repr的文档,这样可以帮助你理解在打印语句中发生了什么。尖括号的意思是这不是对象的直接替代品。

撰写回答