Novice学Pytest(2)-assert断言

一、前言

  什么是断言,为什么要断言,要如何断言。。。刚入门时,可能很多小伙伴会有各种疑问(大神请绕过~)。顾名思义,断言是判断一个用例的执行结果,断言通过,用例执行成功,否则用例执行失败。工作中写自动化脚本时,少不了断言,我们工作项目用的是pytest。pytest使用的是python自带的assert关键字来进行断言,assert关键字后面可以接一个表达式,只要表达式的最终结果为True,so断言通过。

二、简单举例

  想在抛出异常之后输出一些提示信息,执行之后就方便查看是什么原因了

#!/usr/bin/env python
# -*- coding: utf-8 -*-

"""
__Title__   =
__Time__    =  2021/8/7 16:02
__Author__  =  Isaymore
__Blog__    =  https://www.cnblogs.com/huainanhai/
"""

def f():
    return 3

def test_function():
    a = f()
    assert a % 2 == 0,"判断a为偶数,当前a的值为:%s" % a

  执行结果:

三、常用断言

  pytest断言实际用的是python的assert断言方法,常用的有以下几种 

  • assert xx :判断 xx 为真
  • assert not xx :判断 xx 不为真
  • assert a in b :判断 b 包含 a
  • assert a == b :判断 a 等于 b
  • assert a != b :判断 a 不等于 b
#!/usr/bin/env python
# -*- coding: utf-8 -*-

"""
__Title__   =
__Time__    =  2021/8/7 16:02
__Author__  =  Isaymore
__Blog__    =  https://www.cnblogs.com/huainanhai/
"""

def f(x):
    return x
def test_bool():
    assert f(0)

def test_str():
    assert "s" in f("Isaymore")

def test_equl():
    assert f(2) == 2

  执行结果:

四、异常断言

  可以使用pytest.raises作为上下文管理器,当抛出异常时可以获取到对应的异常实例

# 断言异常
def test_zerodivision():
    with pytest.raises(ZeroDivisionError) as excinfo:
        1 / 0
    # 断言异常类型 type
    assert excinfo.type == ZeroDivisionError
    # 断言异常值 value
    assert "division by zero" in str(excinfo.value)

  断言异常场景:断言抛出的异常是不是符合预期

  预期:抛出异常是ZeroDivisionError: division by zero

  如何断言:通常是断言异常的type和value

  断言例子:1/0的异常类型是ZeroDivisionError,异常的value值是division by zero

  excinfo:是一个异常信息实例

  主要属性:.type、.value、.traceback

  Notes:断言type时,异常类型不需要加引号,断言value值需转str

五、异常断言拓展

  1、match:可以将match关键字参数传递给上下文管理器,以测试正则表达式与异常的字符串表示形式是否匹配

def test_zero_division_long():
    with pytest.raises(ZeroDivisionError,match=".*zero.*") as excinfo:
        1 / 0

def test_zero_division_long2():
    with pytest.raises(ZeroDivisionError,match="zero") as excinfo:
        1 / 0

  执行结果:

  2、断言装饰器

# 断言装饰器
@pytest.mark.xfail(raises=ZeroDivisionError)
def test_f():
    1 / 0

  执行结果:

六、总结  

  • 代码抛出异常,但如果和raises指定的异常类相匹配,就不会断言失败
  • with pytest.raise(ZeroDivisionError) 对于故意测试异常代码的情况,使用可能会更好
  • 而@pytest.mark.xfail(raises=ZeroDivisionError) 对于检查未修复的错误(即,可能会发生异常),使用检查断言可能会更好

参考链接:https://www.cnblogs.com/poloyy/p/12641778.html

posted @ 2022-04-22 22:25  方缘  阅读(47)  评论(0编辑  收藏  举报