全网最详细,Pytest自动化测试框架-Fixture固件实战,你要的都有...
目录:导读
- 前言
- 一、Python编程入门到精通
- 二、接口自动化项目实战
- 三、Web自动化项目实战
- 四、App自动化项目实战
- 五、一线大厂简历
- 六、测试开发DevOps体系
- 七、常用自动化测试工具
- 八、JMeter性能测试
- 九、总结(尾部小惊喜)
前言
什么是固件
Fixture 翻译成中文即是固件的意思。
它其实就是一些函数,会在执行测试方法/测试函数之前(或之后)加载运行它们,常见的如接口用例在请求接口前数据库的初始连接,和请求之后关闭数据库的操作。
pytest 中提供了功能更加丰富的Fixture,用于实现setup、teardown功能。
定义方式
使用@pytest.fixture()进行定义,简单示例如下:
import pytest@pytest.fixture()
def before():print("连接数据库")
调用方式:
调用单个fixture函数
方式一:使用fixture函数名作为参数
import pytest@pytest.fixture()
def before():print("连接数据库")# 调用before
def test_01(before):print("执行test_01")
方式二:使用 @pytest.mark.usefixtures(‘fixture函数名’)装饰器
import pytest@pytest.fixture()
def before():print("连接数据库")# 调用before
@pytest.mark.usefixtures('before')
def test_01():print("执行test_01")
方式三:使用autouse参数自动执行fixture函数
import pytest# fixture函数定义的时候使用autouse参数,作用域范围内的测试用例会自动调用该fixture函数
@pytest.fixture(autouse=True)
def before():print("连接数据库")# 自动调用before
def test_01():print("执行test_01")
三种方式调用后的结果都如下:

我们可以看到,先执行了fixture函数,再执行测试函数。
1、调用多个fixture函数
import pytest@pytest.fixture()
def before():print("连接数据库")@pytest.fixture()
def before_s():print("初始化数据")def test_01(before, before_s):print("执行test_01")
调用多个 fixture 函数时,由前至后依次执行,所以test_01()调用时先执行before,再执行before_s。
2、对fixture函数重命名
定义fixture函数时,可以利用name参数进行重命名,方便用于调用,示例如下:
import pytest@pytest.fixture(name='db')
def connect_order_db():print("连接数据库")def test_01(db):print("执行test_01")
使用fixture传递测试数据
在执行完fixture函数后,有时需要将该fixture中得到到某些数据传递给测试函数/测试方法,用于后续的执行。
fixture中提供普通传递和参数化传递两种数据传递方式。
1、普通传递
示例如下:
import pytest@pytest.fixture()
def before():print("连接数据库")return "连接成功!"def test_01(before):print("执行test_01")assert before == "连接成功!"
注意,如果自定义的fixture函数有返回值,需要使用上面说的方式一调用才能获取fixture函数的返回值并传入测试函数中,方式二就无法获取返回值。
2、参数化传递
对fixture函数进行参数化时,需要使用参数params,并且需要传入参数request,简单示例如下:
import pytesttest_params = [1, 2, 0]
@pytest.fixture(params=test_params)
def before(request):result = request.paramreturn resultdef test_02(before):print("执行test_02")assert beforeif __name__ == '__main__':pytest.main()
执行结果:

可以看到,因为所调用的fixture函数进行了参数化,虽然只有一个测试函数但执行了3次。
conftest.py
上面我们举的例子都是把fixture函数放在测试用例模块里面,但如果很多测试模块需要引用同一个fixture函数怎么办,这是时候就需要把它放在命名为conftest的模块里,这样同级或以下目录中的测试用例便能调用这些自定义的fixture函数。
例如,有如下目录:
├─testcase
│ │
│ ├─test_module_01
│ │ test_case_1.py
│ │ test_case_2.py
│ │
│ ├─test_module_02
│ │ test_case_3.py
test_module_01 中的test_case_1.py与test_case_2.py都需要调用同一个 fixture 函数,那么我们只需要在 test_module_01 中新建conftest.py并编写这个fixture函数即可,示例如下:
├─testcase
│ │
│ ├─test_module_01
│ │ conftest.py
│ │ test_case_1.py
│ │ test_case_2.py
│ │
│ ├─test_module_02
│ │ test_case_3.py
conftest.py:
import pytest@pytest.fixture(autouse=True)
def before():print("连接数据库")
test_case_1.py:
def test_01():print("执行test_01")
test_case_2.py:
def test_02():print("执行test_02")
这样,执行这两个模块的测试用例时会自动先去调用conftest.py中的before()函数。
假设 test_module_02 中的 test_case_3.py 也需要调用这个before()函数,那么这个时候我们就需要在上一层即 testcase 中新建conftest.py并编写这个before()函数,才能在 test_case_3.py 中调用,如下:
├─testcase
│ │ conftest.py
│ │
│ ├─test_module_01
│ │ conftest.py
│ │ test_case_1.py
│ │ test_case_2.py
│ │
│ ├─test_module_02
│ │ test_case_3.py
conftest.py只作用于同级或以下目录中的测试模块,且需要注意,当以下层级中存在了另一个conftest.py,那么以下层级将由另一个conftest.py文件接管。
作用域
pytest 的 fixture 作用域分session、module、class、function四个级别。在定义 fixture 函数的时候通过scope参数指定作用范围,默认为function。
session,每次会话执行一次
module,每个测试模块执行一次
class,每个测试类执行一次
function,每个测试方法执行一次
注意:对于单独定义的测试函数,class、function 都会起作用,可以从下列示例中看出来。
测试目录结构如下:
├─apiAutoTest
│ │ run.py
│ │
│ ├─testcase
│ │ │ conftest.py
│ │ │
│ │ ├─test_module_02
│ │ │ │ conftest.py
│ │ │ │ test_case_3.py
│ │ │ │ test_case_4.py
其中conftest.py代码如下:
import pytest@pytest.fixture(scope="session", autouse=True)
def session_fixture():print("这是一个作用于session的fixture")@pytest.fixture(scope="module", autouse=True)
def module_fixture():print("这是一个作用于module的fixture")@pytest.fixture(scope="class", autouse=True)
def class_fixture():print("这是一个作用于class的fixture")@pytest.fixture(scope="function", autouse=True)
def function_fixture():print("这是一个作用于function的fixture")
test_case_3.py代码如下:
import pytestclass TestOrder:def test_a(self):print("test_a")def test_b(self):print("test_b")def test_c():print("test_c")
test_case_4.py代码如下:
def test_e():print("test_e")
run.py代码如下:
import pytestif __name__ == '__main__':pytest.main(["-s"])
运行run.py,结果如下:
collected 4 itemstestcase\test_module_02\test_case_3.py
这是一个作用于session的fixture
这是一个作用于module的fixture
这是一个作用于class的fixture
这是一个作用于function的fixture
test_a
.这是一个作用于function的fixture
test_b
.这是一个作用于class的fixture
这是一个作用于function的fixture
test_c
.
testcase\test_module_02\test_case_4.py
这是一个作用于module的fixture
这是一个作用于class的fixture
这是一个作用于function的fixture
test_e
.============================== 4 passed in 0.04s ==============================
从结果可以看出来:
作用于session的fixture函数只在所有测试用例执行之前调用了一次;
作用于module的fixture函数在每个测试模块执行之前调用了一次;
作用于class的fixture函数在每个测试类执行之前调用了一次;
作用于function的fixture函数在每个测试方法/测试函数执行之前调用了一次;
注意:在定义的测试函数(如test_c()、test_e())执行之前也会调用scope=class的fixture函数。
与 unittest 框架比较,pytest 中的Fixture更加丰富,可扩展性更高。
Fixture还有很多更加优雅的用法用于自动化测试项目中。
| 下面是我整理的2023年最全的软件测试工程师学习知识架构体系图 |
一、Python编程入门到精通

二、接口自动化项目实战

三、Web自动化项目实战

四、App自动化项目实战

五、一线大厂简历

六、测试开发DevOps体系

七、常用自动化测试工具

八、JMeter性能测试

九、总结(尾部小惊喜)
每一次跌倒都是为了更高的飞翔,每一次挫折都是为了更坚强的成长。不惧困难,不畏艰险,勇往直前追逐梦想。坚持奋斗,超越自己,终将引领辉煌的人生之巅!
不管前方有多少艰险和困难,只要心中燃着梦想的火焰,就有无限的力量去闯荡。勇往直前,坚持不懈,唯有奋斗才能书写出属于自己的辉煌篇章!
愿你的内心燃起坚定的火焰,迎接挑战,超越极限。不论前路多坎坷,披荆斩棘,只有拼搏奋斗,才能创造出属于自己的辉煌人生。相信自己,永远不言放弃!
相关文章:
全网最详细,Pytest自动化测试框架-Fixture固件实战,你要的都有...
目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 什么是固件 Fixt…...
React 入门学习
React 入门 一、基本认识1.1、前言1.2、什么是1.3、编译<br>1.4、特点1.5、高效 二、React环境和基本使用2.1、环境搭建2.2、脚手架项目基本使用2.2.1、src2.2.2、public2.2.3、package.json 三、JSX的理解和使用四、模块与模块化, 组件与组件化的理解4.1、模块与组件4.2…...
VMware vCenter 6.5 断电后无法启动修复方案
目录 第1章 前言 第2章 问题现象 第3章 解决方案 第4章、Tips 第1章 前言 本文主要介绍VMware vcsa 6.5由于电源异常/存储异常之后无法启动,进入磁盘自检模式处理方法。(最近遇到类似情况比较多,Citrix Xenserver也遇到了,后来…...
c++ STL--算法,迭代器,容器适配器,仿函数
c STL–算法,迭代器,容器适配器,仿函数 一.算法 1.使用的头文件为 #include<algorithm>//以这个头文件为主 #include<numeric>2.关于算法一些功能的使用 1.遍历 void fun1(int x) {cout << x << " "…...
springcloud3 bus+springconfig 实现配置文件的动态刷新(了解)
一 springcloud Bus的作用 1.1 springcloud的作用 spring cloud bus是用来将分布式系统的节点与轻量级消息系统链接起来的框架。 它整合了java的事件处理机制和消息中间件的功能。其中目前支持RabbitMQ和kafka 简介: bus实现多个服务的配置文件动态刷新。 1.2 …...
SpringMVC的架构有什么优势?——视图与模型(二)
前言 「作者主页」:雪碧有白泡泡 「个人网站」:雪碧的个人网站 「推荐专栏」: ★java一站式服务 ★ ★ React从入门到精通★ ★前端炫酷代码分享 ★ ★ 从0到英雄,vue成神之路★ ★ uniapp-从构建到提升★ ★ 从0到英雄ÿ…...
Vue中实现图片懒加载简单说明
1.安装 npm i vue-lazyload1.2.6 2.导入 import VueLazyload from "vue-lazyload"; 3.注册插件 说明:main.js文件 import imgs_src from "src" Vue.use(VueLazyload, {// 懒加载默认图片loading:"imgs_src" }); 4.前台 说明:vue文…...
zookeeper案例
目录 案例一:服务器动态上下线 服务端: (1)先获取zookeeper连接 (2)注册服务器到zookeeper集群: (3)业务逻辑(睡眠): 服务端代码…...
项目中使用git vscode GitHubDesktopSetup-x64
一、使用git bash 1.使用git bash拉取gitee项目 1.在本地新建一个文件夹(这个文件夹是用来存放从gitee上拉下来的项目的) 2.在这个文件夹右键选择 git bash here 3.输入命令 git init (创建/初始化一个新的仓库) 4.输入命令 git remote add origin …...
【Linux操作系统】文件描述符fd
🔥🔥 欢迎来到小林的博客!! 🛰️博客主页:✈️林 子 🛰️博客专栏:✈️ Linux之路 🛰️社区 :✈️ 进步学堂 …...
【RocketMQ入门-安装部署与Java API测试】
【RocketMQ入门-安装部署与Java API测试】 一、环境说明二、安装部署三、Java API 编写Producer和Consumer进行测试四、小结 一、环境说明 虚拟机VWMare:安装centos7.6操作系统源码包:rocketmq-all-5.1.3-source-release.zip单master部署,在…...
SystemVerilog之覆盖率详解
文章目录 1.0 覆盖率前言1.1 覆盖率类型1.2 覆盖策略及覆盖组1.3 覆盖率数据采样1.3.1 bin的创建与使用1.3.2 条件覆盖率1.3.3 翻转覆盖率1.3.4 wildcard覆盖率1.3.5 忽略bin与非法bin 1.4 交叉覆盖率1.4.1 排除部分cross bin1.4.2 精细化交叉覆盖率1.4.3 单个实例的覆盖率1.4.…...
Qt Designer设计的界面如何显示、即运行显示窗口界面
首先利用Qt Designer设计.ui文件,然后采用Tools->External Tools->PyUIC转换成.py文件。这个.py文件是.ui文件编译而来的,将这种文件由.ui文件编译而来的.py文件称之为界面文件。由于界面文件每次编译时候都会初始化,所以需要新建一个.…...
vue3的setup的使用和原理解析
setup是Vue 3中引入的一个新的组件选项。它是一个在组件实例创建之前被调用的函数,用于设置组件的初始状态、计算属性、方法等。setup函数是Vue 3中函数式组件的核心部分,它提供了一种新的方式来编写组件逻辑。 使用setup函数有以下几个步骤:…...
Spring boot中的线程池-ThreadPoolTaskExecutor
一、jdk的阻塞队列: 二、Spring boot工程的有哪些阻塞队列呢? 1、默认注入的ThreadPoolTaskExecutor 视频解说: 线程池篇-springboot项目中的service层里简单注入ThreadPoolTaskExecutor并且使用_哔哩哔哩_bilibili 程序代码:…...
pgsql checkpoint机制(1)
检查点触发时机 检查点间隔时间由checkpoint_timeout设置pg_xlog中wall段文件总大小超过参数max_WAL_size的值postgresql服务器在smart或fast模式下关闭手动checkpoint 为什么需要检查点? 定期保持修改过的数据块作为实例恢复时起始位置(问题…...
微信小程序 map地图(轨迹)
allMarkers效果图 废话少说直接上马(最后是我遇到的问题) cover-view是气泡弹窗,可以自定义弹窗,要配合js:customCallout,如果是非自定义的话:callout(可以修改颜色、边框宽度、圆角…...
【钉钉接口】bpms_task_change、bpms_instance_change 的区别及举例
bpms_task_change:审批任务回调,是针对审批任务状态的推送。如审批人执行审批、审批人转交审批等针对具体某个审批节点的操作,属于 bpms_task_change 事件类型。bpms_instance_change:审批实例回调,是针对审批实例状态…...
vue左右div结构手动拉伸并且echarts图表根据拉伸宽高自适应
需求: 左右结构的div,可以根据数据抬起按下进行拉伸修改容器宽度的操作给左右结构某一图表设置拉伸自适应左右结构都设置个最小宽度,只能到一定区域内拉伸解决echarts的bug(重复加载chart实例):[ECharts] …...
开发工具Eclipse的使用
🥳🥳Welcome Huihuis Code World ! !🥳🥳 接下来看看由辉辉所写的关于Eclipse使用的相关操作吧 目录 🥳🥳Welcome Huihuis Code World ! !🥳🥳 一.Eclipse是什么 二.使用Eclipse的…...
Step3-VL-10B-Base模型部署避坑指南:解决C盘空间不足与依赖冲突
Step3-VL-10B-Base模型部署避坑指南:解决C盘空间不足与依赖冲突 最近有不少朋友在尝试部署Step3-VL-10B-Base这个视觉语言大模型时,遇到了两个特别头疼的问题。一个是刚跑起来没多久,C盘就飘红了,系统提示空间不足;另…...
Python 协程任务取消机制解析
Python 协程任务取消机制解析 在现代异步编程中,Python的协程(Coroutine)凭借其轻量级和高效率成为处理并发任务的重要工具。协程任务的取消机制却常被开发者忽视,导致资源泄露或程序逻辑异常。本文将从多个角度解析Python协程任…...
如何在普通PC上体验macOS?黑苹果长期维护机型EFI完全指南
如何在普通PC上体验macOS?黑苹果长期维护机型EFI完全指南 【免费下载链接】Hackintosh Hackintosh long-term maintenance model EFI and installation tutorial 项目地址: https://gitcode.com/gh_mirrors/ha/Hackintosh 你是否渴望在普通PC上体验macOS的优…...
【粉丝福利社】从“找资料”到“资料找我”:OpenClaw如何让信息搜集效率翻倍?
💎【行业认证权威头衔】 ✔ 华为云天团核心成员:特约编辑/云享专家/开发者专家/产品云测专家 ✔ 开发者社区全满贯:CSDN博客&商业化双料专家/阿里云签约作者/腾讯云内容共创官/掘金&亚马逊&51CTO顶级博主 ✔ 技术生态共建先锋&am…...
CefFlashBrowser:Flash内容兼容性一站式终极解决方案
CefFlashBrowser:Flash内容兼容性一站式终极解决方案 【免费下载链接】CefFlashBrowser Flash浏览器 / Flash Browser 项目地址: https://gitcode.com/gh_mirrors/ce/CefFlashBrowser 当Flash技术正式退出历史舞台,那些曾经承载着无数人童年回忆的…...
【医学影像AI合规生死线】:2026奇点大会联合NMPA、FDA、EMA发布的全球首个可解释性审计框架(含6类高风险误判溯源模板)
第一章:2026奇点智能技术大会:医学影像分析 2026奇点智能技术大会(https://ml-summit.org) 临床级模型推理流水线设计 大会首次发布开源框架MediFlow v2.1,专为多模态医学影像(CT、MRI、超声)实时推理优化。该框架支…...
Python 网络爬虫技术应用详解
1. 引言* 1.1 网络爬虫概述* 定义:什么是网络爬虫?* 核心目的:自动化地从互联网上获取、提取和存储信息。 * 1.2 Python 在爬虫领域的优势* 丰富的库和框架(Requests, BeautifulSoup, Scrapy 等)。* 语法简…...
Obsidian新库配置不同步?3分钟搞定插件和主题迁移(附详细路径)
Obsidian新库配置迁移全指南:一键同步插件与主题设置 刚在Obsidian里新建了一个知识库,却发现所有插件和主题设置都消失了?这种"从零开始"的挫败感我太熟悉了。作为一款以Markdown为核心的笔记工具,Obsidian的插件生态是…...
视频合并工具多合一版使用说明:批量合并视频/自定义命名/片头片尾/转场/硬件加速与并行转码
【视频合并工具多合一版】基于 FFmpeg 实现视频合并与转码,支持拖拽导入、排序、批量合并(按文件夹分组)、片头片尾、转场效果(含“保持原始时长”模式)、GPU 硬件加速(NVENC/QSV/AMF)、并行转码…...
c#如何使用ModbusRTU_c#ModbusRTU快速上手实战教程
串口参数不匹配是90%“读不到数据”的主因,需严格同步波特率、数据位、停止位、校验位;Modbus地址需换算(如40001→0);务必使用SerialPortStream替代SerialPort;CRC不可重复计算,且响应后须手动…...
