当前位置: 首页 > news >正文

【测试框架篇】单元测试框架pytest(4):assert断言详解

一、前言

用例三要素之一就是对预期结果的断言。

何为断言?简单来说就是实际结果和期望结果去对比,符合预期就测试pass,不符合预期那就测试 failed。断言内容就是你要的预期结果。断言包含对接口响应内容做断言、也包含对落DB的数据做断言。

pytest可以让开发者使用Python断言来验证测试中的期望值。

话不多说,我们来举个小例子熟悉一下,一般我们会在抛出异常之后输出一些提示信息,执行之后就方便查看是什么原因了。

# 异常信息
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

三、异常断言

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

# 断言异常
def test_zero_division():
    with pytest.raises(ZeroDivisionError):
        1 / 0

断言场景:断言它抛的异常是不是预期想要的

代码执行:1/0

预期结果:抛的异常是ZeroDivisionError: division by zero

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

具体方式:这里 1/0 的异常类型是 ZeroDivisionError,异常的 value 值是 divisionby zero

#详细断言异常
def test_zero_division_long():
    with pytest.raises(ZeroDivisionError) as excinfo:
        1 / 0

    # 断言异常类型 type
    assert excinfo.type == ZeroDivisionError
    # 断言异常 value 值
    assert "division by zero" in str(excinfo.value)

excinfo :是一个异常信息实例

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

注意:断言 type 的时候,异常类型是不需要加引号的,断言 value值的时候需转 str

拓展一:match

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

注意:这种方法只能断言value,不能断言type

# 自定义消息
def test_zero_division_long():
    with pytest.raises(ZeroDivisionError, match=".*zero.*") as excinfo:
        1 / 0

该 match 方法的regexp参数与 re.search  函数匹配,因此在上面的示例中 match='zero' 也可以使用

拓展二:检查断言装饰器

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

执行结果

知识点

  • 代码抛出异常,但是和raises指定的异常类相匹配,所以不会断言失败
  • 它相当于一个检查异常装饰器,功能:检查是否有异常,不确定是否有异常
  • with pytest.raise(ZeroDivisionError)  对于故意测试异常代码的情况,使用可能会更好
  • 而@pytest.mark.xfail(raises=ZeroDivisionError) 对于检查未修复的错误(即,可能会发生异常),使用检查断言可能会更好

相关文章:

  • SpringBoot(1)——创建SpringBoot项目的方式
  • 【Vue3】详细探究 watch ref 数组不生效的问题
  • LeetCode 2380 二进制字符串重新安排顺序需要的时间
  • 无人机楼宇间物资运输技术详解
  • 【算法 C/C++】二维前缀和
  • 【密码学——基础理论与应用】李子臣编著 第三章 分组密码 课后习题
  • mysql的MGR
  • 在mac中设置环境变量
  • 校验pytorch是否支持显卡GPU 不支持卸载并安装支持版本
  • 报表控件stimulsoft操作:使用 Angular 应用程序的报告查看器组件
  • ngx_openssl_create_conf
  • Zookeeper实践指南
  • BI 工具响应慢?可能是 OLAP 层拖了后腿
  • 【报错】微信小程序预览报错”60001“
  • unity使用mesh 画图(1)
  • Spring 事务和事务传播机制
  • 接口测试笔记
  • C语言(23)
  • Flutter 学习之旅 之 flutter 使用flutter_native_splash 简单实现设备启动短暂白屏黑屏(闪屏)的问题
  • matlab慕课学习3.1
  • 特朗普与普京通话前夕,英美法德意领导人通话讨论俄乌问题
  • 俄乌刚谈完美国便筹划与两国领导人通话,目的几何?
  • 因救心梗同学缺席职教高考的姜昭鹏顺利完成补考
  • 光速晋级!2025年多哈世乒赛孙颖莎4比0战胜对手
  • 北方将现今年首场大范围高温天气,山西河南山东陕西局地可超40℃
  • 李成钢:近期个别经济体实施所谓“对等关税”,严重违反世贸组织规则