1、什么是断言

对于测试来讲,不管是功能测试,自动化测试,还是单元测试,一般都会预设一个正确的预期结果,而在测试执行的过程中会得到一个实际的结果。

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

2、Pytest断言

  • 与Unittest不同,Pytest使用的是Python自带的assert关键字来进行断言。
  • assert关键字后面可以接一个表达式,只要表达式的最终结果为True,那么断言通过,用例执行则为成功,否则用例执行失败。

3、Pytest的断言方式及应用场景

(1)使用assert语句

Pytest里面的断言实际上就是Python里面的assert断言方法。

1)比较大小与是否相等:

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

2)判断包含或不包含:

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

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

3)对类型的判断:

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

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

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

例如:

#用于判断素数
def is_prime(n):
if n <= 1:
return False
for i in range(2, n):
if n % i == 0:
return False
return True # 判断是否为素数
def test_true():
assert is_prime(13)
# 或者不为素数
assert not is_prime(13)

基本上常用的就这么几种。

(2)断言预期的异常

将异常信息存储到一个变量中,变量的类型则为异常类,包含异常的typevaluetraceback等信息

import pytest

def test_exception_value():
with pytest.raises(ZeroDivisionError) as zero:
1 / 0 # 此处可以是方法,也可以是表达式 # print(zero) <ExceptionInfo ZeroDivisionError('division by zero') tblen=1>
# print(zero.tb)# <traceback object at 0x0000021B6068BD48>
# print(zero.typename) # 字符串"ZeroDivisionError"
# print(zero.type) # 异常类型<class 'ZeroDivisionError'>
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代码必须是最后一行,否则其后面的代码将不会执行。

(3)拓展

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

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

Unittest中的TestCase.assertRaisesRegexp方法类似。

示例:

import pytest

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

4、优化断言

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

示例如下:

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() """
运行结果: ========没加注释的测试结果==========
Expected :0
Actual :1
<Click to see difference> def test_case_666():
a = 100
> assert a % 3 == 0
E assert 1 == 0 test_01.py:55: AssertionError Assertion failed ========添加注释的测试结果==========
Expected :0
Actual :1
<Click to see difference> def test_case_666():
a = 100
> assert a % 3 == 0, "判断a是否能被3整除,当前a的值为:%s" %a
E AssertionError: 判断a是否能被3整除,当前a的值为:100
E assert 1 == 0 test_01.py:53: AssertionError Assertion failed
"""

5、使用标记检查异常

使用注释:@pytest.mark.xfail(raises=ZeroDivisionError)

示例:

import pytest

@pytest.mark.xfail(raises=ZeroDivisionError)
def test_exception_value():
1 / 0 if __name__ == '__main__':
pytest.main() # 说明代码:
# 预期抛出ZeroDivisionError异常,
# 实际测试用例执行也抛出了ZeroDivisionError异常。
# 测试结果:该用例是xfailed

『德不孤』Pytest框架 — 8、Pytest断言的更多相关文章

  1. 『德不孤』Pytest框架 — 1、Pytest测试框架介绍

    目录 1.什么是单元测试框架 2.单元测试框架主要做什么 3.单元测试框架和自动化测试框架有什么关系 4.Pytest测试框架说明 5.Pytest框架和Unittest框架区别 (1)Unittes ...

  2. 『德不孤』Pytest框架 — 2、Pytest的基本使用

    目录 1.Pytest安装 2.Pytest常用插件 3.Pytest运行的第一个例子 4.Pytest框架的运行方式 5.在PyCharm中以Pytest的方式运行测试用例 1.Pytest安装 C ...

  3. 『德不孤』Pytest框架 — 3、Pytest的基础说明

    目录 1.Pytest参数介绍 2.Pytest框架用例命名规则 3.Pytest Exit Code说明 4.pytest.ini全局配置文件 5.Pytest执行测试用例的顺序 1.Pytest参 ...

  4. 『德不孤』Pytest框架 — 10、setUp()和tearDown()函数

    目录 1.setUp()和tearDown()函数介绍 2.setUp()和tearDown()函数作用 3.setUp()和tearDown()函数说明 4.示例 (1)方法级 (2)类级 (3)函 ...

  5. 『德不孤』Pytest框架 — 11、Pytest中Fixture装饰器(一)

    目录 1.Fixture装饰器的用途 2.Fixture参数说明 3.Fixture装饰器简单应用 4.yield执行后置函数 1.Fixture装饰器的用途 做测试前后的初始化设置,如测试数据准备, ...

  6. 『德不孤』Pytest框架 — 14、Pytest中的conftest.py文件

    目录 1.conftest.py文件介绍 2.conftest.py的注意事项 3.conftest.py的使用 4.不同位置conftest.py文件的优先级 5.conftest.py中Fixtu ...

  7. 『德不孤』Pytest框架 — 15、Pytest参数化

    目录 1.Pytest参数化说明 2.Pytest参数化方式 3.parametrize装饰器参数说明 4.Pytest参数化(单个参数) 5.Pytest参数化(多个参数) 6.ids参数说明 1. ...

  8. 『德不孤』Pytest框架 — 6、Mark分组执行测试用例

    目录 1.Pytest中的Mark介绍 2.Mark的使用 3.Mark的注册和使用 4.使用Mark完成失败重试 5.扩展 1.Pytest中的Mark介绍 Mark主要用于在测试用例/测试类中给用 ...

  9. 『德不孤』Pytest框架 — 12、Pytest中Fixture装饰器(二)

    目录 5.addfinalizer关键字 6.带返回值的Fixture 7.Fixture实现参数化 (1)params参数的使用 (2)进阶使用 8.@pytest.mark.usefixtures ...

随机推荐

  1. java日志打印使用指南

    一.简介 日志打印是java代码开发中不可缺少的重要一步. 日志可以排查问题,可以搜集数据 二.常用日志框架 比较常用的日志框架就是logback, 一些老项目会使用log4j,他们用的都是slf4j ...

  2. 【记录一个问题】笔记本ThinkPad X1-Extreme安装ubuntu 18后,更新nvidia显卡驱动后出现显示问题,无法再登录

    如题 更新的过程如下: sudo ubuntu-drivers autoinstall sudo reboot 后续准备在recovery模式中尝试删除驱动.

  3. 切换不同的echarts时,出现图标缩小,报警告,Can’t get dom width or height!

    出现这样的原因是因为,在切换的时候,图表所对应的标签还没有显示出来,最好将代码放在$nextick里面执行,并且,采用使用v-if进行切换 转载:https://www.pianshen.com/ar ...

  4. 学习OAuth 2.0

    认识OAuth 2.0 OAuth 2.0 是行业标准的授权协议. OAuth 2.0 专注于客户端开发人员的简单性,同时为 Web 应用程序.桌面应用程序.移动设备提供特定的授权流程. 应用场景 有 ...

  5. Android开发----EditText&ImageView&第三方库的加载

    EditText组件 一个实例描述该组件的全部属性(虚假的登录界面) 在activity.xml中 <?xml version="1.0" encoding="ut ...

  6. 网络分层和TCP三次握手

    它们就是 OSI 的七层模型,和 TCP/IP 的四层 / 五层模型.这两种模型的最大区别,就是前者在传输层和应用层之间,还有会话层和表示层,而后者没有. TCP三次握手: 位码即tcp标志位,有6种 ...

  7. Ubuntu更换镜像源

    不同的源 当修改sources.list文件时,我们需要将下面任意一个镜像源的代码复制粘贴到该文件中. 阿里源 # 阿里镜像源 deb http://mirrors.aliyun.com/ubuntu ...

  8. Jackson转换为Collection、Array

    1. Jackson转化为Array 注意的地方就是实体类一定要有无参的构造方法,否则会报异常 //com.fasterxml.jackson.databind.exc.InvalidDefiniti ...

  9. 对战平台虚拟War3局域网的原理对战平台虚拟War3局域网的原理

    转载请注明来源:https://www.cnblogs.com/hookjc/ 以War3为例,启动魔兽后,首先是如何看见主机的问题:魔兽是通过TCP/UDP协议进行数据发送的,那如何实现看到对方?我 ...

  10. Ubuntu下Java JDK安装

    1.仓库安装 待更新 2.手动安装 1.下载linux平台sdk. 官网:https://www.oracle.com/technetwork/java/javase/downloads/index. ...