Pytest框架中的Setup和Teardown功能
在 pytest 测试框架中,setup 和 teardown是用于在每个测试函数之前和之后执行设置和清理的动作,而pytest 实际上并没有内置的 setup 和 teardown 函数,而是使用了一些装饰器或钩子函数来实现类似的功能。
学习目录
钩子函数(Hook Functions)
Fixture方式
1 在测试函数执行前执行setup和teardown的动作 4
2 在测试类执行前执行setup和teardown的动作 5
3 同时实现测试类和测试函数的setup和teardown 6
钩子函数(Hook Functions)
以下钩子函数运行的优先级是模块级 > 类级 > 方法级
函数名 | 说明 |
setup_module | 在python文件执行中的第1条用例执行前,先执行setup_module函数 |
teardown_module | 在python文件执行中的最后1条用例执行结束后(不管成功还是失败),执行teardown_module函数 |
setup_class | 在测试类中定义该函数,在测试类的第1条用例执行前,先执行setup_class函数 |
teardown_class | 在测试类中定义该函数,在测试类的最后1条用例执行结束后(不管成功还是失败),执行teardown_class函数 |
setup_function | 在python文件执行中的每一条用例执行前,执行setup_function函数(适用于类外面和类里面的函数) |
teardown_function | 在python文件执行中的每一条用例执行结束后(不管成功还是失败),执行teardown_function函数(适用于类外面和类里面的函数) |
举例:定义test_case1.py文件,设置函数用例test_1,测试类TestCase中两条用例test_2和test3。
定义setup_module和teardown_module、setup_class和teardown_class、setup_function和teardown_function函数。
import pytest
def setup_module():print("\nSetting up module... 模块开始前执行")
def teardown_module():print("\nTearing down module...模块结束后执行")def setup_function(function):print(f"\nSetting up for {function.__name__}... 函数开始前执行")
def teardown_function(function):print(f"\nTearing down for {function.__name__}...函数结束后执行")
#函数1
def test_1():assert 1!=1class TestCase():def setup_class():print(f"\nSetting up for class... 类开始前执行")def teardown_class():print(f"\nTearing down for class...类结束后执行")@staticmethoddef test_2(): #函数2assert 1 == 1@staticmethoddef test_3(): #函数3assert 1 == 1
运行该测试文件,执行结果如下:
按照测试用例的顺序,第一个函数test_1在类外面,执行函数的setup和teardown,而到了test_2和test_3函数因为在类里面,所以按照优先级先执行类的setup和teardown,再执行函数级setup和teardown
Fixture方式
fixture是pytest中最强大和推荐的方式,用于设置和清理测试环境。我们可以定义一个fixture,并在测试函数中使用它,该fixture将在测试函数之前执行,并在测试函数之后进行清理
- 使用@pytest.fixture装饰器定义fixture。
- 在测试函数中,通过函数参数的方式使用fixture。
1 在测试函数执行前执行setup和teardown的动作
设置一个函数,使用@pytest.fixture进行装饰
import pytest
@pytest.fixture
def my_fixture():print("\nSetting up fixture... 函数执行前执行该步骤")# 这里可以放置设置代码yieldprint("\nTearing down fixture... 函数执行后执行该步骤")# 这里可以放置清理代码def test_1(my_fixture):print("\nRunning testcase1...")
yield 关键字的使用,它允许在 fixture 函数中定义两部分:设置代码(在 yield 之前)和清理代码(在 yield 之后)。将my_fixture函数作为参数传入测试函数test_1中。
用例执行后结果如下 同样实现了函数级的setup和teardown的功能
2 在测试类执行前执行setup和teardown的动作
定义一个fixture函数class_setup_teardown,在该函数使用 @pytest.fixture(scope='class', autouse=True) 装饰器(应用于类时scope参数定义为class,而上面的例子中应用于函数时可保持默认值function),并将 这个fixture 作为类中测试方法的参数,以此来实现类中的setup和teardown功能。
@pytest.fixture(scope='class', autouse=True)
def class_setup_teardown():print("\nClass setup (equal to setup_class)")# 设置代码yieldprint("\nClass teardown (equal to teardown_class)")# 清理代码
第一种方式:在测试函数中传入定义的fixture函数作为参数
class Testcase:def test_one(self, class_setup_teardown): # 直接将fixture作为参数print("\nRunning test_one")# 测试代码def test_two(self, class_setup_teardown): # 同样地,直接作为参数print("\nRunning test_two")# 测试代码
- 第二种方式:在测试类中使用装饰器注明使用fixture,测试函数中不传参数
@pytest.mark.usefixtures("class_setup_teardown")
class Testcase:def test_one(self): print("\nRunning test_one")# 测试代码def test_two(self):print("\nRunning test_two")# 测试代码
用例执行后结果如下:两种方式都实现了测试类setup和teardown的功能
3 同时实现测试类和测试函数的setup和teardown
将以上两种方式结合在一起就可以了
@pytest.fixture
def my_fixture():print("\nSetting up fixture... 函数执行前执行该步骤")# 这里可以放置设置代码yieldprint("\nTearing down fixture... 函数执行后执行该步骤")# 这里可以放置清理代码@pytest.fixture(scope='class', autouse=True)
def class_setup_teardown():print("\nClass setup (equal to setup_class)")# 设置代码yieldprint("\nClass teardown (equal to teardown_class)")# 清理代码
- 第1种方式: 在测试类中注明使用类fixture,在测试函数传入函数级fixture
@pytest.mark.usefixtures("class_setup_teardown")
class Testcase:def test_one(self,my_fixture): # 直接将fixture作为参数print("\nRunning test_one")# 测试逻辑def test_two(self,my_fixture): # 同样地,直接作为参数print("\nRunning test_two")# 测试逻辑
- 第二种方式:在测试函数同时传入类级fixture和函数级fixture
class Testcase:def test_one(self,class_setup_teardown,my_fixture): # 直接将fixture作为参数print("\nRunning test_one")# 测试逻辑def test_two(self,class_setup_teardown,my_fixture): # 同样地,直接作为参数print("\nRunning test_two")# 测试逻辑
用例执行后结果如下:两种方式都实现了测试类setup和teardown的功能
当然Pytest的fixture功能远不止这些,后续我们再做其他功能的介绍。
共勉: 东汉·班固《汉书·枚乘传》:“泰山之管穿石,单极之绠断干。水非石之钻,索非木之锯,渐靡使之然也。”
-----指水滴不断地滴,可以滴穿石头;
-----比喻坚持不懈,集细微的力量也能成就难能的功劳。
----感谢读者的阅读和学习,谢谢大家
相关文章:

Pytest框架中的Setup和Teardown功能
在 pytest 测试框架中,setup 和 teardown是用于在每个测试函数之前和之后执行设置和清理的动作,而pytest 实际上并没有内置的 setup 和 teardown 函数,而是使用了一些装饰器或钩子函数来实现类似的功能。 学习目录 钩子函数(Hook…...

yolov10/v8 loss详解
v10出了就想看看它的loss设计有什么不同,看下来由于v8和v10的loss部分基本一致就放一起了。 v10的论文笔记,还没看的可以看看,初步尝试耗时确实有提升 好记性不如烂笔头,还是得记录一下,以免忘了,废话结束…...
Typescript高级: 深入理解infer关键字
概述 在 TS 中,infer 是一个高级类型操作,特别是条件类型和映射类型中非常有用的关键字它在泛型中使用也会是一个强大工具,增强了类型推断的能力,让开发者更灵活地处理和操作类型它允许在泛型类型推导过程中捕获一个具体的类型&a…...

JQC-3FF-S-Z 继电器模块使用(arduino)
前言 继电器模块可以控制电流的接通和非接通状态,和开关一样。实际上是用小电流去控制大电流运作的一种“自动开关” 本文只是简单使用继电器模块做一个 led 点亮和熄灭的案例,结合案例可以和 nodemcu 等板子结合做出远程控制开关。 材料准备 杜邦线…...

黑马一站制造数仓实战2
问题 DG连接问题 原理:JDBC:用Java代码连接数据库 Hive/SparkSQL:端口有区别 可以为同一个端口,只要不在同一台机器 项目:一台机器 HiveServer:10000 hiveserver.port 10000 SparkSQL:10001…...

网络I/O模型
网络I/O模型 同步I/O阻塞I/O非阻塞I/OI/O多路复用select函数接口示例 poll函数接口示例 poll 和 select 的区别epoll原理:示例 异步I/O 同步I/O 阻塞I/O 一个基本的C/S模型如下图所图:其中 listen()、connect()、write()、read() 都是阻塞I/O࿰…...

Docker 简介和安装
目录 Docker 是什么 跟普通虚拟机的对比 打包、分发、部署 Docker 部署的优势 Docker 通常用来做什么 重要概念:镜像、容器 安装 镜像加速源 Docker 是什么 Docker 是一个应用打包、分发、部署的工具 你也可以把它理解为一个轻量的虚拟机,它只虚…...

【源码】Spring Data JPA原理解析之Repository自定义方法命名规则执行原理(二)
Spring Data JPA系列 1、SpringBoot集成JPA及基本使用 2、Spring Data JPA Criteria查询、部分字段查询 3、Spring Data JPA数据批量插入、批量更新真的用对了吗 4、Spring Data JPA的一对一、LazyInitializationException异常、一对多、多对多操作 5、Spring Data JPA自定…...
Vue前端中从后端获取图片验证码
前端发送请求 <template><el-form :model"user" :rules"rules" ref"userForm" class"login" label-width"auto" style"max-width: 600px"><el-form-item label"用户名" prop"name…...

【源码】多语言H5聊天室/thinkphp多国语言即时通讯/H5聊天室源码/在线聊天/全开源
多语言聊天室系统,可当即时通讯用,系统默认无需注册即可进入群聊天,全开源 【海外聊天室】多语言H5聊天室/thinkphp多国语言即时通讯/H5聊天室源码/在线聊天/全开源 - 吾爱资源网...

gitlab 创建 ssh 和 token
文章目录 一、创建ssh key二、将密钥内容复制到gitlab三、创建token 一、创建ssh key 打开控制台cmd,执行命令 ssh-keygen -t rsa -C xxxxx xxxxx是你自己的邮箱 C:\Users\xx\.ssh 目录下会创建一个名为id_rsa.pub的文件,用记事本打开,并…...
Docker - Kafka
博文目录 文章目录 说明命令 说明 Docker Hub - bitnami/kafka Docker Hub - apache/kafka Kafka QuickStart Kafka 目前没有 Docker 官方镜像, 目前拉取次数最多的是 bitnami/kafka, Apache 提供的是 apache/kafka (更新最及时), 本文使用 bitnami/kafka bitnami/kafka 镜像…...

一键实现文件夹批量高效重命名:轻松运用随机一个字母命名,让文件管理焕然一新!
在数字化时代,文件夹管理是我们日常生活和工作中不可或缺的一部分。然而,随着文件数量的不断增加,文件夹命名的繁琐和重复成为了一个让人头疼的问题。你是否曾因为手动一个个重命名文件夹而感到枯燥乏味?你是否曾渴望有一种方法能…...

Vue3项目练习详细步骤(第二部分:主页面搭建)
主页面搭建 页面主体结构 路由 子路由 主页面搭建 页面主体结构 在vuews目录下新建Layout.vue文件 主页面内容主体代码 <script setup> import {Management,Promotion,UserFilled,User,Crop,EditPen,SwitchButton,CaretBottom } from element-plus/icons-vue imp…...

[个人总结]-java常用方法
1.获取项目根路径 user.dir是一个系统属性,表示用户当前的工作目录,大多数情况下,用户的当前工作目录就是java项目的根目录(src文件的同级路径) System.getProperty("user.dir") 结果:D:\code…...
什么是Java泛型?它有什么作用
Java泛型(Generics)是一种允许在定义类、接口和方法时使用类型参数的机制。泛型提供了一种机制,使得代码可以对多种类型的对象进行操作,而无需进行类型转换。 Java泛型的作用 类型安全:通过在编译时进行类型检查&…...
[机缘参悟-197] - 《道家-水木然人间清醒1》读书笔记 -21-看问题从现象到本质的层次
目录 1. 现象层: 2. 关联层: 3. 原因层: 4. 本质层: 5. 解决方案层: 6. 设计实现层: 7. 泛化: 8. 创新与发现: 看问题从现象到本质的层次是一个逐步深入、由表及里的过程。这…...

AIGC商业案例实操课,发觉其创造和商业的无限可能,Ai技术在行业应用新的商机
课程下载:https://download.csdn.net/download/m0_66047725/89307523 更多资源下载:关注我。 课程内容 1 AI为什么火 。写在课程前面的寄语 。AIGC标志性事件:太空歌剧院 。AI人工智能为什么这么火 ,AI人工智能发展历程 。聊天AI会取…...
Java学习路径图
1.学习路径 JAVA架构师学习路径 2.路径拆解 2.1 Spring 2.1.1 SpringBoot原理 SpringBoot2学习视频 SpringBoot2笔记 SpringBoo2代码 2.2.2 SpringBoot项目 《谷粒商城》学习视频...
文章解读与仿真程序复现思路——电力系统自动化EI\CSCD\北大核心《考虑动态定价的新能源汽车能源站优化运行》
本专栏栏目提供文章与程序复现思路,具体已有的论文与论文源程序可翻阅本博主免费的专栏栏目《论文与完整程序》 论文与完整源程序_电网论文源程序的博客-CSDN博客https://blog.csdn.net/liang674027206/category_12531414.html 电网论文源程序-CSDN博客电网论文源…...
Cesium1.95中高性能加载1500个点
一、基本方式: 图标使用.png比.svg性能要好 <template><div id"cesiumContainer"></div><div class"toolbar"><button id"resetButton">重新生成点</button><span id"countDisplay&qu…...

解决Ubuntu22.04 VMware失败的问题 ubuntu入门之二十八
现象1 打开VMware失败 Ubuntu升级之后打开VMware上报需要安装vmmon和vmnet,点击确认后如下提示 最终上报fail 解决方法 内核升级导致,需要在新内核下重新下载编译安装 查看版本 $ vmware -v VMware Workstation 17.5.1 build-23298084$ lsb_release…...

初探Service服务发现机制
1.Service简介 Service是将运行在一组Pod上的应用程序发布为网络服务的抽象方法。 主要功能:服务发现和负载均衡。 Service类型的包括ClusterIP类型、NodePort类型、LoadBalancer类型、ExternalName类型 2.Endpoints简介 Endpoints是一种Kubernetes资源…...
JS手写代码篇----使用Promise封装AJAX请求
15、使用Promise封装AJAX请求 promise就有reject和resolve了,就不必写成功和失败的回调函数了 const BASEURL ./手写ajax/test.jsonfunction promiseAjax() {return new Promise((resolve, reject) > {const xhr new XMLHttpRequest();xhr.open("get&quo…...
Kafka主题运维全指南:从基础配置到故障处理
#作者:张桐瑞 文章目录 主题日常管理1. 修改主题分区。2. 修改主题级别参数。3. 变更副本数。4. 修改主题限速。5.主题分区迁移。6. 常见主题错误处理常见错误1:主题删除失败。常见错误2:__consumer_offsets占用太多的磁盘。 主题日常管理 …...

零知开源——STM32F103RBT6驱动 ICM20948 九轴传感器及 vofa + 上位机可视化教程
STM32F1 本教程使用零知标准板(STM32F103RBT6)通过I2C驱动ICM20948九轴传感器,实现姿态解算,并通过串口将数据实时发送至VOFA上位机进行3D可视化。代码基于开源库修改优化,适合嵌入式及物联网开发者。在基础驱动上新增…...
git: early EOF
macOS报错: Initialized empty Git repository in /usr/local/Homebrew/Library/Taps/homebrew/homebrew-core/.git/ remote: Enumerating objects: 2691797, done. remote: Counting objects: 100% (1760/1760), done. remote: Compressing objects: 100% (636/636…...

协议转换利器,profinet转ethercat网关的两大派系,各有千秋
随着工业以太网的发展,其高效、便捷、协议开放、易于冗余等诸多优点,被越来越多的工业现场所采用。西门子SIMATIC S7-1200/1500系列PLC集成有Profinet接口,具有实时性、开放性,使用TCP/IP和IT标准,符合基于工业以太网的…...
LangChain【6】之输出解析器:结构化LLM响应的关键工具
文章目录 一 LangChain输出解析器概述1.1 什么是输出解析器?1.2 主要功能与工作原理1.3 常用解析器类型 二 主要输出解析器类型2.1 Pydantic/Json输出解析器2.2 结构化输出解析器2.3 列表解析器2.4 日期解析器2.5 Json输出解析器2.6 xml输出解析器 三 高级使用技巧3…...
深入理解 React 样式方案
React 的样式方案较多,在应用开发初期,开发者需要根据项目业务具体情况选择对应样式方案。React 样式方案主要有: 1. 内联样式 2. module css 3. css in js 4. tailwind css 这些方案中,均有各自的优势和缺点。 1. 方案优劣势 1. 内联样式: 简单直观,适合动态样式和…...