超详细从入门到精通,pytest自动化测试框架实战-fixture多样玩法(九)
目录:导读
- 前言
- 一、Python编程入门到精通
- 二、接口自动化项目实战
- 三、Web自动化项目实战
- 四、App自动化项目实战
- 五、一线大厂简历
- 六、测试开发DevOps体系
- 七、常用自动化测试工具
- 八、JMeter性能测试
- 九、总结(尾部小惊喜)
前言
在编写测试用例,都会涉及到用例执行之前的环境准备工作,和用例执行之后的环境清理工作。
代码版的测试用例也不例外。
pytest自动化测试框架:https://www.bilibili.com/video/BV18K411m7FH/
在自动化测试框架当中,我们也需要编写:
用例执行之前的环境准备工作代码(前置工作代码)
用例执行之后的环境清理工作(后置工作代码)
通常,在自动化测试框架当中,都叫做fixture。
pytest作为python语言的测试框架,它的fixture有2种实现方式。
一种是xunit-style,跟unittest框架的机制非常相似,即setup/teardown系列;
一种是它自己的fixture机制,以@pytest.fixture装饰器来申明。
pytest的fixture实现方式一:xunit-style
pytest的xunit-style有三个级别的fixture:测试模块、测试类、测试函数。
1、测试函数/方法级别:每一个测试函数都会执行的前置和后置。
测试类内部的测试方法:
前置函数名称:setup_method
后置函数名称:teardown_method
模块下的测试函数:
前置函数名称:setup_function
后置函数名称:teardown_function
2、测试类级别:一个测试类只执行一次前置和后置。
前置函数名称:setup_class
后置函数名称:teardown_class
注意:用@classmethod装饰
3、测试模块级别:一个测试模块只执行一次前置和后置。
前置函数名称:setup_module
后置函数名称:teardown_module
from selenium import webdriver
from time import sleep
from random import randintdef setup_module():print("==== 模块级的 setup 操作 ====")def teardown_module():print("==== 模块级的 teardown 操作 ====")def test_random():assert randint(1, 5) == 3class TestWeb:@classmethoddef setup_class(cls):print("==== 测试类级的 setup 操作 ====")@classmethoddef teardown_class(cls):print("==== 测试类级的 teardown 操作 ====")def setup_method(self):print("==== 测试用例级的 setup 操作 ====")self.driver = webdriver.Chrome()def teardown_method(self):print("==== 测试用例级的 teardown 操作 ====")self.driver.quit()def test_search(self):self.driver.get("https://www.baidu.com/")self.driver.find_element_by_id("kw").send_keys("xxxxxx")self.driver.find_element_by_id("su").click()sleep(1)
pytest也支持运行unittest的测试用例。支持unittest以下特性:
@unittest.skip
setUp/tearDown;
setUpClass/tearDownClass;
setUpModule/tearDownModule;
pytest的fixture实现方式二:fixture机制
通过@pytest.fixture装饰器来定义fixture。一个函数被@pytest.fixture装饰,那么这个函数就是fixture。
使用fixture时,分为二个部分:fixture定义、fixture调用。
除此之外,还有fixture的共享机制,嵌套调用机制。
1、定义fixture
fixture通过函数实现;
使用@pytest.fixture进行装饰;
import pytest@pytest.fixture
def init():pass
前置准备工作代码和后置清理工作代码,都写在一个函数里面。
通过yeild关键字,区分前置代码和后置代码 。yeild之前的代码为前置代码,yeild之后的代码为后置代码
在实际应用场景当中,可以只有前置准备工作代码,也可以只有后置清理工作代码。
import pytest@pytest.fixture
def init():print("用例执行之前,执行的代码") # 前置代码 yield print("用例执行之后,执行的代码") # 后置代码@pytest.fixture
def init2():print("用例执行之前,执行的代码") # 只有用例执行之前的前置准备代码@pytest.fixture
def init3():yieldprint("用例执行之后,执行的代码") # 只有用例执行之后的后置清理代码
fixture有4个作用域:测试会话(session)、测试模块(module)、测试类(class)、测试用例(function)
测试会话:pytest执行测试用例的整个过程,称为会话。
比如pytest收集到了100条用例并执行完成,这个过程称为测试会话。
设置fixture的作用域:通过@pytest.fixture(scope=作用域)来设置。默认情况下,scope=function
import pytest# 没有设置scope,默认为测试函数级别。即调用此fixture的测试类/模块/函数下,每个测试函数都会执行一次这个fixture
@pytest.fixture
def init():print("用例执行之前,执行的代码") # 前置代码yieldprint("用例执行之后,执行的代码") # 后置代码# 设置scope为class。调用此fixture的测试类下,只执行一次这个fixture.
@pytest.fixture(scope="class")
def init2():print("用例执行之前,执行的代码") # 只有用例执行之前的前置准备代码# 设置scope为session。autouse表示自动使用。
# 那么在pytest收集用例后,开始执行用例之前会自动化执行这个fixture当中的前置代码,
# 当所有用例执行完成之后,自动化执行这个fixture的后置代码。
@pytest.fixture(scope="session",autouse=True)
def init3():yieldprint("用例执行之后,执行的代码") # 只有用例执行之后的后置清理代
fixture的返回值设置:yeild 返回值
当测试用例当中,要使用fixture里生成的数据时,则需要fixture返回数据。
若有数据返回则:yeild 返回值
import pytest
from selenium import webdriver
from time import sleep# 设置scope为class。调用此fixture的测试类下,只执行一次这个fixture.
@pytest.fixture(scope="class")
def init2():print("==== 测试类下,执行所有用例之前,执行的代码 ====")driver = webdriver.Chrome()yield driver # 返回driver对象print("==== 测试类下,执行所有用例之后,执行的代码 ====")driver.quit()
2、调用fixture
在fixture定义好之后,可以明确:
fixture处理了哪些前置准备工作、哪些后置清理工作
fixture作用在哪个范围 (是测试函数?还是测试类?还是测试会话?还是测试模块?)
在以上2点都定下来了之后,接下来就是,在测试用例当中,根据需要调用不同的fixture。
调用方法有2种:
在测试用例/测试类上面加上:@pytest.mark.usefixture(“fixture的函数名字”);
将fixture函数名,作为测试用例函数的参数;
第2种用法,主要是用参数来接收fixture的返回值,以便在测试用例中使用
第一种方式案例如下:
第二种方式案例如下:
3、conftest.py共享机制
在某些大的业务场景下,很多用例当中,会使用相同的前置准备工作,和后置清理工作。
如果在每个测试模块下,都把前置准备工作,和后置清理工作写一遍,在维护上和优化上讲不够好。
pytest框架提供了一个fixture共享的机制 ,可以让不同的用例模块,使用同一个fixture。这就是conftest.py文件。
conftest.py共享实现
在项目根目录下,创建一个conftest.py文件。
文件名必须是conftest.py,大小写敏感,不可改名字。
conftest.py当中,可以编写多个fixture
在测试用例文件当中,不需要引入conftest.py文件。直接调用fixture的函数名,会自动去conftest.py当中查找的。
conftest.py层级作用域
conftest.py在项目根目录下,则项目下的所有测试用例,均可使用conftest.py中定义的fixture。即项目根目录下的conftest.py,作用域是整个项目。
那,如果,conftest.py当中的fixture,只想在某个python包内可用呢?
conftest.py实现了层级作用域。
简单来说就是:conftest.py 在哪个目录下,此目录下(包含子目录)的所有用例可使用其中的fixture。
如下图:
根目录下的conftest.py里的fixture,无论项目下的哪个用例,都可以使用。
子目录moduleA下的conftest.py里的fixture,只有moduleA下的用例可以使用。
子目录moduleB下的conftest.py里的fixture,只有moduleB下的用例可以使用。
moduleB下的用例文件test_module_b.py中的用例,即可以使用根目录下的conftest.py中的fixuture,又可以使用自己目录下的conftest.py的fixture:
如果出现了同名fixture怎么办呢?
这里涉及到了,测试用例在执行时,调用fixture的顺序。一般来讲,按 就近原则 调用。
测试用例文件中的fixture > 当前目录中的fixture > 上级目录中的fixture > 根目录中的fixture
4、fixture嵌套
fixture不但支持共享 ,还支持嵌套使用。
嵌套使用即:一个fixture,可以做另外一个fixture的参数。
如下图所示:名为init2的fixture,可以作为init的参数。
并且,init当中,将init2的返回值,同样返回。
当在用例当中,调用init时,init会自动去调用init2。
fixture的执行顺序如下:
init2的前置代码;
init的前置代码;
init的后置代码;
init2的后置代码;
下图案例中,init2为class级作用域,init为function级作用域。
下面是我整理的2023年最全的软件测试工程师学习知识架构体系图 |
一、Python编程入门到精通
二、接口自动化项目实战
三、Web自动化项目实战
四、App自动化项目实战
五、一线大厂简历
六、测试开发DevOps体系
七、常用自动化测试工具
八、JMeter性能测试
九、总结(尾部小惊喜)
只要你有梦想,就不要放弃追求;只要你肯努力,就没有克服不了的困难。每一次坚持,都会让你变得更加强大;每一步奋斗,都会让你走向更美好的未来。
只要心怀梦想,勇往直前,即便曲折艰难,也不会停步。每一次挫折都是成长的礼物,每一次努力都是迎接成功的必经之路。让我们用汗水铸就辉煌!
勇敢的追求自己的梦想,不畏艰难险阻;努力拼搏,不屈不挠,才能够走向成功之路。只要我们有信念,有勇气,就可以突破困难,创造属于自己的辉煌!
相关文章:

超详细从入门到精通,pytest自动化测试框架实战-fixture多样玩法(九)
目录:导读前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜)前言 在编写测试用例&…...
OJ练习第70题——困于环中的机器人
困于环中的机器人 力扣链接:1041. 困于环中的机器人 题目描述 在无限的平面上,机器人最初位于 (0, 0) 处,面朝北方。注意: 北方向 是y轴的正方向。 南方向 是y轴的负方向。 东方向 是x轴的正方向。 西方向 是x轴的负方向。 机器人可以接受…...

运行时内存数据区之虚拟机栈——局部变量表
这篇内容十分重要,文字也很多,仔细阅读后,你必定有所收获! 基本内容 与程序计数器一样,Java虚拟机栈(Java Virtual Machine Stack)也是线程私有的,它的生命周期与线程相同。虚拟机栈描述的是Java方法执行的线程内存模型…...

Java中常用算法及示例-分治、迭代、递归、递推、动态规划、回溯、穷举、贪心
场景 1、分治算法的基本思想是将一个计算复杂的问题分成规模较小、计算简单的小问题求解, 然后综合各个小问题,得到最终答案。 2、穷举(又称枚举)算法的基本思想是从所有可能的情况中搜索正确的答案。 3、迭代法(Iterative Method) 无法使用公式一次…...
2个 windows 下的网络测试工具
环境windows 10 64bittcpingtcproute简介TCPing 和 TCProute 都是 windows 下的用于测试 TCP 连接的工具,它们可以帮助用户确定网络连接的可用性和响应时间。TCPing下载地址: https://elifulkerson.com/projects/tcping.phpTCPing 通过向目标主机发送 TC…...
HDU - 4734 -- F(x)
题目如下: For a decimal number x with n digits (AnAn−1An−2...A2A1)(A_nA_{n-1}A_{n-2} ... A_2A_1)(AnAn−1An−2...A2A1), we define its weight as F(x)An∗2n−1An−1∗2n−2...A2∗2A1∗1.F(x) A_n * 2^{n-1} A_{n-1} * 2^{n-2} ... A_2 *…...
【音视频第10天】GCC论文阅读(1)
A Google Congestion Control Algorithm for Real-Time Communication draft-alvestrand-rmcat-congestion-03论文理解 看中文的GCC算法一脸懵。看一看英文版的,找一找感觉。 目录Abstract1. Introduction1.1 Mathematical notation conventions2. System model3.Fe…...

如何进行移动设备资产管理
随着越来越多的移动设备进入和访问组织的企业资源,管理员必须监视和控制对企业数据的访问。与传统工作站不同,传统工作站位于企业的物理工作区内,移动设备从多个位置使用,从而使移动资产管理过程更加复杂。 什么是移动资产管理 …...

使用国密SSL证书,实现SSL/TLS传输层国密改造
密码是保障网络空间安全可信的核心技术和基础支撑,通过自主可控的国产密码技术保护重要数据的安全,是有效提升我国信息安全保障水平的重要举措。因此,我国高度重视商用密码算法的应用并出台相关政策法规,大力推动国产商用密码算法…...
Oracle之增删改(六)
1、插入语句 insert into 表名(列名1,列名2,…) values(值,值,…) insert into 关键字 列名(要插入数据的列),可以省略,省略时表示给表中的每个字段都插入数据 value 赋值关键字 使用这种语法一…...
OJ练习第81题——岛屿数量
岛屿数量 力扣链接:200. 岛屿数量 题目描述 给你一个由 ‘1’(陆地)和 ‘0’(水)组成的的二维网格,请你计算网格中岛屿的数量。 岛屿总是被水包围,并且每座岛屿只能由水平方向和/或竖直方向…...
remote gdb 操作流程
进行gdb调试时,tui可以方便地显示源代码、汇编和寄存器文本窗口。在进入gdb界面后,使用TUI快捷键(ctrlXA)可以打开/关闭tui。 出现"找不到源码"的提示时,可以通过dir加源码路径来设置源码查找路径ÿ…...

STM32基础代码学习G070CB串口透传调试(出厂默认)代码
先下载 一定记得回车换行勾选 可以参考“Quectel_BC260Y-CN_AT命令手册_V1.0.pdf” ATCGMI 查询制造商信息 ATCGMM 查询模块型号 ATCSQ 上报信号质量 ATCGATT? PS 域附着或去附着查看板子是否正常 再激活 ATQIACT1,最后查询ATQIACT? 配置阿里云mqtt atqmtc…...

介绍一款idea神级插件【Bito-ChatGPT】
什么是Bito? Bito是一款在IntelliJ IDEA编辑器中的插件,Bito插件是由ChatGPT团队开发的,它是ChatGPT团队为了提高开发效率而开发的一款工具。ChatGPT团队是一支专注于自然语言处理技术的团队,他们开发了一款基于GPT的自然语言处理…...
pycharm 2021.2.2 版本之前试用期过了怎么办
pycharm 2021.2.2 版本之前试用期过了怎么办 虽然 jetbrains 的产品是商业收费,而且价格不菲,但官方还是为免费使用留下的空间,实在良心。 收费版可以免费试用30天,问题是30天试用期过后,怎么办,可以再次试…...

【通世智库】宁晓红:医疗更完整的样子
2022年的10月,北京协和医院缓和医学中心成立了,这是巨大的好消息!北京协和医院连续13年蝉联中国医院排行榜榜首,它率先成立了缓和医学中心,可见缓和医疗在医学领域的重要地位和不可估量的价值。【作者:宁晓…...

AD20打开PCB后找不到
如出现下图情况 方法1 长按ctrl且滚轮下滑 方法2 依次点击视图 适合文件...
RTC 基础
简单的一个框架 一、上行 1.音频 音频采集->3A处理->混合(麦克风bgm自定义音频)->编码->fec->打网络包(UDT/QUIC/SRT)->加密->socket发送 2.视频 视频采集->编码->切片->fec->打网络包(UDT/QUIC/SRC)->加密->socket发送 二、下行…...
Quaternion插值方法
介绍 unity,四元数Quaternion插值方法介绍 方法 线性插值(Lerp): 适用范围:适用于需要简单平滑地过渡的情况,比如物体的位置、大小等。 优点:计算简单,效率高。 缺点:不…...
如何配置Stash以便与4EVERLAND一起使用
What is Stash? AppsCode的Stash是一个可靠的工具,用于备份和恢复Kubernetes卷和应用程序。有了Stash,你可以通过定期备份和在数据丢失或系统故障时恢复这些数据来轻松保护你的宝贵数据。Stash功能多样,可用于备份各种Kubernetes资源的数据…...

【JVM】- 内存结构
引言 JVM:Java Virtual Machine 定义:Java虚拟机,Java二进制字节码的运行环境好处: 一次编写,到处运行自动内存管理,垃圾回收的功能数组下标越界检查(会抛异常,不会覆盖到其他代码…...

【2025年】解决Burpsuite抓不到https包的问题
环境:windows11 burpsuite:2025.5 在抓取https网站时,burpsuite抓取不到https数据包,只显示: 解决该问题只需如下三个步骤: 1、浏览器中访问 http://burp 2、下载 CA certificate 证书 3、在设置--隐私与安全--…...

涂鸦T5AI手搓语音、emoji、otto机器人从入门到实战
“🤖手搓TuyaAI语音指令 😍秒变表情包大师,让萌系Otto机器人🔥玩出智能新花样!开整!” 🤖 Otto机器人 → 直接点明主体 手搓TuyaAI语音 → 强调 自主编程/自定义 语音控制(TuyaAI…...

QT: `long long` 类型转换为 `QString` 2025.6.5
在 Qt 中,将 long long 类型转换为 QString 可以通过以下两种常用方法实现: 方法 1:使用 QString::number() 直接调用 QString 的静态方法 number(),将数值转换为字符串: long long value 1234567890123456789LL; …...
聊一聊接口测试的意义有哪些?
目录 一、隔离性 & 早期测试 二、保障系统集成质量 三、验证业务逻辑的核心层 四、提升测试效率与覆盖度 五、系统稳定性的守护者 六、驱动团队协作与契约管理 七、性能与扩展性的前置评估 八、持续交付的核心支撑 接口测试的意义可以从四个维度展开,首…...
大语言模型(LLM)中的KV缓存压缩与动态稀疏注意力机制设计
随着大语言模型(LLM)参数规模的增长,推理阶段的内存占用和计算复杂度成为核心挑战。传统注意力机制的计算复杂度随序列长度呈二次方增长,而KV缓存的内存消耗可能高达数十GB(例如Llama2-7B处理100K token时需50GB内存&a…...

R语言速释制剂QBD解决方案之三
本文是《Quality by Design for ANDAs: An Example for Immediate-Release Dosage Forms》第一个处方的R语言解决方案。 第一个处方研究评估原料药粒径分布、MCC/Lactose比例、崩解剂用量对制剂CQAs的影响。 第二处方研究用于理解颗粒外加硬脂酸镁和滑石粉对片剂质量和可生产…...

Netty从入门到进阶(二)
二、Netty入门 1. 概述 1.1 Netty是什么 Netty is an asynchronous event-driven network application framework for rapid development of maintainable high performance protocol servers & clients. Netty是一个异步的、基于事件驱动的网络应用框架,用于…...
虚拟电厂发展三大趋势:市场化、技术主导、车网互联
市场化:从政策驱动到多元盈利 政策全面赋能 2025年4月,国家发改委、能源局发布《关于加快推进虚拟电厂发展的指导意见》,首次明确虚拟电厂为“独立市场主体”,提出硬性目标:2027年全国调节能力≥2000万千瓦࿰…...

uniapp 小程序 学习(一)
利用Hbuilder 创建项目 运行到内置浏览器看效果 下载微信小程序 安装到Hbuilder 下载地址 :开发者工具默认安装 设置服务端口号 在Hbuilder中设置微信小程序 配置 找到运行设置,将微信开发者工具放入到Hbuilder中, 打开后出现 如下 bug 解…...