前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Pytest(四)Pytest断言

Pytest(四)Pytest断言

作者头像
雷子
发布2022-04-06 08:32:45
1K0
发布2022-04-06 08:32:45
举报
文章被收录于专栏:雷子说测试开发

系列分享

Pytest系列(一)初次了解

Pytest(二)执行规则以及编写执行多条用例

Pytest(三)Pytest执行命令


什么是断言:

测试的成功与否就是拿实际的结果与预期的结果进行比较,这个比的过程就是断言(assert)

Pytest断言

Pytest的断言和unittest断言不一样,Pytest使用的是python自带的关键字assert来断言,

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

Pytest的断言方式及应用场景

比较大小与是否相等:

assert a == b:判断a等于b

assert a !=b:判断a不等于b

判断包含或不包含:

assert a in b:判断b包含a

assert a not in b:判断b不包含a

提示:b可以是字符串,可以是列表,元组等都可以。

对类型的判断:

assert isinstance(a,int):判断a是否是int类型数据。

判断方法或者函数的返回值是否为真:

assert xx:判断xx结果为真。

assert not xx:判断xx结果不为真。

代码语言:javascript
复制
#演示
import pytest

# 功能
def add(a,b):
    return a + b

# 测试相等
def test_add():
    assert add(3,4) == 7 

# 测试不相等
def test_add2():
    assert add(17,22) != 50

# 测试大于
def test_add3():
    assert add(17,22) <= 50

# 测试小于
def test_add4():
    assert add(17,22) >= 50

#测试包含
def test_cont():
    assert 1 in [1,2]
#测试不包含
def test_uncont():
    assert 3 not in [1,2]
    
  
if __name__ == '__main__':
    pytest.main("test_assert.py")

结果:

基本上常用的就这么几种

2)断言预期的异常

将异常信息存储到一个变量中,变量的类型则为异常类,包含异常的type、value和traceback等信息

代码语言:javascript
复制
import pytest


def test_exception_value():
    with pytest.raises(ZeroDivisionError) as zero:
        1 / 0  # 此处可以是方法,也可以是表达式

    print(zero.traceback)
    assert "division by zero" in str(zero.value)
    assert zero.type == ZeroDivisionError
    assert zero.typename == "ZeroDivisionError"


if __name__ == '__main__':
    pytest.main()

注意:在上下文管理器的作用域中,raises代码必须是最后一行,否则其后面的代码将不会执行。

拓展:

如果我们不知道预期异常的是什么,我们可以使用 match 和 raise 进行自定义异常。

给pytest.raises()函数传递一个关键字参数match,通过match设置的字符串正则表达式匹配异常信息。

和Unittest中的TestCase.assertRaisesRegexp方法类似。

代码语言:javascript
复制
import pytest
# func函数会抛出一个异常,
def func():
    raise ValueError("Exception 123 raised")
def test_match():
    # pytest.raises()函数,
    # 可以用元组的形式传递参数,只需要触发其中任意一个即可。
    # 通过match可以设置通过正则表达式匹配异常。
    with pytest.raises((ValueError, RuntimeError), match=r'.* 123 .*') as ve:
        func()  
        # 说明:myfunc()抛出的异常被match设置的字符串匹配到
        # 也就是捕获到了该异常。
        # 然后下面是断言,123是否包含在捕获异常的说明中。
    assert "123" in str(ve.value)
if __name__ == '__main__':
    pytest.main()

优化断言

我们可以在异常的时候,输出一些提示信息,这样报错后,可以方便我们来查看原因。

代码语言:javascript
复制
import pytest

def func():
    return 100

def test_case_666():
    a = func()
    assert a % 3 == 0, "判断a是否能被3整除,当前a的值为:%s" %a


if __name__ == '__main__':
    pytest.main()

结果如下:

使用标记检查异常

@pytest.mark.xfail(raises=ZeroDivisionError)

代码语言:javascript
复制
import pytest


@pytest.mark.xfail(raises=ZeroDivisionError)
def test_exception_value():
    1 / 0
if __name__ == '__main__':
    pytest.main()

结果如下:

说明代码:

预期抛出ZeroDivisionError异常,

实际测试用例执行也抛出了ZeroDivisionError异常。

测试结果:该用例是xfailed

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-03-02,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 雷子说测试开发 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档