python单测框架之pytest常见用法
单测框架的作用
- 测试发现:从多个文件中寻找测试用例。
- 测试执行:按照一定顺序去执行并且生成结果。
- 测试断言:判断最终结果与实际结果的差异。
- 测试报告:统计测试进度、耗时、通过率,生成测试报告。
pytest简介
pytest是python的单测框架,使用灵活,插件丰富,以下是pytest常用的插件
- pytest
- pytest-html:生成html测试报告插件
- pytest-xdist:多线程执行用例插件
- pytest-ordering:自定义用例顺序插件
- pytest-rerunfailures:失败重跑插件
- allure-pytest:生成allure美观测试报告插件
pip install 就行,只有有这些插件,下面的某些命令行才生效
pytest默认规则
- 模块名必须以test_开头或者_test结尾
- 类名必须以Test开头
- 测试方法必须以test开头
- pytest用例运行顺序默认从上到下(代码中可以使用装饰器@pytest.mark.run(order=1)来指定执行顺序)
使用pytest.ini文件可以修改默认规则
pytest的运行方式
主函数模式
| 1 2 3 4 |
|
这样就可以运行所有用例
命令行模式
| 1 |
|
参数详解
- -s:输出调试的信息
- -v:表示详细的方式输出
- ./test_demo/test_demo1.py表示运行指定模块,相对路径表示
- ./test_demo/test_demo1.py::TestCase1::test_case1 nodeid表示,代表运行./test_demo/test_demo1.py模块下的TestCase1类的test_case1 方法
- -n分布式运行测试用例,-n num,参数num代表几个线程运行用例
- –reruns=2表示用例失败重跑2次,常用于一些不稳定的用例,如web自动化
- -x只要有一个用例报错,那么就会停止
- –maxfail=2,有2个用例失败就会停止
- -k根据测试用例部分字符串指定测试用例,如 -k “ao”,代表会执行带有ao名称的字符串
读取pytest.ini配置文件运行
不论是主函数模式还是命令行模式都会读取这个配置文件,该文件需要使用gbk编码,下面是这个配置文件的例子
| 1 2 3 4 5 6 7 8 9 10 11 |
|
分组执行
定义三个组,冒烟:smoke,用户管理:user_manager,作业管理:worker_manager
目前有几个用例给加个分组的装饰器
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
|
配置文件中加入分组信息
| 1 2 3 4 |
|
运行
运行多组
| 1 2 3 4 |
|
运行单组
| 1 2 3 4 |
|
忽略执行
无条件忽略
直接使用装饰器@pytest.mark.skip(reason=“原因填写”)
有条件忽略
使用装饰器@pytest.mark.skipif(条件, 原因)
例子:
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
|
pytest中的前后置处理
为什么需要前后置?比如执行用例前需要做一些准备工作,比如打开浏览器,在执行用例后需要一些后置工作,比如关闭浏览器
模块级别
在每个模块执行前会调用setup_module方法,在每个模块执行后会使用teardown_module方法。
例子:
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
|
结果:
| 1 2 3 4 5 6 7 8 9 |
|
类级别
类级别函数 setup_class/teardown_class 对类有效,位于类中,在测试类中前后调用一次。
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
|
| 1 2 3 4 5 6 7 8 9 |
|
方法级别
方法级别函数 setup_method/teardown_method和setup/teardown对类有效,也位于类中,这两个效果一样,在测试类中每个测试方法前后调用一次。
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
|
| 1 2 3 4 5 6 7 8 9 10 11 |
|
部分用例的前后置 pytest.fixture装饰器
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
|
结果
test_demo/test_demo4.py::TestDemo::test_case1[1] 前置
1
1
PASSED后置test_demo/test_demo4.py::TestDemo::test_case1[2] 前置
2
1
PASSED后置test_demo/test_demo4.py::TestDemo::test_case1[3] 前置
3
1
PASSED后置
- scope:表示作用域
- params:表示参数化,与yield使用会调用len(params)次用例,如例子所示,一般用于数据驱动
- autouse:默认使用,一般设置为false
- ids:params参数化时,给每个参数起名字
- name:给该方法取别名
pytest.fixture+conftest
fixture为session级别是可以跨.py模块调用的,也就是当我们有多个.py文件的用例的时候,如果多个用例只需调用一次fixture,那就可以设置为scope=“session”,并且写到conftest.py文件里。
conftest.py文件名称时固定的,pytest会自动识别该文件。放到项目的根目录下就可以全局调用了,如果放到某个package下,那就在改package内有效。
例子:
在包下创建conftest.py,注意,该配置只在本包生效

和之前一样使用

结果还是和之前一样。
pytest生成测试报告
pytest-html插件生成报告
| 1 |
|
参数化与数据驱动
主要用的装饰器是@pytest.mark.parametrize(argnames, argvalues)
不带名字数据驱动
| 1 2 3 4 5 6 |
|
结果:
test_demo/test_demo4.py::TestDemo::test_case1[args0] (4399, ‘AAAA')
PASSED
test_demo/test_demo4.py::TestDemo::test_case1[args1] (2012, ‘BBBB')
PASSED 带名字的数据驱动
| 1 2 3 4 5 6 |
|
结果:
test_demo/test_demo4.py::TestDemo::test_case1[4399-AAAA] 4399 AAAA
PASSED
test_demo/test_demo4.py::TestDemo::test_case1[2012-BBBB] 2012 BBBB
PASSED
最后感谢每一个认真阅读我文章的人,看着粉丝一路的上涨和关注,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走! 希望能帮助到你!【100%无套路免费领取】


相关文章:
python单测框架之pytest常见用法
单测框架的作用 测试发现:从多个文件中寻找测试用例。测试执行:按照一定顺序去执行并且生成结果。测试断言:判断最终结果与实际结果的差异。测试报告:统计测试进度、耗时、通过率,生成测试报告。 pytest简介 pytest是…...
[终端安全]-8 隐私保护和隐私计算技术
1 隐私保护相关法规和标准 1)国内法规和标准 1.1)中华人民共和国网络安全法(2017年) - 规定了个人信息的保护和数据安全的基本原则。 - 要求网络运营者采取措施防止数据泄露、篡改和丢失。 1.2)信息安全技术&#x…...
MySQL 日志深度解析:从查询执行到性能优化
引言 MySQL 日志是数据库管理员和开发者的宝贵资源,它提供了查询执行的详细情况,帮助我们诊断问题和优化性能。本文将深入分析一个具体的 MySQL 日志条目,解释其含义,并提供针对性的优化建议。 日志信息概览 让我们先来快速了解…...
sql server 练习题5
课后作业 在homework库下执行 作业1: 案例:根据用户分数划分等级。小于60分为不及格,[60,80)为及格,[80,90)为良好,大于等于90分以上为优秀。 建表语句: CREATE TABLE Grades ( ID INT PRIMARY KEY, Name V…...
ai伪原创生成器app,一键伪原创文章效率高
如今,在自媒体创作的领域,ai伪原创生成器app的出现,给写作带来了一种全新的方式和效率。ai伪原创生成器app通过使用先进的自然语言处理技术和深度学习算法,能够将原始文章进行重组和改写,生成新的文章,从而…...
【ZhangQian AI模型部署】目标检测、SAM、3D目标检测、旋转目标检测、人脸检测、检测分割、关键点、分割、深度估计、车牌识别、车道线识别
在模型部署落地(主要部署到rk3588)折腾了这么多年,把这些年折腾过的模型整理了一下,所有的流程说明、代码模型都完全开放的,欢迎交流学习。有的是为了项目、有的是为了学习、还有的是为了找点事做、有的完全是为了安抚…...
DROO论文笔记
推荐文章DROO源码及论文学习 读论文《Deep Reinforcement Learning for Online Computation Offloading in Wireless Powered Mobile-Edge Computing Networks》的笔记 论文地址:用于无线移动边缘计算网络在线计算卸载的深度强化学习 论文代码地址:DR…...
修BUG:程序包javax.servlet.http不存在
貌似昨晚上并没有成功在tomcat上面运行,而是直接运行了网页。 不知道为啥又报错这个。。。 解决方案: https://developer.baidu.com/article/details/2768022 就整了这一步就行了 而且我本地就有这个tomcat就是加进去了。 所以说啊,是不是&a…...
python常用库
目录 from sklearn import metrics:评估 编辑 svm: 编辑 逻辑回归预测 编辑 朴素贝叶斯分类 编辑 主成分分析 编辑 其实就是求b.T的协方差阵 编辑 【因子分析,因子旋转有点复杂,略】 【层次聚类,原理…...
【UE5.3】笔记11
一、变量的SET&&GET 1、创建变量保存数据,如下图,找到左侧我的蓝图下的变量,新增一个,并选择类型。使用的时候直接将变量拖到蓝图中,此时会显示两个选项一个是获取一个是设置。 选择获取就是个GET蓝图&#x…...
加密与安全 密钥体系的三个核心目标之完整性解决方案
在密钥体系中,确保数据完整性是重要目标之一。以下为您详细讲解相关的完整性解决方案: 消息认证码(MAC): 消息认证码是基于共享密钥和特定算法生成的固定长度代码。在发送方,将消息和共享密钥作为输入&…...
FastAPI 学习之路(四十一)定制返回Response
接口中返回xml格式内容 from fastapi import FastAPI, Responseapp FastAPI()# ① xml app.get("/legacy") def get_legacy_data():data """<?xml version"1.0"?><shampoo><Header>Apply shampoo here.</Header&…...
C++ //练习 15.9 在什么情况下表达式的静态类型可能与动态类型不同?请给出三个静态类型与动态类型不同的例子。
C Primer(第5版) 练习 15.9 练习 15.9 在什么情况下表达式的静态类型可能与动态类型不同?请给出三个静态类型与动态类型不同的例子。 环境:Linux Ubuntu(云服务器) 工具:vim 解释 当print_t…...
斐波那契查找算法
斐波那契查找原理,仅仅改变了中间结点(mid)的位置,mid不再是中间或插值得到,而是位于黄金分割点附近,即midlowF(k-1)-1(F代表斐波那契数列) F[k]F[k-1]F[k-2],>(F[k]-1) (F[k-1]-1)(F[k-2]-1)1 说明:只要顺序表的长度为F[k]-1,则可以将该…...
CAN总线学习
can主要用于汽车、航空等控制行业,是一种串行异步通信方式,因为其相较于其他通信方式抗干扰能力更强,更加稳定。原因在于CAN不像其他通信方式那样,以高电平代表1,以低电平代表0,而是通过电压差来表示逻辑10…...
zookeeper基础知识学习
官网:Apache ZooKeeper 下载地址:Index of /dist/zookeeper/zookeeper-3.5.7Index of /dist/zookeeperIndex of /dist/zookeeper/zookeeper-3.5.7 ZK配置参数说明: 1、tickTime2000:通讯心跳时间,zookeeper服务器与客…...
C语言内存管理深度解析面试题及参考答案(2万字长文)
在嵌入式面试时,C语言内存管理是必问面试题,也是难点,相关知识点可以参考: C语言内存管理深度解析 下面整理了各种类型的C语言内存管理的面试题: 目录 全局变量和局部变量在内存中分别存储在哪个区域? 静态变量和全局变量有什么区别? 什么是作用域?…...
C++基础(二)
目录 1.类和对象 1.1类的定义 1.2访问限定符 1.3类域 2.实例化 2.1实例化概念 2.2对象大小 3.this指针 4.类的默认成员函数 4.1构造函数 4.2析构函数 4.5运算符重载 1.类和对象 1.1类的定义 类的定义格式 class为定义类的关键字,Stack为类的名字&…...
R 绘图 - 中文支持
R 绘图 - 中文支持 R 是一种广泛使用的统计和数据分析编程语言,它提供了强大的绘图功能。然而,R 的默认设置并不直接支持中文,这可能会在使用 R 进行绘图时造成困扰,尤其是当需要在图表中添加中文标签或标题时。本文将介绍如何在…...
使用Godot4组件制作竖版太空射击游戏_2D卷轴飞机射击-标题菜单及游戏结束界面(九)
文章目录 开发思路标题菜单界面标题菜单脚本代码结束菜单界面结束菜单脚本代码 使用Godot4组件制作竖版太空射击游戏_2D卷轴飞机射击(一) 使用Godot4组件制作竖版太空射击游戏_2D卷轴飞机射击-激光组件(二) 使用Godot4组件制作竖版…...
内存分配函数malloc kmalloc vmalloc
内存分配函数malloc kmalloc vmalloc malloc实现步骤: 1)请求大小调整:首先,malloc 需要调整用户请求的大小,以适应内部数据结构(例如,可能需要存储额外的元数据)。通常,这包括对齐调整,确保分配的内存地址满足特定硬件要求(如对齐到8字节或16字节边界)。 2)空闲…...
C++:std::is_convertible
C++标志库中提供is_convertible,可以测试一种类型是否可以转换为另一只类型: template <class From, class To> struct is_convertible; 使用举例: #include <iostream> #include <string>using namespace std;struct A { }; struct B : A { };int main…...
练习(含atoi的模拟实现,自定义类型等练习)
一、结构体大小的计算及位段 (结构体大小计算及位段 详解请看:自定义类型:结构体进阶-CSDN博客) 1.在32位系统环境,编译选项为4字节对齐,那么sizeof(A)和sizeof(B)是多少? #pragma pack(4)st…...
前端导出带有合并单元格的列表
// 导出async function exportExcel(fileName "共识调整.xlsx") {// 所有数据const exportData await getAllMainData();// 表头内容let fitstTitleList [];const secondTitleList [];allColumns.value.forEach(column > {if (!column.children) {fitstTitleL…...
如何将联系人从 iPhone 转移到 Android
从 iPhone 换到 Android 手机时,你可能需要保留重要的数据,例如通讯录。好在,将通讯录从 iPhone 转移到 Android 手机非常简单,你可以从本文中学习 6 种可靠的方法,确保随时保持连接,不错过任何信息。 第 1…...
TRS收益互换:跨境资本流动的金融创新工具与系统化解决方案
一、TRS收益互换的本质与业务逻辑 (一)概念解析 TRS(Total Return Swap)收益互换是一种金融衍生工具,指交易双方约定在未来一定期限内,基于特定资产或指数的表现进行现金流交换的协议。其核心特征包括&am…...
技术栈RabbitMq的介绍和使用
目录 1. 什么是消息队列?2. 消息队列的优点3. RabbitMQ 消息队列概述4. RabbitMQ 安装5. Exchange 四种类型5.1 direct 精准匹配5.2 fanout 广播5.3 topic 正则匹配 6. RabbitMQ 队列模式6.1 简单队列模式6.2 工作队列模式6.3 发布/订阅模式6.4 路由模式6.5 主题模式…...
Java + Spring Boot + Mybatis 实现批量插入
在 Java 中使用 Spring Boot 和 MyBatis 实现批量插入可以通过以下步骤完成。这里提供两种常用方法:使用 MyBatis 的 <foreach> 标签和批处理模式(ExecutorType.BATCH)。 方法一:使用 XML 的 <foreach> 标签ÿ…...
保姆级教程:在无网络无显卡的Windows电脑的vscode本地部署deepseek
文章目录 1 前言2 部署流程2.1 准备工作2.2 Ollama2.2.1 使用有网络的电脑下载Ollama2.2.2 安装Ollama(有网络的电脑)2.2.3 安装Ollama(无网络的电脑)2.2.4 安装验证2.2.5 修改大模型安装位置2.2.6 下载Deepseek模型 2.3 将deepse…...
【VLNs篇】07:NavRL—在动态环境中学习安全飞行
项目内容论文标题NavRL: 在动态环境中学习安全飞行 (NavRL: Learning Safe Flight in Dynamic Environments)核心问题解决无人机在包含静态和动态障碍物的复杂环境中进行安全、高效自主导航的挑战,克服传统方法和现有强化学习方法的局限性。核心算法基于近端策略优化…...
