使用pytest对Python对象进行单元测试
我有一个方法,它会返回一份符合特定条件的对象列表。
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的文档,这样可以帮助你理解在打印语句中发生了什么。尖括号的意思是这不是对象的直接替代品。