ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

pytest断言

2022-01-18 15:00:57  阅读:181  来源: 互联网

标签:dir01 断言 value assert pytest 报错 type


一、断言 基础知识

测试用例三要素:输入、执行条件、预期输出

预期输出就要靠断言来实现,简单来讲就是实际结果和期望结果去对比,符合预期那就测试pass,不符合预期那就测试 failed

1.断言语法

pytest与unittest不同,pytest使用的是python自带的assert关键字来进行断言,unittest使用的是自己的断言,需要用self来调用

assert关键字后面可以接一个表达式,只要表达式的最终结果为True,那么断言通过,用例执行成功,否则用例执行失败

常用格式:

  • assert xx :判断 xx 为真
  • assert not xx :判断 xx 不为真
  • assert a in b :判断 b 包含 a
  • assert a == b :判断 a 等于 b
  • assert a != b :判断 a 不等于 b
  • assert a > b :判断 a 大于 b(<, >=, <=等等)

2.自定义断言失败信息

第一种:不做任何处理,默认报错信息,如 assert "1" == '23' 失败后,报告:AssertionError: assert '1' == '23'

第二种:自定义报错信息,如:assert "1" == '23', '1 难道不等于 23 么?'  失败后报告: AssertionError: 1 难道不等于 23 么?

 二、异常断言

1.异常断言 pytest.raises

pytest.raises 作为上下文管理器,当其管理的执行代码抛出我们指定类型的异常时,可以异常捕获为一个异常对象,不会报错,继续执行后续代码

pytest.raises只会捕获指定的异常类型,遇到其他类型异常或者没有报错,都会直接报错造成用例执行失败

应用场景:在一些代码块或者函数会引发意料之中的异常,导致程序无法运行时,使用 raises 捕获匹配到的异常,代码可以继续正常运行

def test_dir01_8():
    # pytest.raises会对AttributeError类型进行捕获,执行代码如出现这个错误,不报错会继续往下执行,对于去其他类型错误还是会报错
    # 常见类型:AttributeError ValueError等等  BaseException(万能捕获)
    with pytest.raises(AttributeError) as e:
        raise AttributeError('属性报错') # 这个是执行代码
        # raise ValueError('值报错')
    print()
    print('错误类型:', type(e.type), e.type) # 错误类型: <class 'type'> <class 'AttributeError'>
    print('报错类型名称:', type(e.typename), e.typename) # 报错类型名称: <class 'str'> AttributeError
    print('报错信息:', type(e.value),e.value) # 报错信息: <class 'AttributeError'> 属性报错

    assert e.type == AttributeError
    assert e.typename == 'AttributeError'
    # assert e.value == '属性报错' # 这是错误语法,type(e.value)=<class 'AttributeError'>,是个类不是字符串,需要用下面的方式
    assert '属性报错' in str(e.value)

执行结果:用例通过 

执行过程:执行代码报属性错误 --> 异常管理器捕获到,并生成异常实例 e  -->  继续执行管理器外其他代码

异常对象常用属性:type、typename、value、traceback

注意:异常管理的执行代码没有出现预言的异常的话,会报错,用例执行失败

2.异常断言 正则匹配

pytest.raises上下文管理器,支持正则表达式,match参数即为正则表达式,表示的是re.search()

正则匹配的是异常实例的value,如果异常类型匹配,且异常信息value和 re.search('表达式') 也匹配,则表示出现了预期内的异常

执行结果:通过

def test_dir01_9():
    with pytest.raises(ValueError, match=r'.*\d$') as e:
        # raise ValueError('值报错') # 这个会造成用例执行失败:AssertionError: Regex pattern '.*\\d$' does not match '值报错'.
        raise ValueError('值报错666')
    print()
    print('错误类型:', type(e.type), e.type)             # 错误类型: <class 'type'> <class 'ValueError'>
    print('报错类型名称:', type(e.typename), e.typename) # 报错类型名称: <class 'str'> ValueError
    print('报错信息:', type(e.value),e.value)            # 报错信息: <class 'ValueError'> 值报错666
    print('报错:', type(e.traceback),e.traceback)        # 报错:<class '_pytest._code.code.Traceback'> [<TracebackEntry D:\代码\自动化测试\pytest_test\dir01\dir01_test.py:31>]

    assert e.type == ValueError
    assert e.typename == 'ValueError'
    # assert e.value == '属性报错' # 这是错误语法,type(e.value)=<class 'AttributeError'>,是个类不是字符串,需要用下面的方式
    assert '值报错' in str(e.value)

 3.检查断言装饰器

@pytest.mark.xfail(raises='异常类型') 

检查是否有异常,常见情况有以下三种:

@pytest.mark.xfail(raises=ValueError) # 检查断言装饰器,检查ValueError类型错误
def test_dir01_9():
    # 情况一:出现预期报错,用例 XFAIL,不继续往后执行
    # raise ValueError('值报错') # XFAIL dir01/dir01_test.py::test_dir01_9

    # 情况二:出现其他报错,用例 FAILED,不会影响用例,不继续往后执行
    raise AttributeError('属性报错') # FAILED dir01/dir01_test.py::test_dir01_9 - AttributeError: 属性报错

    # 情况三:没有任何报错,用例 XPASS
    # print('能到这里么?') # XPASS dir01/dir01_test.py::test_dir01_9

总结:

  • with pytest.raise 对于故意测试异常代码的情况,使用可能会更好
  • @pytest.mark.xfail 对于检查未修复的错误(即,可能会发生异常),使用检查断言可能会更好

>>参考小菠萝<<

标签:dir01,断言,value,assert,pytest,报错,type
来源: https://www.cnblogs.com/xp1315458571/p/15814542.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有