Python测试框架之pytest快速入门
pytest是一种流行的Python测试框架,支持创建简单的单元测试,也支持创建复杂的功能和集成测试。它提供了一系列有用的功能,能够方便地编写,组织和运行测试用例,并生成丰富的测试报告。
pytest的主要特点包括:
- 自动发现测试用例:pytest会自动查找项目中以test_或者以_test结尾的函数或类,并执行它们。
- 参数化测试:pytest允许使用@pytest.mark.parametrize标记来指定多组输入参数和预期输出值,以简化测试用例的编写和管理。
- 丰富的断言方式:pytest支持多种断言方法,如assert语句、pytest.assert函数、pytest-assume插件以及第三方断言库等,可以让开发人员更轻松地编写和维护测试用例。
- 插件化架构:pytest允许通过插件来扩展其功能,它有很多官方和社区提供的插件,可以帮助开发人员处理日志、代码覆盖率、性能测试等各种任务。
- 可与
unittest和nose无缝对接 - 丰富的测试报告:pytest会自动生成丰富的测试报告,包括测试用例的执行情况、失败原因、覆盖状态等信息,并支持多种输出格式,如HTML,JUnit XML等。
使用pytest编写和运行测试用例相对于其他测试框架来说更加简洁和灵活,同时它也是Python社区中广泛使用的测试工具之一。
使用标准库unittest进行单元测试
介绍pytest之前, 先来看一下Python内置的测试库unittest, unittest是Python 标准库的一部分,在安装完Python之后就可以使用, 不需要安装任何其他模块。
Python unittest是Python自带的一个单元测试框架,用于编写和运行测试用例,以确保代码的正确性和可靠性。unittest提供了一系列的工具和断言方法,使得编写测试用例变得更加简单和高效。通过使用unittest,开发人员可以快速运行测试用例并自动化测试过程,从而节省时间和人力成本。
在Python中,unittest常被用作测试框架,它不仅仅用于单元测试,还可以进行集成测试和功能测试。unittest框架提供了丰富的API、测试控制器以及测试加载器,使得测试用例的编写和执行变得更容易。
使用unittest编写测试用例的流程如下:
- 创建一个测试类,继承unittest.TestCase类。
- 在测试类中编写测试方法。测试方法必须以test_开头,用于测试代码的特定功能。
- 在测试方法中使用断言方法(如assertEqual、assertTrue等)判断代码的执行结果是否符合预期。
- 运行测试用例,并查看测试报告,根据测试结果进行代码调整和优化。
直接上代码示例:
import unittestdef add(a, b):return a + bclass TestAdd(unittest.TestCase):def test_add(self):self.assertEqual(add(1, 2), 3)if __name__ == '__main__':unittest.main()
一个测试用例是一个完整的单元测试流程,包括测试前的准备环节、执行测试动作的环节、与期望结果的对比的环节。在unittest中,测试用例是通过继承unittest.TestCase类来实现的,这个示例中定义了一个名为 add 的函数,并且使用了 Python 的 unittest 模块对这个函数进行了测试。
TestAdd类继承自unittest.TestCase类,并包含了一个名为test_add的测试方法。- 在这个方法中,使用
self.assertEqual方法来检查add函数是否正确计算了加法。最后,使用unittest.main()运行测试。
运行成功的界面如下:

如果运行失败是怎么显示的呢? 修改上面的 self.assertEqual(add(1, 2), 3) => self.assertEqual(add(1, 2), 4) 让测试失败, 失败的界面如下:

安装 pytest
如果没有安装pytest,可以使用pip来安装:
pip install pytest
如果不确定有没有安装pytest, 可以使用 pip list 查看安装的模块, 比如:

pytest 安装成功的界面如下:

使用 pytest 编写单元测试
pytest工具会自动找到文件名和函数名都以test开头的测试用例。
这里定义一个加法函数并对这个函数进行测试, 首先创建一个名为test_sample.py的文件,内容如下:
def add(a, b):return a + bdef test_add():assert add(1, 2) == 3
运行pytest 测试
命令行切换到包含test_sample.py的目录,运行pytest命令,pytest会运行所有发现的测试,并产生一个测试报告,运行的效果如下图:

测试失败情况下,pytest 怎么显示呢?pytest会详细地显示哪个测试失败,以及失败的详细原因。这里故意定义一个执行错误的函数test_add2(), 代码如下:
def add(a, b):return a + bdef test_add():assert add(1, 2) == 3def test_add2(): assert add(1, 2) == 4
执行后的效果如下图:

除了在命令行控制台运行和查看pytest的结果外, 也可以在VS Code 的Testing的活动栏,运行和查看结果。效果如下图:

需要注意的是: 点击Testing的活动栏之后, 需要选择测试的框架为 pytest。
使用pytest 运行功能测试
pytest是一个非常灵活强大的 Python 测试框架,它既能进行单元测试,也能进行功能测试, 通常与 Flask(轻量级的 Python web 框架)一起使用。
Flask 模块需要先安装, 安装方式是 pip install flask, 安装完成之后就可以编写Flask代码了,
这里定义一个 Flask Web 应用,并且需要测试当访问/hello时是否能返回 “Hello, World!”, 代码如下:
from flask import Flaskdef create_app():app = Flask(__name__)@app.route('/hello')def hello():return 'Hello, World!'return appif __name__ == '__main__':app = create_app()app.run()
运行之后通过浏览器访问的效果如下图:

接下来, 使用pytest来进行功能测试,使用Flask的测试客户端来模拟访问, 定义测试的文件test_app.py , 内容如下:
import pytest
from app import create_app@pytest.fixture
def client():app = create_app()app.config['TESTING'] = Truewith app.test_client() as client:yield clientdef test_hello(client):response = client.get('/hello')assert response.data == b'Hello, World!'
- 使用 @pytest.fixture 装饰器定义了一个名为 client 的测试夹具。该夹具在测试过程中可以作为参数传递给测试函数。在这个夹具函数中,创建了一个测试用的 Flask 应用,并将其配置为测试模式。
- 定义了一个名为 test_hello 的测试函数,并将上述夹具 client 作为参数传递进去。在测试函数中,使用 client.get(‘/hello’) 发起了一个 GET 请求,并检查返回值是否等于 b’Hello, World!'。如果返回值和预期值不一致,那么测试将会失败。
- 在 Python 中,当字符串前面带有前缀
b时,表示这是一个 bytes 类型的字符串,而不是普通的 str 类型。bytes 类型的字符串在 Python 中是一种原生的二进制序列类型,它的每个字符都是一个字节,可以存储任意的二进制数据。
在 Flask 应用中,当使用response.data获取 HTTP 响应的内容时,返回的是 bytes 类型的内容,因为 HTTP 响应的内容是以二进制字节流的形式传输的。因此,在进行 HTTP 响应内容的比较时,需要使用 bytes 类型的字符串,而不是普通的 str 类型字符串。
运行测试的效果如下图:

参考
- pytest官方站点: https://docs.pytest.org/en/7.4.x/
相关文章:
Python测试框架之pytest快速入门
pytest是一种流行的Python测试框架,支持创建简单的单元测试,也支持创建复杂的功能和集成测试。它提供了一系列有用的功能,能够方便地编写,组织和运行测试用例,并生成丰富的测试报告。 pytest的主要特点包括࿱…...
CSS 动画特效运用目录
主要是记录动画相关的特效实践案例和实现思路。 章节名称完成度难度文章地址完整代码下载地址拟态时钟动画完成一般文章地址完整代码下载...
css文本溢出省略号点点点
多行两端对齐省略号 .box {overflow: hidden;text-overflow: ellipsis;display: -webkit-box;-webkit-box-orient: vertical;-webkit-line-clamp: 3; // 限制显示的行数,单行就改成1 }...
MSSQL 配置ORACLE 链接服务器
在有些场景,我们需要整合其他异构数据库的数据。我们可以使用代码去读取,经过处理后,再将数据保存到MSSQL数据库中。如果数据量比较大,但处理的逻辑并不复杂的情况下,这种方式就不是最好的办法。这时可以使用使用链接服…...
HiSilicon352 android9.0 适配红外遥控器
海思Android解决方案在原生Android基础上,基于传统电视用户使用习惯,增加了对红外遥控器和按键板的支持,使传统电视用户能更好适应智能电视方案。 一.功能描述: 在系统启动时,会先启动android_ir_user;vinp…...
0004Java安卓程序设计-springboot基于APP的鲜花商城
文章目录 **摘 要****目录**系统设计开发环境 编程技术交流、源码分享、模板分享、网课教程 🐧裙:776871563 摘 要 本毕业设计的内容是设计并且实现一个基于APP的鲜花商城。它是在Windows下,以MYSQL为数据库开发平台,java技术和…...
对Axios进行封装
封装的同时,你需要和 后端协商好一些约定,请求头,状态码,请求超时时间....... 设置接口请求前缀:根据开发、测试、生产环境的不同,前缀需要加以区分 请求头 : 来实现一些具体的业务,必须携带一…...
Python TCP服务端多线程接收RFID网络读卡器上传数据
本示例使用设备介绍:WIFI/TCP/UDP/HTTP协议RFID液显网络读卡器可二次开发语音播报POE-淘宝网 (taobao.com) #python通过缩进来表示代码块,不可以随意更改每行前面的空白,否则程序会运行错误!!!如果缩进不…...
Ubuntu22.04安装MySql
在Ubuntu上安装mysql就比较简单了 1、常规操作,更新软件包列表 apt update 至少安装之前看一眼版本吧 apt list mysql-server 嗯,是8.0.35版本的 2、安装mysql apt install mysql-server 3、给root用户设置密码 # 第一次安装完无需密码,让你输入…...
设计模式-桥接模式(Bridge)
设计模式-桥接模式(Bridge) 一、桥接模式概述1.1 什么是桥接模式1.2 简单实现桥接模式 二、使用桥接模式注意事项三、实现桥接模式的方式3.1 使用继承和组合的方式实现桥接模式3.2 使用接口和内部类的方式实现桥接模式 一、桥接模式概述 1.1 什么是桥接…...
库存预占架构升级方案设计-交易库存中心
背景介绍  伴随物流行业的迅猛发展,一体化供应链模式的落地,对系统吞吐、系统稳定发出巨大挑战,库存作为供应链的重中之重表现更为明显。近三年数据可以看出:  接入商家同比增长37.64%、货…...
【redis】ssm项目整合redis,redis注解式缓存及应用场景,redis的击穿、穿透、雪崩的解决方案
目录 一、整合redis 1、介绍 1.1、redis(Remote Dictionary Server) 1.2、MySQL 1.3、区别 2、整合 2.1、配置 2.2、文件配置 2.3、key的生成规则方法 2.4、注意 二、redis注解式缓存 1、Cacheable注解 2、CachePut注解 3、CacheEvict注解…...
chatGPT对英语论文怎么润色呢?
chatGPT对英语论文怎么润色呢? 回答1: 润色英语论文是一项重要的任务,它有助于提高论文的质量、语法准确性和清晰度。以下是一些关于如何润色英语论文的建议: 语法和拼写检查: 使用拼写和语法检查工具,如…...
【机器学习4】降维
常见的降维方法有主成分分析、 线性判别分析、 等距映射、 局部线性嵌入、 拉普拉斯特征映射、 局部保留投影等。 1 PCA最大方差角度理解 PCA无监督学习算法。 PCA的目标, 即最大化投影方差, 也就是让数据在主轴上投影的方差最大。 在黄线所处的轴上&…...
注册商标有助于企业拓展市场渠道
拓展市场渠道 注册商标有助于企业拓展市场渠道。在商业合作和交易中,消费者往往更加倾向于选择有知名度和信誉的品牌。通过注册商标,企业可以树立自己的品牌形象,提高品牌知名度和美誉度,从而更好地开拓市场和拓展业务。同时&…...
推荐能用ios端磁力下载工具
关于ios端磁力下载工具,之前的文章给大家介绍过2个,分别是雷电下载和闪电下载。但是如今因为不可抗力和苹果商店对于磁力下载和云盘功能的限制,目前这两款工具已经不能够使用了。也就是说免费的下载工具已经没有了,毕竟实现ios端这…...
网页文档阅读的学习笔记
1. 阅读邮件 我是一名人工智能专业的博士生,请你帮我总结此页面的要点...
mysql图书管理系统(49-56)源代码
-- 九、 子查询 -- 无关子查询 -- 比较子查询:能确切知道子查询返回的是单值时,可以用>,<,,>,<,!或<>等比较运算符。 -- 49、 查询与“俞心怡”在同一个部门的读者的借…...
使用Docker部署开源分布式任务调度系统DolphinScheduler
🔥博客主页: 小羊失眠啦. 🎥系列专栏:《C语言》 《数据结构》 《Linux》《Cpolar》 ❤️感谢大家点赞👍收藏⭐评论✍️ 使用Docker部署开源分布式任务调度系统DolphinScheduler 文章目录 使用Docker部署开源分布式任务…...
光猫桥接与直接拨号的对比
近期搬家,经历了一次拉宽带,换光猫,购置路由器的过程,有一些总结记录下来,备忘 装宽带之前已经知道桥接的好处就是可以路由器拨号,避免拉胯的光猫拖慢网速,但具体有什么坏处也不清楚࿰…...
超级编导源码流出,技术大拿深度对比超级编导与超级智剪云混剪架构
引言:当“源码”遇见“架构选型”近日,技术社区中关于“超级编导源码流出”的讨论引发了不少开发者的关注。无论这一传闻的真实性如何,它都将一个核心问题推到了技术决策者面前:在构建或集成短视频矩阵视频混剪工具时,…...
《信息系统项目管理师教程(第4版)》——高级项目管理
高级项目管理 在《信息系统项目管理师教程(第4版)》中,“高级项目管理”(第20章)是高项教程中拔高视野的章节。如果说前十章讲的是“如何当一个好木匠”(项目级管理),那么这章讲的就…...
HoRain云--Perl条件语句全解析
🎬 HoRain云小助手:个人主页 🔥 个人专栏: 《Linux 系列教程》《c语言教程》 ⛺️生活的理想,就是为了理想的生活! ⛳️ 推荐 前些天发现了一个超棒的服务器购买网站,性价比超高,大内存超划算!…...
2026年网安还值得学吗?新手程序员必看,建议收藏!
2026年网安还值得学吗?新手&程序员必看,建议收藏! 本文针对2026年网络安全学习价值答疑,指出当前互联网大厂缩编、应届生内卷,但网安岗人才缺口超200万,薪资涨幅可观,有实战经验者年薪轻松…...
AI Agent如何通过MCP协议连接杠杆预测市场:Dimes Multiply工具详解
1. 项目概述:当AI遇上杠杆预测市场最近在捣鼓AI Agent的生态工具,发现了一个挺有意思的东西:dimes-fi/multiply-mcp。简单来说,这是一个MCP服务器,能让Claude这类AI助手直接接入Dimes Multiply协议,去查询、…...
别再手动改串口号了!用udev规则给CP2102/CH340芯片绑定固定别名,实现ROS与STM32开机自启动通信
彻底解决ROS与STM32通信痛点:基于udev规则的串口设备永久绑定方案 每次开机都要重新确认USB端口号?ROS与STM32的通信链路因为/dev/ttyUSB*的随机分配而频繁中断?这不仅是效率杀手,更是自动化系统的致命伤。本文将彻底解决这个困扰…...
如何用CompressO将视频压缩90%以上:完整免费开源压缩终极指南
如何用CompressO将视频压缩90%以上:完整免费开源压缩终极指南 【免费下载链接】compressO Convert any video/image into a tiny size. 100% free & open-source. Available for Mac, Windows & Linux. 项目地址: https://gitcode.com/gh_mirrors/co/comp…...
ToDesk 4.2.6配置文件config.ini全解析:从临时密码到开机自启,一篇搞定所有隐藏设置
ToDesk 4.2.6配置文件深度解析:解锁专业用户的隐藏控制力 远程控制软件ToDesk已经成为许多技术用户日常工作的得力助手,但大多数人仅仅停留在基础功能的使用层面。实际上,通过深入理解其配置文件config.ini,你可以获得远超图形界面…...
7个实用jq管道操作技巧:轻松掌握复杂JSON数据处理的终极指南
7个实用jq管道操作技巧:轻松掌握复杂JSON数据处理的终极指南 【免费下载链接】jq Command-line JSON processor 项目地址: https://gitcode.com/GitHub_Trending/jq/jq jq作为一款强大的命令行JSON处理器,让开发者能够通过简洁的管道操作实现复杂…...
