前言

pytest作为单元测试框架,自然少不了断言功能,用过unittest的人都知道,在unittest中有丰富的断言方法,比如assertEqual()、assertIn()、assertTrue()、assertIs()等等,而在pytest中,并没有提供特殊的断言方法,而是直接使用python自带的关键字assert来进行断言操作。

下面我们就通过一些来看看在pytest中是如何进行断言操作的吧

常用断言

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

举个:

  1. import pytest
  2. def test_demo1():
  3. a = 1
  4. assert a
  5. def test_demo2():
  6. a = 0
  7. assert not a
  8. def test_demo3():
  9. s = 'hello'
  10. assert 'h' in s
  11. def test_demo4():
  12. a = 3
  13. assert a == 3
  14. def test_demo5():
  15. a = 4
  16. assert a != 3
  17. if __name__ == '__main__':
  18. pytest.main()

运行结果如下:

如果想在异常的时候,能够输出一些提示信息,可在直接在断言后面加上提示信息,如下:

  1. import pytest
  2. def test_demo6():
  3. a = 5
  4. assert a == 3, "两者不相等"

运行结果:

异常断言

在实际测试的过程中,我们经常需要对特定异常进行断言,可以使用 pytest.raises 作为上下文管理器,当抛出异常时可以获取到对应的异常实例

举个:

  1. import pytest
  2. def test_zero_division():
  3. 1 / 0
  4. if __name__ == '__main__':
  5. pytest.main()

运行结果:

可以看到,这里程序异常了,所以我们需要捕获并断言异常。

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

预期结果:ZeroDivisionError: division by zero,其中ZeroDivisionError为错误类型,division by zero为具体错误值。

断言方式: 断言异常的type和value值。

断言代码如下

  1. import pytest
  2. def test_zero_division():
  3. with pytest.raises(ZeroDivisionError) as excinfo:
  4. 1 / 0
  5. # 断言异常类型 type
  6. assert excinfo.type == ZeroDivisionError
  7. # 断言异常 value 值
  8. assert "division by zero" in str(excinfo.value)
  9. if __name__ == '__main__':
  10. pytest.main()

excinfo作为异常信息实例,拥有type 、value、.traceback等属性

excinfo.value的值是元组,所以要转成字符串

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

拓展:match

你也可以给pytest.raises()传递一个关键字参数match,来测试异常的字符串表示str(excinfo.value)是否符合给定的正则表达式(和unittest中的TestCase.assertRaisesRegexp方法类似):

  1. import pytest
  2. def func():
  3. raise ValueError("Exception 123 raised")
  4. def test_match():
  5. # pytest.raises()函数,
  6. # 可以用元组的形式传递参数,只需要触发其中任意一个即可。
  7. # 通过match可以设置通过正则表达式匹配异常。
  8. with pytest.raises((ValueError, RuntimeError), match=r'.* 123 .*') as excinfo:
  9. func()
  10. assert 123 in strexcinfo.value
  11. if __name__ == '__main__':
  12. pytest.main()

拓展:检查断言装饰器

pytest.mark.xfail()也可以接收一个raises参数,来判断用例是否因为一个具体的异常而导致失败:

  1. @pytest.mark.xfail(raises=ZeroDivisionError)
  2. def test_f():
  3. 1 / 0

执行结果:

如果test_f()触发的异常类型和raises指定的异常类型一致,则用例被标记为xfailed

如果test_f()测试成功,用例的结果是xpassed,而不是passed

pytest.raises适用于检查由代码故意引发的异常;而@pytest.mark.xfail()更适合用于记录一些未修复的 Bug

参考

pytest-chinese-doc

Pytest学习笔记4-assert断言的更多相关文章

  1. [转载]pytest学习笔记

    pytest学习笔记(三)   接着上一篇的内容,这里主要讲下参数化,pytest很好的支持了测试函数中变量的参数化 一.pytest的参数化 1.通过命令行来实现参数化 文档中给了一个简单的例子, ...

  2. Pytest学习(二) - 断言的使用

    一.前言 学习pytest总会习惯性的和unittest对比使用,自然就断言pytest和unittest也是有些区别的. 二.断言对比 unittest 断言 assertEqual(a, b) # ...

  3. pytest自动化7:assert断言

    前言:assert断言就是将实际结果和期望结果做对比,符合预期结果就测试pass,不符合预期就测试failed. 实例1:简单断言 实例1优化版--增加异常信息文字描述 异常断言 excinfo 是一 ...

  4. Pytest(10)assert断言

    前言 断言是写自动化测试基本最重要的一步,一个用例没有断言,就失去了自动化测试的意义了.什么是断言呢? 简单来讲就是实际结果和期望结果去对比,符合预期那就测试pass,不符合预期那就测试 failed ...

  5. pytest学习笔记

    From: https://blog.csdn.net/gaowg11/article/details/54910974 由于对测试框架了解比较少,所以最近看了下pytest测试框架,对学习心得做个记 ...

  6. pytest 学习笔记一 入门篇

    前言 之前做自动化测试的时候,用的测试框架为Python自带的unittest框架,随着工作的深入,发现了另外一个框架就是pytest (官方地址文档http://www.pytest.org/en/ ...

  7. pytest学习笔记(一)

    这两天在学习pytest,之前有小用到pytest,觉得这个测试框架很灵巧,用在实现接口自动化(pytest+requests)非常的轻便,然后很有兴致的决定学习下,然后又发现了pytest-sele ...

  8. Pytest学习笔记11-重复执行用例插件pytest-repeat

    前言 我们在平时做测试的时候,经常会遇到一些偶现的bug,通常我们会多次执行来复现此类bug,那么在自动化测试的时候,如何多次运行某个或某些用例呢,我们可以使用pytest-repeat这个插件来帮助 ...

  9. Pytest学习笔记12-配置文件pytest.ini

    前言 pytest配置文件可以改变pytest的运行方式,它是一个固定的文件pytest.ini文件,读取配置信息,按指定的方式去运行. 常用的配置项 marks 作用:测试用例中添加了自定义标记( ...

随机推荐

  1. Python数模笔记-Sklearn(4)线性回归

    1.什么是线性回归? 回归分析(Regression analysis)是一种统计分析方法,研究自变量和因变量之间的定量关系.回归分析不仅包括建立数学模型并估计模型参数,检验数学模型的可信度,也包括利 ...

  2. 迷失在Mysql的锁世界~

    1.饮料 这是一杯饮料. 这是3杯饮料,每杯饮料的味道各不相同. 但是人类并不称呼[饮料]为[饮料],而是称呼[饮料]为[记录]. 2.红章鱼 这个红色的,长的像章鱼的家伙,我们就叫它红章鱼~ 红章鱼 ...

  3. 通过Dapr实现一个简单的基于.net的微服务电商系统(十二)——istio+dapr构建多运行时服务网格

    多运行时是一个非常新的概念.在 2020 年,Bilgin Ibryam 提出了 Multi-Runtime(多运行时)的理念,对基于 Sidecar 模式的各种产品形态进行了实践总结和理论升华.那到 ...

  4. 【Mysql】数据库事务,脏读、幻读、不可重复读

    一.什么是数据库事务 数据库事务( transaction)是访问并可能操作各种数据项的一个数据库操作序列,这些操作要么全部执行,要么全部不执行,是一个不可分割的工作单位.事务由事务开始与事务结束之间 ...

  5. java基础——参数的应用

    命令行传递参数(少用) 有时候,你希望运行一个程序时,在传递给它信息.这个时候,要靠 传递命令行 参数 给main()函数实现. package com.dong.method;​public cla ...

  6. [Java] Spring 原理

    IOC(Inverse of Control)控制反转 依赖对象的获得被反转了,由自己创建变为从IOC容器获取 优点 代码更简介,不需要new对象 面向接口编程,使用者与具体类解耦,易扩展 方便进行A ...

  7. [bug] eclipse 点击new菜单后没有新建java project或class选项

    参考 https://blog.csdn.net/u013001763/article/details/54405758

  8. Building SPEC CPU2006

    https://developer.amd.com/wordpress/media/2012/10/building_speccpu.html Building SPEC CPU2006 This f ...

  9. xrandr 直接输这个能显示可用的分辨和当前的分辨率 xrandr -s 1920x1200就设置成指定的分辨率

    利用 xrandr 命令修改屏幕分辨率 时间  2016-10-29 原文   http://blog.csdn.net/mao0514/article/details/52965700   问题背景 ...

  10. Docker——Registry 通过Shell管理私有仓库镜像

    使用方法: 复制代码保存为 image_registry.sh sh image_registry.sh  -h   #查看帮助 HUB=10.0.29.104:5000 改为自己的地址 #!/bin ...