繁体   English   中英

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

[英]unit testing Python objects with pytest

我有一个方法可以返回满足特定条件的对象列表

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 指向左尖括号 (<) 并声明“SyntaxError”

我在想,即使我让它工作,将来当'my_object'存储在另一个位置时它也会失败。 如果我有多个实例,我如何确认报告的实例数量正确?

在这种情况下,验证返回对象的方法的 output 的 pythonic 方法是什么?

js

如您所料,问题在于尝试进行“是”比较。 'is' 表示“是完全相同的对象”,即使两个看起来相同的对象也可能无法通过此测试。

以下是您可能想要测试的一些内容

  • 没有引发异常
  • 返回的 object 是正确的类型

    assert isinstance(object, ResultClass)

  • 返回的 object 有一些特定的属性

    assert result.attribute == attribute

那种事。 我不认为有一种“公认”的检查方式,只是您可能想要检查的几件事,由您决定要检查的内容。 使用“is”是个坏主意,与 memory 中的位置相比是个坏主意。

你可以试试:

assert isinstance(result, my_object.my_object)

您还可以尝试比较字符串表示形式(这基本上就是您正在做的事情,除了缺少引号。) isinstance docs可能还想查看repr 文档,以了解您的 print 语句中发生了什么。 尖括号表示它不是 object 的插件替代品。

线

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)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM