精进单元测试技能 —— 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

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

现在我也找了很多测试的朋友,做了一个分享技术的交流群,共享了很多我们收集的技术文档和视频教程。
如果你不想再体验自学时找不到资源,没人解答问题,坚持几天便放弃的感受
可以加入我们一起交流。而且还有很多在自动化,性能,安全,测试开发等等方面有一定建树的技术大牛
分享他们的经验,还会分享很多直播讲座和技术沙龙
可以免费学习!划重点!开源的!!!
qq群号:691998057【暗号:csdn999】

异常断言

在编写测试用例时,经常需要验证某个函数是否能够正确地抛出异常。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.rhkb.cn/news/232733.html

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

相关文章

FlinkSQL中【FULL OUTER JOIN】使用实例分析(坑)

Flink版本&#xff1a;flink1.14 最近有【FULL OUTER JOIN】场景的实时数据开发需求&#xff0c;想要的结果是&#xff0c;左右表来了数据都下发数据&#xff1b;左表存在的数据&#xff0c;右表进来可以关联下发&#xff08;同样&#xff0c;右表存在的数据&#xff0c;左表进…

FlinkAPI开发之数据合流

案例用到的测试数据请参考文章&#xff1a; Flink自定义Source模拟数据流 原文链接&#xff1a;https://blog.csdn.net/m0_52606060/article/details/135436048 概述 在实际应用中&#xff0c;我们经常会遇到来源不同的多条流&#xff0c;需要将它们的数据进行联合处理。所以…

Apache Paimon:Streaming Lakehouse is Coming

摘要&#xff1a;本文整理自阿里云智能开源表存储负责人&#xff0c;Founder of Paimon&#xff0c;Flink PMC 成员李劲松&#xff08;花名&#xff1a;之信&#xff09;、同程旅行大数据专家&#xff0c;Apache Hudi & Paimon Contributor 吴祥平、汽车之家大数据计算平台…

Mybatis实现增删改查的两种方式-配置文件/注解

环境准备 1.数据库表tb_brand -- 删除tb_brand表 drop table if exists tb_brand; -- 创建tb_brand表 create table tb_brand(-- id 主键id int primary key auto_increment,-- 品牌名称brand_name varchar(20),-- 企业名称company_name varchar(20),-- 排序字段ordered int…

[Flutter]WebPlatform上运行遇到的问题总结

[Flutter]WebPlatform上运行遇到的问题总结 目录 [Flutter]WebPlatform上运行遇到的问题总结 写在开头 正文 Q1、不兼容判断 Q2、跨域问题 其他 写在结尾 写在开头 Flutter项目已能在移动端完美使用后&#xff0c;想看看在桌面端等使用情况 基于Flutter3.0后已支持Wi…

前端框架中的状态管理(State Management)

聚沙成塔每天进步一点点 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 欢迎来到前端入门之旅&#xff01;感兴趣的可以订阅本专栏哦&#xff01;这个专栏是为那些对Web开发感兴趣、刚刚踏入前端领域的朋友们量身打造的。无论你是完全的新手还是有一些基础的开发…

李沐-《动手学深度学习》-- 01-预备知识

一、线性代数知识 1. 矩阵计算 a. 矩阵求导 ​ 当y和x分别为标量和向量时候&#xff0c;进行求导得到的矩阵形状&#xff0c;矩阵求导就是矩阵A中的每一个元素对矩阵B中的每一个元素求导 ​ 梯度指向的是值变化最大的方向 ​ 分子布局和分母布局&#xff1a; b. 常识 ax…

知识付费平台搭建?找明理信息科技,专业且高效

明理信息科技知识付费saas租户平台 在当今数字化时代&#xff0c;知识付费已经成为一种趋势&#xff0c;越来越多的人愿意为有价值的知识付费。然而&#xff0c;公共知识付费平台虽然内容丰富&#xff0c;但难以满足个人或企业个性化的需求和品牌打造。同时&#xff0c;开发和…

群晖NAS+DMS7.0以上版本+无docker机型安装zerotier

测试机型&#xff1a;群晖synology 218play / DSM版本为7.2.1 因218play无法安装docker&#xff0c;且NAS系统已升级为7.0以上版本&#xff0c;按zerotier官网说法无法安装zerotier, 不过还是可以通过ssh终端和命令方式安装zerotier。 1、在DSM新建文件夹 用于存放zerotier脚…

2023我的编程之旅-地质人的山和水

引言 大家好&#xff0c;我是搞地质的。外行人有的说我们游山玩水&#xff0c;有的说我们灰头土脸&#xff0c;也有的说我们不是科学。 而我说&#xff0c;这是一门穷极一生青春&#xff0c;值得奉献的行业。这是一门贴近民生&#xff0c;又拥抱自然的学科。他的真理性在于探…

进阶学习——Linux系统安全及应用

目录 一、系统安全加固 1.账号安全基本措施 1.1系统账号清理 1.1.1延伸 1.2密码安全控制 1.3命令历史限制 1.4终端自动注销 二、使用su命令切换用户 1.用途及用法 2.密码验证 3.限制使用su命令的用户 4.查看su操作记录 5.sudo&#xff08;superuse do&#xff09;…

stable diffusion 人物高级提示词(一)头部篇

一、女生发型 prompt描述推荐用法Long hair长发一定不要和 high ponytail 一同使用Short hair短发-Curly hair卷发-Straight hair直发-Ponytail马尾high ponytail 高马尾&#xff0c;一定不要和 long hair一起使用&#xff0c;会冲突Pigtails2条辫子-Braid辫子只写braid也会生…

数据库开发必备神器:DataGrip 工具安装指南

DataGrip是一款强大的跨平台数据库集成开发环境&#xff0c;全能数据库工具&#xff0c;支持多种数据库系统&#xff0c;包括MySQL&#xff0c;PostgreSQL&#xff0c;Oracle等&#xff1b;提供智能代码编辑功能&#xff0c;包括语法高亮、代码补全等&#xff0c;提升开发效率。…

Qt/QML编程学习之心得:Linux下Thread线程创建(26)

GUI设计中经常为了不将界面卡死,会用到线程Thread,而作为GUI设计工具,Qt也提供了一个这样的类,即QThread。 QThread对象管理程序中的一个控制线程。线程QThread开始在run()中执行。默认情况下,run()通过调用exec()启动事件循环,并在线程内运行Qt事件循环。 也可以通过…

YTM32的低功耗PowerDown模式及唤醒管理器WKU模块

文章目录 Introduction专门的唤醒源管理器WKU外部的唤醒引脚内部的触发信号 进入PowerDown模式的操作流进入低功耗模式配合使用的其他模块 性能指标低功耗电流唤醒时间 Conclusion Introduction YTM32的低功耗系统中有设计了多种工作模式&#xff0c;功耗从高到低&#xff0c;…

Spring之 国际化:i18n

1、i18n概述 国际化也称作i18n&#xff0c;其来源是英文单词 internationalization的首末字符i和n&#xff0c;18为中间的字符数。由于软件发行可能面向多个国家&#xff0c;对于不同国家的用户&#xff0c;软件显示不同语言的过程就是国际化。通常来讲&#xff0c;软件中的国…

2.6 KERNEL LAUNCH

图2.15在vecAdd函数中显示最终主机代码。此源代码完成了图2.6.中的骨架。2.12和2.15共同说明了一个简单的CUDA程序&#xff0c;该程序由主机代码和设备内核组成。该代码是硬接的&#xff0c;每个线程块使用256个线程。然而&#xff0c;使用的线程块的数量取决于向量&#xff08…

java基于SSM的游戏商城的设计与实现论文

基于SSM的游戏商城的设计与实现 摘 要 当下&#xff0c;正处于信息化的时代&#xff0c;许多行业顺应时代的变化&#xff0c;结合使用计算机技术向数字化、信息化建设迈进。以前相关行业对于游戏信息的管理和控制&#xff0c;采用人工登记的方式保存相关数据&#xff0c;这种以…

【C++】- 类和对象(!!C++类基本概念!this指针详解)

类和对象 引入类类的定义类的访问限定操作符类的作用域类的实例化类对象模型this指针 引入类 在 C中&#xff0c;引入了一个新的定义----------类。类是一种用户自定义的数据类型&#xff0c;用于封装数据和行为。类可以看作是一个模板或蓝图&#xff0c;描述了一组相关的数据和…

Android 集成vendor下的模块

Android 集成vendor下的模块 &#xff0c;只需要在 PRODUCT_PACKAGES 加上对应的模块名&#xff0c;编译的时候就会执行对应模块的bp文件&#xff0c;集成到系统中 PRODUCT_PACKAGES \WallpaperPicker \Launcher3 \com.nxp.nfc Android11 Framework Vendor下自定义系统…