精进单元测试技能——Pytest断言的艺术

本篇文章主要是阐述Pytest在断言方面的应用。让大家能够了解和掌握Pytest针对断言设计了多种功能以适应在不同测试场景上使用。

图片

了解断言的基础

在Pytest中,断言是通过 assert 语句来实现的。简单的断言通常用于验证预期值和实际值是否相等,例如:

def test_addition():    result = add(2, 3)    assert result == 5

然而除此之外,Pytest提供了更多丰富的断言方式,包括逻辑表达式、集合比较、异常捕获等,这些功能使得我们能够更全面地覆盖测试场景。

图片

利用逻辑表达式

Pytest的断言支持丰富的逻辑表达式,使得我们可以更灵活地组合多个条件。例如,我们可以使用 and ornot 等关键词来连接多个断言,从而实现更复杂的测试逻辑:

def test_complex_logic():    result = some_complex_function()    assert result > 0 and result % 2 == 0

通过充分利用逻辑表达式,我们能够在一个测试用例中覆盖多个相关的断言,从而提高测试的全面性和可读性。

图片

集合比较

在实际的测试中,有时我们需要比较集合之间的差异,Pytest提供了 assert set1 == set2 的方式来完成这样的比较。这对于验证返回的无序集合是否符合预期非常有用:

def test_set_comparison():    result = get_some_data()    expected_set = {1, 2, 3, 4, 5}    assert set(result) == expected_set

通过集合比较,我们能够简洁而清晰地验证无序集合的相等性,确保测试的准确性。

图片

异常断言

在编写测试用例时,经常需要验证某个函数是否能够正确地抛出异常。Pytest提供了 pytest.raises 装饰器来实现异常断言:

import pytestdef test_exception():    with pytest.raises(ValueError, match='Invalid value'):        raise ValueError('Invalid value')

通过使用 pytest.raises,我们可以明确地指定期望的异常类型,并且可以通过 match 参数验证异常消息是否符合预期。这样的断言方式使得我们能够更精确地检查代码中的异常处理逻辑。

图片

定制断言函数

为了提高测试用例的可维护性,我们可以考虑编写定制的断言函数,使得测试用例更加简洁而易读。例如,我们可以编写一个用于验证两个浮点数是否在一定误差范围内相等的断言函数:​​​​​​​

def assert_float_equal(value1, value2, epsilon=1e-6):    assert abs(value1 - value2) < epsilondef test_float_comparison():    result = calculate_float()    expected_result = 3.14159    assert_float_equal(result, expected_result)

通过编写定制的断言函数,我们不仅能够提高测试用例的可读性,还能够在后续的维护过程中更轻松地调整断言逻辑。

图片

使用参数化测试

Pytest提供了参数化测试的功能,使得我们能够在同一个测试用例中使用不同的参数运行多次测试,进而提高测试的覆盖范围。结合参数化测试和断言,我们能够更全面地验证代码的不同输入组合。​​​​​​​

import pytest@pytest.mark.parametrize("input_data, expected_result", [    ((2, 3), 5),    ((-1, 1), 0),    ((0, 0), 0),])def test_addition(input_data, expected_result):    result = add(*input_data)    assert result == expected_result

通过参数化测试,我们可以轻松地扩展测试用例,验证不同输入情况下的函数行为,而断言则保证了每个参数组合的准确性。

图片

结合文档和注释

在编写测试用例时,良好的文档和注释是确保测试易于理解和维护的关键。通过在测试用例中添加清晰的注释,解释每个断言的目的和期望结果,可以帮助其他开发者更容易地理解测试的目的。​​​​​​​

def test_complex_behavior():    # Ensure that the function behaves correctly in normal cases    result = some_complex_function()    assert result > 0# Ensure that a specific edge case is handled properly    edge_result = some_complex_function(0)    assert edge_result == 42

结合文档和注释,我们能够更清晰地传达测试的目的和预期,使得测试用例更易于维护和理解。

合理利用Pytest提供的断言方式是提高测试质量和效率的关键。通过深入了解不同的断言方式,并在实践中灵活应用,我们能够编写出更具表达力和可维护性的测试用例,从而提高代码的质量和稳定性。在日常的开发工作中,不断学习和掌握断言的艺术,将为我们打造高效而可靠的测试奠定坚实基础。

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

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

相关文章

Python从入门到网络爬虫(读写Excel详解)

前言 Python操作Excel的模块有很多&#xff0c;并且各有优劣&#xff0c;不同模块支持的操作和文件类型也有不同。最常用的Excel处理库有xlrd、xlwt、xlutils、xlwings、openpyxl、pandas&#xff0c;下面是各个模块的支持情况&#xff1a; 工具名称.xls.xlsx获取文件内容写入…

使用vscode开发小程序项目

使用vscode开发uni-app 这里的创建使用用vue3ts版本&#xff0c;如过是vue2&#xff0c;具体可参考官网命令 uni-app官网 首先创建uni-app npx degit dcloudio/uni-preset-vue#vite-ts my-vue3-project需要再vscode中下载uni-app插件&#xff0c;以方便开发 uni-create-view …

java常用应用程序编程接口(API)——String概述及使用案例

前言&#xff1a; 开始学到api的String&#xff0c;整理下心得。打好基础&#xff0c;daydayup! API&#xff1a; API是什么&#xff1f; API&#xff08;Application Programming Interface&#xff09;又名应用程序编程接口。是别人编好的程序的合集。 为什么要使用API&…

5分钟搭建开源运维监控工具Uptime Kuma并实现无公网IP远程访问

文章目录 **主要功能**一、前期准备本教程环境为&#xff1a;Centos7&#xff0c;可以跑Docker的系统都可以使用本教程安装。本教程使用Docker部署服务&#xff0c;如何安装Docker详见&#xff1a; 二、Docker部署Uptime Kuma三、实现公网查看网站监控四、使用固定公网地址访问…

数组中元素的插入和查找算法探究

数组的查找 线性查找 概念 线性查找也叫顺序查找&#xff0c;这是最基本的一种查找方法&#xff0c;从给定的值中进行搜索&#xff0c;从一端开始逐一检查每个元素&#xff0c;直到找到所需元素的过程。 元素序列的排列可以有序&#xff0c;也可以无序。 代码实现 public cl…

检查unity打包IOS包含dlopen的块

unity打包IOS包含dlopen 工程中含有以下命名空间:同时link.xml含有一下内容 工程中含有以下命名空间: System.Net.Security: sslStream.AuthenticateAsServer sslStream.AuthenticateAsClientSystem.Xml: XmlDocumentSystem.Net.WebSockets ClientWebSocket.ConnectAsyncSyste…

JVM,Java堆区、新生代、老年代,创建对象的内存分配,分代垃圾收集思想、堆区产生的错误

JVM堆区 堆&#xff08;Heap&#xff09;堆区的组成&#xff1a;新生代老年代堆空间的大小设置创建对象的内存分配堆区的分代垃圾收集思想堆区产生的错误 堆&#xff08;Heap&#xff09; ​ Heap堆区&#xff0c;用于存放对象实例和数组的内存区域 ​ Heap堆区&#xff0c;是…

手把手带你死磕ORBSLAM3源代码(三十六)Tracking.cc CreateMapInAtlas

目录 一.前言 二.代码 2.1完整代码 2.2 IMU::Preintegrated介绍 2.3 IMU:Bias介绍 一.前言 这段代码是在某个视觉追踪或SLAM(同时定位与地图构建)系统中创建一个新的地图或地图集的一部分。具体来说,它属于Tracking

Vue2:通过props给组件传数据

一、业务场景 我们在使用Vue组件时&#xff0c;常常会复用Vue组件&#xff0c;那么&#xff0c;问题来了&#xff0c;复用的时候&#xff0c;业务数据不相同&#xff0c;怎么办了&#xff1f; 这里我们就需要学习新的属性&#xff1a;props来实现这个功能。 这样&#xff0c;组…

Java刷题错题笔记-day05-集合(CopyOnWriterArrayList、HashMap)

1.CopyOnWriterArrayList是强一致性列表吗&#xff1f; 不是 CopyOnWriteArrayList 不提供强一致性主要是因为它的修改操作是在一个新的拷贝上进行的&#xff0c;而不是直接在原始数据结构上。这种设计决策带来了一些影响&#xff1a; 读取操作不阻塞&#xff1a; CopyOnWrite…

zabbix的API调用

zabbix的API调用 资料参考&#xff1a;https://www.zabbix.com/documentation/4.0/zh/manual/api 看api文档就可以了&#xff0c;粘两个例子吧&#xff0c;如果配置了域名&#xff0c;可以请求域名 [rootnode ~]# vi zabbix_login.api curl -XPOST -H "Content-Type: ap…

探寻未来卫生新境界:互联网公厕是什么意思

近年来&#xff0c;科技的飞速发展深刻改变了我们生活的方方面面&#xff0c;而公共卫生领域也在这场变革中迎来了一场前所未有的革命。在这个新时代&#xff0c;一个备受瞩目的概念逐渐崭露头角——那就是“互联网公厕”。这究竟意味着什么&#xff1f;是一场卫生革新的崛起&a…

动手学深度学习4 线性代数

动手学深度学习4 线性代数 1. 线性代数--数学意义2. 线性代数的实现3. 按特定轴求和4. 线性代数QA 1. 线性代数–数学意义 视频&#xff1a;https://www.bilibili.com/video/BV1eK4y1U7Qy/?spm_id_fromautoNext&vd_sourceeb04c9a33e87ceba9c9a2e5f09752ef8 课件&#xff…

Protobuf 反射技术简介

对于反射大家应该不会陌生&#xff0c;如果你接触过一些框架&#xff08;如 ORM、IOC、OSGi 等&#xff09; 的内部实现&#xff0c;应该更能体会反射技术的应用可谓无处不在。 反射概念最早出现于人工智能领域&#xff0c;20 世纪 70 年代末被引入到程序语言设计中。1982 年 …

swaggerUI不好用,试试这个openapiUI?

title: swaggerUI不好用&#xff0c;试试这个openapiUI? date: 2024-01-08 categories: [tool] tags: [openapi,工具] description: 基于swaggger2, openapi3规范的UI文档 1.背景 由于长期使用 swaggerUI 工具&#xff0c;它的轻量风格个人觉得还是不错的&#xff0c;但是它…

【漏洞复现】Hikvision SPON IP网络对讲广播系统存在命令执行漏洞CVE-2023-6895

漏洞描述 Hikvision Intercom Broadcasting System是中国海康威视(Hikvision)公司的一个对讲广播系统。 Hikvision Intercom Broadcasting System是中国海康威视(Hikvision)公司的一个对讲广播系统。Hikvision Intercom Broadcasting System 3.0.3_20201113_RELEASE(HIK)版…

vulhub中的Apache SSI 远程命令执行漏洞

Apache SSI 远程命令执行漏洞 1.cd到ssi-rce cd /opt/vulhub/httpd/ssi-rce/ 2.执行docker-compose up -d docker-compose up -d 3.查看靶场是否开启成功 dooker ps 拉取成功了 4.访问url 这里已经执行成功了&#xff0c;注意这里需要加入/upload.php 5.写入一句话木马 &…

微信预约小程序制作指南:从小白到专家

在当今的数字时代&#xff0c;微信小程序已经成为了一种非常流行的应用方式。预约功能更是成为了许多小程序的核心功能之一。如果你也想为你的小程序添加预约功能&#xff0c;以下步骤将会对你有所帮助。 一、进入乔拓云网后台 乔拓云网是一个在线小程序开发平台&#xff0c;你…

golang指针介绍

前言 简单记录下&#xff0c;GO语言中的指针类型和值类型的使用&#xff0c;以及二两之前的区别 目录 前言指针类型介绍值类型和指针类型的使用区别值类型&#xff08;Value Types&#xff09;&#xff1a;指针类型&#xff08;Pointer Types&#xff09;&#xff1a;示例&…

如何使用Docker部署开源CMF Drupal并结合cpolar内网穿透远程访问

文章目录 前言1. Docker安装Drupal2. 本地局域网访问3 . Linux 安装cpolar4. 配置Drupal公网访问地址5. 公网远程访问Drupal6. 固定Drupal 公网地址 前言 Dupal是一个强大的CMS&#xff0c;适用于各种不同的网站项目&#xff0c;从小型个人博客到大型企业级门户网站。它的学习…