全网最详细,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的…...
【根据当天日期输出明天的日期(需对闰年做判定)。】2022-5-15
缘由根据当天日期输出明天的日期(需对闰年做判定)。日期类型结构体如下: struct data{ int year; int month; int day;};-编程语言-CSDN问答 struct mdata{ int year; int month; int day; }mdata; int 天数(int year, int month) {switch (month){case 1: case 3:…...
超短脉冲激光自聚焦效应
前言与目录 强激光引起自聚焦效应机理 超短脉冲激光在脆性材料内部加工时引起的自聚焦效应,这是一种非线性光学现象,主要涉及光学克尔效应和材料的非线性光学特性。 自聚焦效应可以产生局部的强光场,对材料产生非线性响应,可能…...
C++中string流知识详解和示例
一、概览与类体系 C 提供三种基于内存字符串的流,定义在 <sstream> 中: std::istringstream:输入流,从已有字符串中读取并解析。std::ostringstream:输出流,向内部缓冲区写入内容,最终取…...
招商蛇口 | 执笔CID,启幕低密生活新境
作为中国城市生长的力量,招商蛇口以“美好生活承载者”为使命,深耕全球111座城市,以央企担当匠造时代理想人居。从深圳湾的开拓基因到西安高新CID的战略落子,招商蛇口始终与城市发展同频共振,以建筑诠释对土地与生活的…...
云原生安全实战:API网关Kong的鉴权与限流详解
🔥「炎码工坊」技术弹药已装填! 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 一、基础概念 1. API网关(API Gateway) API网关是微服务架构中的核心组件,负责统一管理所有API的流量入口。它像一座…...
2025年渗透测试面试题总结-腾讯[实习]科恩实验室-安全工程师(题目+回答)
安全领域各种资源,学习文档,以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各种好玩的项目及好用的工具,欢迎关注。 目录 腾讯[实习]科恩实验室-安全工程师 一、网络与协议 1. TCP三次握手 2. SYN扫描原理 3. HTTPS证书机制 二…...
6个月Python学习计划 Day 16 - 面向对象编程(OOP)基础
第三周 Day 3 🎯 今日目标 理解类(class)和对象(object)的关系学会定义类的属性、方法和构造函数(init)掌握对象的创建与使用初识封装、继承和多态的基本概念(预告) &a…...
comfyui 工作流中 图生视频 如何增加视频的长度到5秒
comfyUI 工作流怎么可以生成更长的视频。除了硬件显存要求之外还有别的方法吗? 在ComfyUI中实现图生视频并延长到5秒,需要结合多个扩展和技巧。以下是完整解决方案: 核心工作流配置(24fps下5秒120帧) #mermaid-svg-yP…...
数据结构:递归的种类(Types of Recursion)
目录 尾递归(Tail Recursion) 什么是 Loop(循环)? 复杂度分析 头递归(Head Recursion) 树形递归(Tree Recursion) 线性递归(Linear Recursion)…...
深入理解 React 样式方案
React 的样式方案较多,在应用开发初期,开发者需要根据项目业务具体情况选择对应样式方案。React 样式方案主要有: 1. 内联样式 2. module css 3. css in js 4. tailwind css 这些方案中,均有各自的优势和缺点。 1. 方案优劣势 1. 内联样式: 简单直观,适合动态样式和…...
