Pytest精通指南(19)断言和异常处理

news2024/11/21 1:41:45

文章目录

      • Pytest assert 简介
      • assert 应用场景
      • assert 测试结果
      • assert 基本用法
      • Pytest raises 简介
      • raises 用途和作用
      • raises 与 try 的区别
      • python代码中使用try
      • 在测试用例中使用try
      • 使用pytest.raises()


请添加图片描述

Pytest assert 简介

断言(Assertion)是编程中的一个基本概念,用于验证程序中的某个条件是否为真。

在单元测试中,断言是验证代码行为是否符合预期的主要手段。如果断言的条件不满足(即为假),则测试失败,通常会导致程序抛出AssertionError异常。

pytest测试框架中,assert是进行断言的核心机制;它依赖于Python内置的assert关键字。
assert语句中的表达式求值为False时,测试将失败,并且程序执行将立即停止,assert语句之后的代码将不会被执行。

assert 应用场景

pytest的assert断言在各种测试场景中都有广泛应用,包括但不限于:

  • 函数或方法的返回值验证;
  • 数据结构或对象状态的验证;
  • 异常处理的验证;
  • 接口的响应验证;
  • 数据库操作结果的验证等。

assert 测试结果

pytest执行测试用例时,它会根据assert断言的结果来判断测试是否通过。

  • 如果断言成功,则测试通过;
  • 如果断言失败,则测试失败,终止后续代码的执行,并显示相应的错误信息。

assert 基本用法

使用语法:

  • assert 表达式
  • assert 表达式, 描述
  • 如果断言失败,描述作为AssertionError的内容展示

示例代码

def add(x, y):
    return x + y


def test_case_01():
    print("进入测试函数")
    assert add(2, 3) == 5
    print("断言成功")


def test_case_02():
    print("进入测试函数")
    assert add(2, 3) == 10
    print("断言失败")  # 不会被执行


def test_case_03():
    print("进入测试函数")
    # 带描述性错误消息的用法
    assert add(2, 3) == 10, "结果与预期不符"
    print("断言失败")  # 不会被执行

执行结果

在这里插入图片描述

Pytest raises 简介

pytest.raises() 是一个内建于 pytest 测试框架中的上下文管理器;

它允许我们在编写单元测试时断言某个特定的异常会被抛出。

当代码块中抛出了预期的异常时,pytest.raises() 会捕获该异常,并且测试会继续进行。

如果没有抛出异常,或者抛出了不同类型的异常,测试将会失败。

raises 用途和作用

  • 断言异常类型:我们可以使用 pytest.raises() 来断言某个函数或方法会抛出特定类型的异常。
  • 获取异常细节:通过 pytest.raises(),我们可以访问被捕获的异常实例,从而获取异常的详细信息,比如异常类型、异常信息(message)等。
  • 匹配异常信息pytest.raises() 支持使用 match 参数来指定一个正则表达式,该表达式用于匹配异常信息。如果异常信息符合该正则表达式,测试会通过。
  • 异常处理后的代码不会执行:当 pytest.raises() 捕获到异常后,该异常之后的代码块将不会执行。这与标准的 try...except 块的行为是一致的。

raises 与 try 的区别

直接使用 try…except 捕捉异常的区别:

  • 断言性pytest.raises() 是一个断言,它明确指出了测试失败的条件,即没有抛出预期的异常或抛出了错误的异常类型。而 try...except 只是简单地捕获异常,并不直接表明测试是否通过。
  • 报告pytest 会自动报告哪些测试失败,并显示失败的原因,包括未抛出的异常或异常类型不匹配等。而使用 try...except,你可能需要手动添加更多的逻辑来报告测试状态。
  • 可读性pytest.raises() 的语法更加清晰,它直接指出了期望抛出的异常类型,以及可能的异常信息。而 try...except 需要更多的上下文来理解测试的意图。
  • 灵活性pytest.raises() 提供了更多的选项,比如 match 参数可以用来匹配异常信息。而 try...except 则需要额外的逻辑来处理这些信息。
  • 集成性pytest.raises()pytest 测试框架完美集成,你可以利用 pytest 的其他功能,如参数化测试、测试固件(fixtures)等。而 try...except 只是一个 Python 的基础语法结构,没有与测试框架的深度集成。

python代码中使用try

示例代码

print("测试开始")
try:
    a = int(input("请输入被除数:"))
    b = int(input("请输入除数:"))
    res = a / b
    print(f"res={res}")
except ValueError as e1:
    print("格式异常:", e1)
except ZeroDivisionError as e2:
    print("被除数异常:", e2)
except ArithmeticError as e3:
    print("算数异常:", e3)
except Exception as e4:
    print("意外异常:", e4)
print("测试完成")

执行结果

在这里插入图片描述

在测试用例中使用try

示例代码

def test_case_01():
    print("测试开始")
    try:
        a = int(input("请输入被除数:"))
        b = int(input("请输入除数:"))
        res = a / b
        print(f"res={res}")
    except ValueError as e1:
        print("格式异常:", e1)
    except ZeroDivisionError as e2:
        print("被除数异常:", e2)
    except ArithmeticError as e3:
        print("算数异常:", e3)
    except Exception as e4:
        print("意外异常:", e4)
    print("测试完成")

执行结果

在这里插入图片描述

使用pytest.raises()

示例代码

import pytest


# 捕捉指定异常:哪怕with下面的代码发生了ZeroDivisionError类型的异常,整个用例不会认为是异常用例,认为是正常的
def test_case_01():
    with pytest.raises(ZeroDivisionError):
        res = 10 / 0
        print('结果:', res)  # 上述代码抛出异常后,不会继续执行后续代码


# 捕捉多个异常,如果实际代码中抛出的异常是其中一个则认为测试用例通过
def test_case_02():
    with pytest.raises(expected_exception=(ValueError, ZeroDivisionError)):
        raise ZeroDivisionError("除数为0")


# 利用match参数使用正则表达式
def test_case_03():
    with pytest.raises(ValueError, match='自定义错误'):
        raise ValueError("自定义错误:xxxx发生了意外")


# 利用match参数使用正则表达式,如果异常信息中包含xxxx则认为测试用例通过
def test_case_04():
    with pytest.raises(ValueError, match=r'.*xxxx.*'):
        raise ValueError("自定义错误:xxxx发生了意外")


# 没有预期的异常就报错,同时,后面的代码不会被执行
def test_case_05():
    with pytest.raises(ZeroDivisionError):
        print("这句代码会被执行")
        raise ValueError("数据异常")
    print("这句代码不会被执行")


# 获取捕获的异常的细节(异常类型, 异常信息)
def test_case_06():
    with pytest.raises(ValueError) as exc_info:
        raise ValueError("数据异常")
    assert exc_info.type is ValueError
    assert exc_info.value.args[0] == "数据异常xxx"

执行结果

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1609565.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

代码随想录算法训练营Day4 | 24.两两交换链表中的节点、19删除链表中的第N个节点、链表相交、142.环形链表

24.两两交换链表中的节点 题目:给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。 题目链接:24. 两两交换…

蛋白质亚细胞定位预测(生物信息学工具-017)

直奔主题,下面这张表图怎么制作,一般都是毕业论文hh,蛋白质的亚细胞定位如何预测? 01 方法 https://wolfpsort.hgc.jp/ #官网小程序,简单好用,不用R包,python包,linux程序&#x…

Linux的学习之路:14、文件(1)

摘要 有一说一文件一天学不完,细节太多了,所以这里也没更新完,这里部分文件知识,然后C语言和os两种的文件操作 目录 摘要 一、文件预备 二、c文件操作 三、OS文件操作 1、系统文件I/O 2、接口介绍 四、思维导图 一、文件…

C++笔记:类和对象(一)

类和对象 认识类和对象 先来回忆一下C语言中的类型和变量,类型就像是定义了数据的规则,而变量则是根据这些规则来实际存储数据的容器。类是我们自己定义的一种数据类型,而对象则是这种数据类型的一个具体实例。类就可以理解为类型&#xff0c…

在Ubuntu 22.04上安装配置VNC实现可视化

前面安装的部分可以看我这篇文章 在Ubuntu 18.04上安装配置VNC实现Spinach测试可视化_ubuntu18开vnc-CSDN博客 命令差不多一样: sudo apt update sudo apt install xfce4 xfce4-goodies sudo apt install tightvncserver这个时候就可以启动server了 启动server&…

音频---数字mic

一、常见的数字mic pdm麦通过codec芯片将数字麦转换为i2s信号输入到SOC 纯pdm麦就是直接进入SOC的pdm接口,走的是PDM信号,PDM信号就是两个线,一根数据线一根时钟线(如顺芯ES7201/7202把MIC信号转换成PDM)。 二、DMIC…

等保合规:保护企业网络安全的必要性与优势

前言 无论是多部网络安全法律法规的出台,还是最近的“滴滴被安全审查”事件,我们听得最多的一个词,就是“等保。” 只要你接触安全类工作,听得最多的一个词,一定是“等保。” 那么,到底什么是“等保”呢…

Docker部署SpringBoot服务(Jar包映射部署)

介绍 项目在docker部署运行以后,每次需更新jar包时,都得重新制作镜像,再重新制作容器。流程及其繁琐,效率极低。 以下步骤是在不更新镜像和容器的前提下,直接更新jar完成项目更新的操作。 不重新制作镜像部署 1. 创…

Python简化远程部署和系统管理的工具库之fabric使用详解

概要 Python Fabric库是一个用于简化远程部署和系统管理的工具库。它提供了一组简洁而强大的函数和工具,可以帮助开发者轻松地在多台远程主机上执行命令、上传文件、下载文件等操作,从而实现自动化部署和管理。 安装 要使用Python Fabric库,首先需要安装Fabric模块。可以通…

OpenHarmony实战开发-如何使用text组件的enableDataDetector属性实现文本特殊文字识别。

介绍 本示例介绍使用text组件的enableDataDetector属性实现文本特殊文字识别。 效果图预览 使用说明 1.进入页面,输入带有特殊文字的信息并发送,对话列表中文本会自动识别并标识特殊文字。目前支持识别的类型包括电话号码、链接、邮箱和地址&#xff…

Zynq7000系列中PL时钟使用

可编程逻辑(PL)具有自己的时钟管理生成和分配功能,并从处理器系统(PS)中的时钟发生器接收四个时钟信号(如图25-10所示)。 在嵌入式系统中,PL时钟的管理和分配对于确保逻辑电路的正确…

协程的意义(二)

1.协程的意义 在一个线程中,如果遇到IO等待,线程不会一直在等待,而是利用空余时间去完成别的任务(充分利用线程)。 示例:下载图片 ①普通的方式下载图片(同步方式) ②使用协程的方…

发泡机液压站比例阀放大器

发泡机液压站是提供动力和压力以驱动发泡机工作的系统。 发泡机是一种用于制备聚氨酯发泡材料的设备,而液压站则扮演着为发泡机提供必要动力的角色。具体来看,液压站的主要组成包括: 液压油箱:存储液压油,为系统提供液…

【Applied Algebra】隐藏子群问题和Shor算法的新视角

隐藏子群问题和Shor算法的新视角 隐藏子群问题是指给定一个群和一个函数,该函数对于群的一个子群是常数,并且对于子群的任何两个不同的左陪集有不同的值,问题是找到这个子群.HSP是许多量子算法的基础,其中最著名的是Shor的算法,它可以用来分解大整数和计算离散对数,这直接威胁到…

小目标检测——鸟类数据集

引言 亲爱的读者们,您是否在寻找某个特定的数据集,用于研究或项目实践?欢迎您在评论区留言,或者通过公众号私信告诉我,您想要的数据集的类型主题。小编会竭尽全力为您寻找,并在找到后第一时间与您分享。 …

nvidia-smi CUDA Version:N/A

问题 nvidia-smi显示:CUDA Version:N/A nvidia-smi -a显示:CUDA Version: Not Found 解决方法 查看Nvidia驱动版本 nvidia-smi如下图,版本为530.41.03 搜索cuda库 apt search libcuda注:不同的源,同一个库的命…

轻量级SQLite可视化工具Sqliteviz

什么是 Sqliteviz ? Sqliteviz 是一个单页面离线优先的渐进式网络应用(PWA),用于完全客户端的 SQLite 数据库或 CSV 文件的可视化。 所谓完全客户端,就是您的数据库永远不会离开您的计算机。使用 sqliteviz&#xff0c…

PyQt程序:实现新版本的自动更新检测及下载(FTP服务器实现)

一、实现逻辑 本实例采用相对简单的逻辑实现,用户在客户端使用软件时点击“检测升级”按钮,连接至FTP服务器检索是否有新版本的.exe,如果有,下载最新的.exe安装升级。 本实例服务端待下载.exe所在目录结构 本实例客户端待更新.exe所在目录结构 二、搭建服务器 可以参考…

IMUGNSS的误差状态卡尔曼滤波器(ESKF)的数学模型

IMU&GNSS的误差状态卡尔曼滤波器(ESKF)的数学模型 把IMU视为运动模型,把GNSS观测视为观测模型,推导整个滤波器 设状态变量为 x [ p , v , R , b g , b a , g ] T x[p,v,R,b_{g},b_{a},g]^{T} x[p,v,R,bg​,ba​,g]T 所有变…

泛型的初步认识(2)

前言~🥳🎉🎉🎉 hellohello~,大家好💕💕,这里是E绵绵呀✋✋ ,如果觉得这篇文章还不错的话还请点赞❤️❤️收藏💞 💞 关注💥&#x…