Pytest3-断言的编写和报告

638 阅读2分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第3天,点击查看活动详情

感谢点赞,我们一起学习。可以的话,关注一下。

  • [使用assert语句进行断言]

  • [异常断言]

  • [使用上下文对比]

  • [自定义断言对比信息]

[使用assert语句进行断言]

def f(): 
     return 3 
def test_function(): 
     assert f() == 4

在python中,我们可以使用标准的Pythonassert断言语句来验证测试中的期望结果和实际结果。大多数语言的断言也是这个单词。
如果此断言失败,你将看到函数调用的返回值:

image.png 上面就是简单的断言。

[异常断言]

我们可以使用pytest.raises作为上下文管理器来进行异常断言,看如下代码

import pytest

def test_zero_division():
    with pytest.raises(ZeroDivisionError):
        1 / 0
def test_recursion_depth():
    with pytest.raises(RuntimeError) as excinfo:
        def f():
            f()
        f(1)
    assert 'maximum recursion' in str(excinfo.value)

如果需要访问实际的异常信息,咱们可以使用如上的第二个case。,运行结果如下:

image.png

[使用上下文对比]

上下文的对比,主要解决对大量用例进行了特定对比:

  • 长字符串断言:显示上下文差异
  • 长序列断言:显示第一个失败的索引
  • 字典断言:显示不同的key-value对 看如下列子:
def test_set_comparison():
    set1 = set("1308")
    set2 = set("8035")
    assert set1 == set2

运行结果:

image.png

看运行结果,我们很容易理解,我们对比结果的时候,不需要拿着每个字符去对比,这样也节省代码逻辑。

[自定义断言对比信息]

很多时候,我们不能值看系统给的错误信息,有时想想自己定义断言信息,这个时候,我们可以用到pytest中的钩子方法。因为我也是第一次学习。所以,这个,我们按照文档,先写成如下:

from test_8 import Foo
def pytest_assertrepr_compare(op,left,right):
    if isinstance(left,Foo) and isinstance(right,Foo) and op == "==":
        return ['Foo实例对比:',
                '   值: %s != %s' % (left.val,right.val)]

如上代码,文件名命名一定要是’conftest.py‘,其他的命名不好使。切记哈。

class Foo(object):
    def __init__(self,val):
        self.val = val

    def __eq__(self,other):
        return self.val == other.val

def test_compare():
    f1 = Foo(1)
    f2 = Foo(2)
    assert f1 == f2

然后运行如上case,结果如下:

image.png

大家发现没有,这个地方运行case,pytest后面带的参数也不一样,对,就是’-q‘