pytest总结

这里写目录标题
- 一、pytest的命名规则
- 二、界面化配置
- 符合命名规则的方法前面会有运行标记
- 三、pytest的用例结构
- 三部分组成
- 四、pytest的用例断言
- 断言写法:
- 五、pytest测试框架结构
- 六、pytest参数化用例
- 1、pytest参数化实现方式
- 2、单参数:每一条测试数据都会生成一条测试用例
- 3、多参数:
- ids:为测试用例起名字
- ids有中文的情况
- 4、笛卡儿积
- 七、标记测试用例
- 八、pytest设置跳过、预期失败用例
- 1、skip的使用场景:
- 2、skipif的使用场景:
- 3、xfail的使用场景:
- 九、pytest运行测试用例
- 1、运行多个测试包
- 2、运行多个测试模块
- 3、运行多个测试类
- 4、运行多个测试方法
- 5、运行单个测试方法
- 6、运行结果分析
- 十、pytest命令行常用参数
- 1、-x:
- 2、--maxfail=2:用例允许失败1条,第2条失败时,stop
- 3、-k:执行测试用例中,包含“tup”的用例(采用双引号)
- 4、-k:执行测试用例中,除了“tup”之外的用例(采用双引号)
- 5、--collect-only:只收集不运行
- 十一、python执行pytest
- 1、使用main函数
- a、pytest.main() :执行当前目录下符合规则的所有测试用例
- b、运行某一条用例
- c、运行某个标签
- 2、使用python -m pytest调用pytest
- 十二、pytest异常处理
- try...except
- pytest.raises()
- 1、捕获异常:意料之内的异常,不会报错
- 2、捕获异常:意料之外的异常,会报错
- 3、捕获多个异常
- 4、捕获异常后获取异常值和异常类型
一、pytest的命名规则
文件: test开头或者_test结尾
类名 : Test开头
方法名 :test_开头
特别注意:测试类中不能定义__init__()方法
二、界面化配置

符合命名规则的方法前面会有运行标记

三、pytest的用例结构
三部分组成
用例名称
用例步骤
用例断言
class TestXXX:def setup(self):#资源准备passdef teardown(self):#资源销毁passdef test_xxx(self):#测试步骤1#测试步骤2#断言 实际结果 对比 期望结果logging.info('这是xxx测试用例')assert 1==1
四、pytest的用例断言
断言(assert),是一种在程序中的一阶逻辑(如:一个结果为真或假的逻辑判断式),目的为了表示与验证软件开发者预期的结果。当程序执行到断言的位置时,对应的断言应该为真。若断言不为真时,程序会中止执行,并给出错误信息。
断言写法:
assert 表达式
assert 表达式,描述:当断言成功时,描述语句不会执行;当断言失败时,描述语句会执行。
class TestDemo:def test_c(self):assert 1==1def test_c1(self):assert 'abc1' in 'abcdef' , 'abc不在abcdef中'
五、pytest测试框架结构
setup_module/teardown_module:全局模块级,只运行一次
setup_class/teardown_class:类级,只在类中前后运行一次
setup_function/teardown_function:函数级别:在类外
setup_method/teardown_method:方法级别,在类中。类中每个方法执行前后
setup/teardown:在类中,在每个测试方法前后执行
六、pytest参数化用例
通过参数的方式传递数据,从而实现数据和脚本的分离
并且可以实现用例的重复生成和执行
1、pytest参数化实现方式
装饰器:pytest.mark.parametrize
2、单参数:每一条测试数据都会生成一条测试用例
#单参数
import pytest
search_list=['appium','selenium','pytest']# 两组测试数据:两条测试用例
@pytest.mark.parametrize('search_key',['java','appium'])
def test_search_params(search_key):assert search_key in search_list

3、多参数:
ids:为测试用例起名字
注意:ids 列表参数的个数要与参数值的个数一致
import pytest#测试数据有2个参数
@pytest.mark.parametrize("username,password",[["kobe",666],["kd",111],[" ",888]],ids=['success','fail','username is None'])
def test_login1(username,password):print(f'登录的用户名:{username},密码:{password}')

ids有中文的情况
import pytest@pytest.mark.parametrize("username,password",[["kobe",666],["kd",111],[" ",888]],ids=['成功','失败','用户名为空'])
def test_login(username,password):print(f'登录的用户名:{username},密码:{password}')
需要在conftest.py中定义pytest_collection_modifyitems方法
def pytest_collection_modifyitems(items):"""测试用例收集完成时,将收集到的用例名name和用例标识nodeid的中文信息显示在控制台上"""for i in items:i.name=i.name.encode('utf-8').decode('unicode-escape')i._nodeid=i.nodeid.encode('utf-8').decode('unicode-escape')

4、笛卡儿积
两组数据a=[1,2,3],b=[a,b,c]
对应的有几组组合形式?
(1,a)(1,b)(1,c)
(2,a)(2,b)(2,c)
(3,a)(3,b)(3,c)
import pytest@pytest.mark.parametrize('a',[1,2,3])
@pytest.mark.parametrize('b',['aa','bb','cc'])
def test_params1(a,b):print(f'笛卡儿积形式参数化中,a={a},b={b}')

七、标记测试用例
场景:只执行符合要求的某一部分用例可以把一个web项目划分为多个模块,然后指定模块名执行
解决:在测试用例方法上加@pytest.mark.标签名
执行:-m 执行自定义标记的相关用例
import pytest
#测试数据:整型
@pytest.mark.int
def test_int():assert isinstance(2,int)#测试数据:字符串
@pytest.mark.str
def test_str():assert isinstance('str',str)#测试数据:浮点型
@pytest.mark.float
def test_float():assert isinstance('2.7',float)
执行测试用例
D:\pytest_project\test_params>pytest test_mark.py -vs -m int
测试结果

执行用例会出现警告,解决方法:在pytest.ini中将标签注册

再次执行,没有警告了

八、pytest设置跳过、预期失败用例
这是pytest的内置标签,可以处理一些特殊的测试用例
skip:始终跳过该测试用例
skipif:遇到特定情况跳过该测试用例
xfail:遇到特定情况,产生一个”预期失败“输出
1、skip的使用场景:
1、调试时不想运行这个测试用例
2、标记无法在某些平台运行的测试用例
3、在某些版本中执行,其他版本中跳过
import pytest@pytest.mark.skip
def test_aaa():print("代码未开发完")assert True@pytest.mark.skip(reason="代码没有实现")
def test_bbb():assert False
执行测试用例:测试用例跳过图标默认置灰

案例:做判断
def check_login():return Falsedef test_function():print("start")#如果未登录,则跳过后续步骤if not check_login():pytest.skip("unsupported configuration")print("end")
2、skipif的使用场景:
import sys
print(sys.platform)@pytest.mark.skipif(sys.platform == 'darwin', reason="does not run on mac")
def test_case1():assert True
@pytest.mark.skipif(sys.platform == 'win', reason="does not run on windows")
def test_case2():assert True
@pytest.mark.skipif(sys.version_info < (3, 6), reason="requires python3.6 or higher")
def test_case3():assert True
3、xfail的使用场景:
import pytest@pytest.mark.xfail
def test_aaa():print("test_xfail1 方法执行")assert 2 == 2xfail =pytest.mark.xfail@xfail(reason="bug")
def test_hello4():assert 0
九、pytest运行测试用例
1、运行多个测试包
目录结构

运行测试用例:
D:\pytest_project>pytest demo_plugin
2、运行多个测试模块
运行测试用例:
D:\pytest_project>pytest demo_plugin/demo1
3、运行多个测试类
运行测试用例:
D:\pytest_project>pytest demo_plugin/demo2/test_demo2.py
4、运行多个测试方法
运行测试用例:
D:\pytest_project>pytest demo_plugin/demo2/test_demo2.py::TestB
5、运行单个测试方法
运行测试用例:
D:\pytest_project>pytest demo_plugin/demo2/test_demo2.py::TestB::test_d
6、运行结果分析
常用的:pass(通过)、fail(失败)、error(代码错误)
特殊的:warning(警告,例如pytest.ini中没有注册标签名)、deselect(跳过,加标签skip、skipif)
十、pytest命令行常用参数
-m:执行加标签的测试用例
-k:执行测试用例中包含某个关键字的测试用例(windows中关键字使用双引号)
-x:用例一旦运行失败,立刻停止运行(冒烟测试)
– maxfail=num:测试用例失败达到num个时,立刻停止运行
-v:打印详细信息
-s:打印输出日志
-n:并发执行测试用例
-lf:只执行上次用例失败的测试用例
-ff:先执行上次用例失败的测试用例,再执行其他的测试用例
–collect-only:测试平台,pytest自动导入功能
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time : 2023/2/15 20:10
# @Author : 杜兰特
# @File : test_mark.py
import pytest
#测试数据:整型
@pytest.mark.int
def test_int():assert isinstance(2,int)#测试数据:字符串
@pytest.mark.str
def test_str():assert isinstance('str',str)#测试数据:浮点型
@pytest.mark.float
def test_float():assert isinstance('2.7',float)#测试数据:列表
@pytest.mark.list
def test_list():assert isinstance('[1,2,3]',list)#测试数据:元组
@pytest.mark.tuple
def test_tuple():assert isinstance('(1,)',tuple)
1、-x:
D:\pytest_project\test_params>pytest test_mark.py -x

2、–maxfail=2:用例允许失败1条,第2条失败时,stop
D:\pytest_project\test_params>pytest test_mark.py --maxfail=2
3、-k:执行测试用例中,包含“tup”的用例(采用双引号)
D:\pytest_project\test_params>pytest test_mark.py -k "tup"

4、-k:执行测试用例中,除了“tup”之外的用例(采用双引号)
D:\pytest_project\test_params>pytest test_mark.py -k "not tup"

5、–collect-only:只收集不运行
十一、python执行pytest
1、使用main函数
a、pytest.main() :执行当前目录下符合规则的所有测试用例
test_first.py文件
import pytestdef test_a():assert 1==1def test_b():assert 1==2class TestDemo:def test_c(self):assert 1==1def test_c1(self):assert 'abc1' in 'abcdef' , 'abc不在abcdef中'class TestXXX:def setup(self):#资源准备passdef teardown(self):#资源销毁passdef test_xxx(self):#测试步骤1#测试步骤2#断言 实际结果 对比 期望结果assert 1==1if __name__ == '__main__':pass#todo 1、运行当前目录下所有的用例pytest.main() #相当于pytest.main(['./'])
执行测试用例
D:\pytest_project>python test_first.py
b、运行某一条用例
import pytestif __name__ == '__main__':#todo 2、运行test_parameters.py::test_login中的某一条用例pytest.main(['test_params/test_parameters.py::test_login','-vs'])
执行测试用例
D:\pytest_project>python test_first.py
c、运行某个标签
import pytestif __name__ == '__main__':#todo 3、运行某个标签pytest.main(['test_params/test_mark.py','-vs','-m','int'])
执行测试用例
D:\pytest_project>python test_first.py
2、使用python -m pytest调用pytest
D:\pytest_project>python -m pytest test_first.py
十二、pytest异常处理
try…except
pytest.raises()
可以捕获特定的异常
获取捕获的异常的细节(异常类型、异常信息)
发生异常,后面的代码将不会被执行
1、捕获异常:意料之内的异常,不会报错
import pytest
def test_raise():with pytest.raises(expected_exception=ValueError, match='must be 0 or None'):raise ValueError("value must be 0 or None")
2、捕获异常:意料之外的异常,会报错
def test_raise1():with pytest.raises(expected_exception=ValueError, match='must be 0 or None'):raise ZeroDivisionError("除数为0的")
3、捕获多个异常
def test_raise2():with pytest.raises(expected_exception=(ValueError,ZeroDivisionError), match='must be 0 or None'):raise ZeroDivisionError("value must be 0 or None")
4、捕获异常后获取异常值和异常类型
def test_raise2():with pytest.raises(ValueError) as exc_info:raise ValueError("value must be 42")assert exc_info.type is ValueErrorassert exc_info.value.args[0] == "value must be 42"

相关文章:
pytest总结
这里写目录标题一、pytest的命名规则二、界面化配置符合命名规则的方法前面会有运行标记三、pytest的用例结构三部分组成四、pytest的用例断言断言写法:五、pytest测试框架结构六、pytest参数化用例1、pytest参数化实现方式2、单参数:每一条测试数据都会…...
CNI 网络分析(九)Calico IPIP
文章目录环境流量分析Pod 间Node 到 PodPod 到 serviceNode 到 serviceNetworkPolicy理清和观测网络流量环境 可以看到,在宿主机上有到每个 pod IP 的路由指向 veth 设备 到对端节点网段的路由 指向 tunl0 下一跳 ens10 的 ip 有到本节点网段 第一个 ip 即 tunl0 的…...
分布式任务调度(XXL-JOB)
什么是分布式任务调度? 任务调度顾名思义,就是对任务的调度,它是指系统为了完成特定业务,基于给定时间点,给定时间间隔或者给定执行次数自动执行任务。通常任务调度的程序是集成在应用中的,比如:…...
Django框架之模型视图--Session
Session 1 启用Session Django项目默认启用Session。 可以在settings.py文件中查看,如图所示 如需禁用session,将上图中的session中间件注释掉即可。 2 存储方式 在settings.py文件中,可以设置session数据的存储方式,可以保存…...
二极管的“几种”应用
不知大家平时有没有留意,二极管的应用范围是非常广的,下面我们来看看我想到几种应用,也可以加深对电路设计的认识: A,特性应用: 由于二极管的种类非常之多,这里这个大类简单罗列下:…...
github上传本地文件详细过程
repository 也就是俗称的仓库 声明:后续操作基于win10系统 前提:有一个github账号、电脑安装了git(官方安装地址) 目的: 把图中pdf文件上传到github上的个人仓库中 效果: 温馨提示: git中复制: ctrl insert…...
常用聚类算法分析
1. 什么是聚类 1.1. 聚类的定义 聚类(Clustering)是按照某个特定标准(如距离)把一个数据集分割成不同的类或簇,使得同一个簇内的数据对象的相似性尽可能大,同时不在同一个簇中的数据对象的差异性也尽可能地大。也即聚类后同一类的数据尽可能聚集到一起…...
OSG三维渲染引擎编程学习之五十八:“第五章:OSG场景渲染” 之 “5.16 简单光源”
目录 第五章 OSG场景渲染 5.16 简单光源 5.16.1 场景中使用光源 5.16.2 简单光源示例 第五章 OSG场景渲染 OSG存在场景树和渲染树,“场景数”的构建在第三章“OSG场景组...
80211无线网络架构
无线网络架构物理组件BSS(Basic Service Set)基本服务集BSSID(BSS Identification)ssid(Service Set Identification)ESS(Extended Service Set)扩展服务集物理组件 无线网络包含四…...
基于springboot+vue的便利店库存管理系统
基于springbootvue的便利店库存管理系统 ✌全网粉丝20W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取项目下载方式🍅 一、项目背景…...
3|物联网控制|计算机控制-刘川来胡乃平版|第1章:绪论|青岛科技大学课堂笔记|U1 ppt
目录绪论(2学时)常用仪表设备(3学时)计算机总线技术(4学时)过程通道与人机接口(6学时)数据处理与控制策略(6学时)网络与通讯技术(3学时࿰…...
js打印本地pdf(使用HttpPrinter打印插件)
js打印本地pdf(使用HttpPrinter打印插件)第一步:启动HttpPrinter打印插件第二步:用浏览器打开示例文件\调用示例\websocket协议示例\html\打印pdf.html输入pdf地址 点击 “下载并打印pdf文件”按钮,就可以静默打印了。…...
华为OD机试 - 双十一(Python) | 机试题算法思路 【2023】
最近更新的博客 【新解法】华为OD机试 - 关联子串 | 备考思路,刷题要点,答疑,od Base 提供【新解法】华为OD机试 - 停车场最大距离 | 备考思路,刷题要点,答疑,od Base 提供【新解法】华为OD机试 - 任务调度 | 备考思路,刷题要点,答疑,od Base 提供【新解法】华为OD机试…...
2020年UML 秋季期末测试题
1.UML的全称是(B )。A.Unified Making LanguageB.Unified Modeling LanguageC.Unified Meodem languageD.Unify Modeling Language2.UML主要应用于( C)。A.基于螺旋模型的结构化开发方法B.基于数据的数据流开发方法C.基于对象的面…...
SpringCloud - Ribbon负载均衡
目录 负载均衡流程 负载均衡策略 Ribbon加载策略 负载均衡流程 Ribbon将http://userservice/user/1请求拦截下来,帮忙找到真实地址http://localhost:8081LoadBalancerInterceptor类对RestTemplate的请求进行拦截,然后从Eureka根据服务id获取服务列表&…...
Spring Boot + Redis 实现分布式锁
一、业务背景有些业务请求,属于耗时操作,需要加锁,防止后续的并发操作,同时对数据库的数据进行操作,需要避免对之前的业务造成影响。二、分析流程使用 Redis 作为分布式锁,将锁的状态放到 Redis 统一维护&a…...
CAD二次开发 插件初始化接口IExtensionApplication
前言:在实际项目开发中,我们总会遇到一些问题。比如说在CAD打开之前,修改注册表的内容,或者解决CAD在没有完全加载想要的dll情况下,功能运行报错的bug。因此,下面和大家介绍一下IExtensionApplication接口 …...
kafka-11-kafka的监控工具和常用配置参数
kafka官方文档 参考Kafka三款监控工具比较 1 查看kafka的版本 进入kafka所在目录,通过查看libs目录下的jar包。 2.11是scala的版本,2.0.0是kafka的版本。 测试环境 #systemctl start zookeeper #systemctl start kafkka 2 kafka的常用配置 Kafka使用…...
前端PWA渐进式加载技术
1.什么是PWA? 渐进式网络应用(PWA)是谷歌在2015年底提出的概念。基本上算是web应用程序,但在外观和感觉上与原生app类似。支持PWA的网站可以提供脱机工作、推送通知和设备硬件访问等功能。 2.PWA有那些优点? 更小更…...
【ubuntu 22.04不识别ch340串口】
这个真是挺无语的,发现国内厂商普遍对开源环境不感兴趣,ch340官方linux驱动好像被厂家忘了,现在放出来的驱动还是上古内核版本: 于是,驱动居然要用户自己编译安装。。还好网上有不少大神:链接,…...
springboot 百货中心供应链管理系统小程序
一、前言 随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱,百货中心供应链管理系统被用户普遍使用,为方…...
2025年能源电力系统与流体力学国际会议 (EPSFD 2025)
2025年能源电力系统与流体力学国际会议(EPSFD 2025)将于本年度在美丽的杭州盛大召开。作为全球能源、电力系统以及流体力学领域的顶级盛会,EPSFD 2025旨在为来自世界各地的科学家、工程师和研究人员提供一个展示最新研究成果、分享实践经验及…...
Oracle查询表空间大小
1 查询数据库中所有的表空间以及表空间所占空间的大小 SELECTtablespace_name,sum( bytes ) / 1024 / 1024 FROMdba_data_files GROUP BYtablespace_name; 2 Oracle查询表空间大小及每个表所占空间的大小 SELECTtablespace_name,file_id,file_name,round( bytes / ( 1024 …...
oracle与MySQL数据库之间数据同步的技术要点
Oracle与MySQL数据库之间的数据同步是一个涉及多个技术要点的复杂任务。由于Oracle和MySQL的架构差异,它们的数据同步要求既要保持数据的准确性和一致性,又要处理好性能问题。以下是一些主要的技术要点: 数据结构差异 数据类型差异ÿ…...
【SQL学习笔记1】增删改查+多表连接全解析(内附SQL免费在线练习工具)
可以使用Sqliteviz这个网站免费编写sql语句,它能够让用户直接在浏览器内练习SQL的语法,不需要安装任何软件。 链接如下: sqliteviz 注意: 在转写SQL语法时,关键字之间有一个特定的顺序,这个顺序会影响到…...
HBuilderX安装(uni-app和小程序开发)
下载HBuilderX 访问官方网站:https://www.dcloud.io/hbuilderx.html 根据您的操作系统选择合适版本: Windows版(推荐下载标准版) Windows系统安装步骤 运行安装程序: 双击下载的.exe安装文件 如果出现安全提示&…...
佰力博科技与您探讨热释电测量的几种方法
热释电的测量主要涉及热释电系数的测定,这是表征热释电材料性能的重要参数。热释电系数的测量方法主要包括静态法、动态法和积分电荷法。其中,积分电荷法最为常用,其原理是通过测量在电容器上积累的热释电电荷,从而确定热释电系数…...
Bean 作用域有哪些?如何答出技术深度?
导语: Spring 面试绕不开 Bean 的作用域问题,这是面试官考察候选人对 Spring 框架理解深度的常见方式。本文将围绕“Spring 中的 Bean 作用域”展开,结合典型面试题及实战场景,帮你厘清重点,打破模板式回答,…...
LangFlow技术架构分析
🔧 LangFlow 的可视化技术栈 前端节点编辑器 底层框架:基于 (一个现代化的 React 节点绘图库) 功能: 拖拽式构建 LangGraph 状态机 实时连线定义节点依赖关系 可视化调试循环和分支逻辑 与 LangGraph 的深…...
MySQL 主从同步异常处理
阅读原文:https://www.xiaozaoshu.top/articles/mysql-m-s-update-pk MySQL 做双主,遇到的这个错误: Could not execute Update_rows event on table ... Error_code: 1032是 MySQL 主从复制时的经典错误之一,通常表示ÿ…...
