测试学习之——Pytest Day3

引言

Pytest 作为 Python 中最受欢迎的测试框架之一,以其简洁的语法、强大的功能和丰富的插件生态系统,极大地提升了自动化测试的效率和可维护性。在本文中,我们将深入探讨 Pytest 的两大核心特性:Fixture 和插件管理,帮助您更高效地编写和管理您的测试用例。

一、夹具fixture

Fixture 是 Pytest 中一个非常强大的特性,它允许您定义在测试用例执行之前或之后自动运行的代码。这对于设置测试环境(前置操作)和清理测试环境(后置操作)非常有用,例如:

•前置操作:加密参数、启动浏览器、注册并登录账号。

•后置操作:解密结果、关闭浏览器、删除账号。

1. 创建 Fixture

创建 Fixture 非常简单,只需遵循以下步骤:

1.创建一个函数。

2.使用 @pytest.fixture 装饰器装饰该函数。

3.在函数中使用 yield 关键字来分隔前置操作和后置操作。yield 之前的代码是前置操作,yield 之后的代码是后置操作。

import pytest
from datetime import datetime@pytest.fixture
def f():print(datetime.now(), "用例开始执行")# 前置操作yield  # 开始执行测试用例# 后置操作print(datetime.now(), "用例执行结束")

2、使用fixture

1.在用例的参数列表中,添加fixture的名字即可

2.给用例加上一个标记usefixtures

示例:

from datetime import datetimeimport pytest@pytest.fixture
def f():print(datetime.now(),"用例开始执行")#前置操作yield#开始执行测试用例#后置操作print(datetime.now(),"用例执行结束")def test_1(f):pass@pytest.mark.usefixtures("f")
def test_2():

3、 Fixture 高级使用

3.1 自动使用 (autouse)

如果您希望某个 Fixture 自动应用于所有或特定范围内的测试用例,而无需显式地将其作为参数传递或使用 usefixtures 标记,可以使用 autouse=True 参数。

from datetime import datetimeimport pytest@pytest.fixture(autouse= True)
def f():print(datetime.now(),"用例开始执行")#前置操作yield#开始执行测试用例#后置操作print(datetime.now(),"用例执行结束")def test_1():passdef test_2():pass

3.2 依赖使用

Fixture 之间可以存在依赖关系。一个 Fixture 可以通过在其参数列表中声明另一个 Fixture 来使用它。Pytest 会确保被依赖的 Fixture 在依赖它的 Fixture 之前运行。

from datetime import datetimeimport pytest@pytest.fixture
def ff():print("我也是一个fixture,但我被fixture使用")@pytest.fixture(autouse= True)
def f(ff):print(datetime.now(),"用例开始执行")#前置操作yield#开始执行测试用例#后置操作print(datetime.now(),"用例执行结束")def test_1():passdef test_2():pass
  • linux:使用Linux进行编译
  • git:使用git进行版本控制
  • fixture:使用fixture进行前后置自动操作

3.3 返回内容:接口自动化封装

Fixture 可以返回数据,这些数据可以被测试用例或其他 Fixture 接收。这在接口自动化测试中非常有用,例如,一个 Fixture 可以负责登录并返回认证 token,其他测试用例可以直接使用这个 token。

# ... (接上文 f() fixture 定义,假设 yield 123)def test_1(f):print('收到fixture传递的数据', f) # f 将会是 123def test_2():passdef test_3(f, ff):pass

3.4 范围共享 (Scope)

Fixture 默认的作用域是 function,这意味着每个测试函数都会执行一次 Fixture。Pytest 提供了多种作用域,以控制 Fixture 的生命周期:

•function (默认):每个测试函数执行一次。

•class:每个测试类执行一次。

•module:每个模块执行一次。

•package:每个包执行一次。

•session:整个测试会话只执行一次。

使用 scope 参数来指定 Fixture 的作用域。例如,scope="session" 可以让 Fixture 在整个测试会话中只运行一次,这对于启动和关闭数据库连接等耗时操作非常有用。

使用 conftest.py 文件:

conftest.py 文件是 Pytest 中一个特殊的本地插件文件,它可以用来存放 Fixture 和钩子函数,使其在整个项目或特定目录下自动被发现和使用,而无需导入。

def test_1(f):print('收到fixture传递的数据',f)def test_2():pass
def test_3(f,ff):pass
from datetime import datetimeimport pytest@pytest.fixture(scope = "session")
def ff():print("我也是一个fixture,但我被fixture使用")@pytest.fixture(autouse = True,scope = "session")
def f(ff):print(datetime.now(),"用例开始执行")#前置操作yield 123#开始执行测试用例#后置操作print(datetime.now(),"用例执行结束")#python语法允许函数中有多个 yield

运行结果:

当 f 和 ff 都设置为 session 作用域时,它们只会在整个测试会话开始时执行一次前置操作,并在会话结束时执行一次后置操作。

二、Pytest插件管理

Pytest 强大的插件生态系统是其核心优势之一,它极大地扩展了框架的功能。Pytest 插件可以分为两类:

•内置插件:Pytest 框架自带,无需额外安装即可使用。

•第三方插件:由社区开发,需要通过 pip 等工具进行安装。

插件的启动与管理

Pytest 提供了灵活的方式来启用或禁用插件:

•启用插件:使用 -p <plugin_name> 参数。例如,pytest -p no:cache 可以禁用内置的缓存插件。

•禁用插件:使用 -p no:<plugin_name> 参数。例如,pytest -p no:html 可以禁用 pytest-html 插件。

插件使用方式

插件通常通过以下几种方式与 Pytest 集成和交互:

1.命令行参数:许多插件提供额外的命令行参数来控制其行为。

2.配置文件:通过 pytest.ini、pyproject.toml 或 setup.cfg 等配置文件来配置插件。

3.Fixture:插件可以提供自定义的 Fixture,供测试用例使用。

4.Mark:插件可以注册自定义的 mark,用于标记和过滤测试用例。

三、常用第三方插件

Pytest 社区提供了大量实用的第三方插件,以下是一些在实际项目中常用的插件:

1. pytest-html:生成美观的 HTML 测试报告

•用途:将 Pytest 的测试结果生成美观、易读的 HTML 格式报告,方便查看测试概览、详细信息和失败原因。

•安装:

pip install pytest-html

•使用:

•命令行:

pytest --html=report.html --self-contained-html

•配置文件 (pytest.ini):

addopts = --html=report.html --self-contained-html

2. pytest-xdist:分布式并行执行测试

•用途:允许 Pytest 在多个 CPU 核心或远程主机上并行执行测试用例,显著缩短大型测试套件的执行时间。

•安装:

pip install pytest-xdist

•使用:

-n N (N为需要用多少进程)

只有在任务本身耗时较长,超出调用成本很多的时候,才有意义。

分布式执行,有并发问题,资源竞争、乱序。

3. pytest-rerunfailures:失败用例重跑

•用途:在测试用例失败后,自动重新执行失败的用例。这对于处理不稳定测试(例如,由于网络波动或 UI 渲染问题导致的偶发性失败)非常有用。

•安装:

pip install pytest-rerunfailures

•使用:

•--reruns N:指定失败后重跑的次数。

•--reruns-delay N:指定每次重跑之间的等待时间(秒)。

4. pytest-result-log:记录测试结果到日志文件

•用途:将 Pytest 的测试执行结果详细记录到指定的日志文件中,方便后续分析和追踪。

•安装:

pip install pytest-result-log

•使用:主要通过 pytest.ini 配置文件进行设置。

log_file= ./logs/pytest.log
log_file_level= info
log_file_format= %(levelname)-8s %(asctime)s [%(name)s:%(lineno)s] : %(message)s
log_file_date_format= %Y-%m-%d %H:%M:%S;记录用例执行结果
result_log_enable= 1
;记录用例分割线
result_log_separator=1
;分割线等级
result_log_level_separator= warning
;异常信息等级
result_log_level_verbose= info

结论

通过本文的深入学习,您应该对 Pytest 的 Fixture 机制和丰富的插件生态系统有了更全面的理解。Fixture 能够帮助我们更好地管理测试的前置和后置操作,提高测试代码的复用性和可维护性;而各种强大的第三方插件则极大地扩展了 Pytest 的功能,使其能够满足各种复杂的测试需求。

掌握这些 Pytest 的核心特性,将使您在自动化测试的道路上更加得心应手,编写出更高效、更健壮的测试代码。希望本文能对您的 Pytest 学习之旅有所帮助!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/bicheng/89510.shtml
繁体地址,请注明出处:http://hk.pswp.cn/bicheng/89510.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

控制Vue对话框显示隐藏

正确做法 — 使用 Vue 数据驱动控制显隐你不需要手动设置 display: block&#xff0c;因为 Element Plus 的 <el-dialog> 是基于 v-model 或 :visible.sync 控制的。&#x1f527; 修改模板部分&#xff1a;将原来的&#xff1a;<el-dialog title"报文详情"…

直播带货与开源AI智能名片链动2+1模式S2B2C商城小程序:重塑电商营销新格局

摘要&#xff1a;本文聚焦于直播带货对互联网供需关系的深刻影响&#xff0c;分析其如何改变传统电商营销模式&#xff0c;实现从“人找货”到“货找人”的转变。同时&#xff0c;引入开源AI智能名片链动21模式S2B2C商城小程序这一创新概念&#xff0c;探讨其在直播带货背景下的…

Jmeter 性能测试响应时间过长怎么办?

当 JMeter 性能测试中出现 响应时间过长 的问题时&#xff0c;需要从 测试脚本、服务器、网络、JMeter配置 等多方面排查和优化。以下是详细的解决步骤和思路&#xff1a; B站最新性能进阶&#xff0c;学会这些jmeter性能测试技能&#xff0c;更助于正确设计、执行和分析性能测…

COZE官方文档基础知识解读第三期 —— prompt(提示词)

COZE官方文档基础知识解读第三期 —— prompt&#xff08;提示词&#xff09; 对于初步接触PE&#xff08;prompt engineering&#xff09; 的小伙伴们&#xff0c;你们可以去火山方舟提供的prompt工具&#xff0c;用工具&#xff08;其余的prompt网站https://www.promptinggu…

代码随想录算法训练营第三十二天|动态规划理论基础、LeetCode 509. 斐波那契数、70. 爬楼梯、746. 使用最小花费爬楼梯

目录 LeetCode 509. 斐波那契数 70. 爬楼梯 746. 使用最小花费爬楼梯 感想 文档讲解&#xff1a;代码随想录 动态规划&#xff0c;英文&#xff1a;Dynamic Programming&#xff0c;简称DP&#xff0c;如果某一问题有很多重叠子问题&#xff0c;使用动态规划是最有效的。 …

SpringMVC3

一、JSON 与参数传递1.1JSON 是什么- JSON 是字符串&#xff1a;比如 {"name":"zhangsan","password":"123456","age":15} 就是一个 JSON 字符串&#xff0c;它用来在前后端、服务间传递数据。- JSON 库&#xff1a;Fastj…

查看.bin二进制文件的方式(HxD十六进制编辑器的安装)

文章目录Windows 系统上安装 HxD 十六进制编辑器的步骤。**HxD 是一款免费、轻量级的工具&#xff0c;适合查看和编辑 .bin 等二进制文件。****PS:实际安装过程中会发现找不到Windows11的版本&#xff0c;安装windows10的即可&#xff0c;并且没有区别setup版和portable版**安装…

Linux系统性能优化与监控

系统性能优化与监控是保障 Linux 服务器稳定运行的核心技术&#xff0c;涉及 ​​CPU、内存、磁盘 I/O、网络、进程​​ 等多维度的指标分析、问题定位与优化策略。以下从​​监控工具与指标​​、​​常见问题诊断​​、​​优化方法​​三个层面详细讲解&#xff0c;并结合​…

如何在 React + TypeScript 中实现 JSON 格式化功能

如何在 React TypeScript 中实现 JSON 格式化功能 作为前端开发者&#xff0c;我们经常需要处理 JSON 数据。无论是 API 调试、配置文件编辑还是数据转换&#xff0c;能够格式化 JSON 是一项基本但非常有用的技能。本文将详细介绍如何在 React 和 TypeScript 环境中实现 JSON…

Mac连接服务器Docker容器全攻略

苹果电脑( macOS 系统 )连接服务器、配置容器,整体思路和 Linux 终端操作更贴近,以下结合 macOS 特点,详细分步说明,以 Docker 容器 + 常见 Linux 服务器( 如 CentOS、Ubuntu )为例: 一、连接服务器(SSH 方式, macOS 终端原生支持 ) 1. 准备信息 找运维或云平台…

【字节跳动】数据挖掘面试题0019:带货直播间推荐:现在有一个带货的直播间,怎么把它精准地推送给有需要的用户

文章大纲 带货直播间推荐系统:原理、算法与实践 一、推荐系统在带货直播中的重要性 二、数据收集与处理 1. 用户数据 2. 直播间数据 3. 用户行为数据 4. 数据处理与特征工程 三、推荐算法实现 1. 基于内容的推荐 2. 基于协同过滤的推荐 3. 基于知识图谱的推荐 4. 混合推荐算法…

Windows10笔记本电脑开启BIOS

文章目录什么是BIOS一、方案一&#xff1a;快捷键进入二、方案二&#xff08;推荐&#xff09;各品牌快捷键大全什么是BIOS BIOS 全拼为 BasicInputOutputSystem, 即基本输入/输出系统,是计算机中非常基础而且重要的程序。把这一段程序存放在一个不需要电源的记忆体(芯片)中,就…

NFS、iSCSI 和lnmp部署操作

目录 &#xff08;一&#xff09;基础配置 1.NFS服务安装 2.修改配置文件 3.重载配置文件 4.查看共享目录 5.客户端挂载 6.更换共享目录 7.基础实验 &#xff08;二&#xff09;布置lnmp平台 1.php 安装软件 检测 2.连接MySQL 测试 3.软件实施 软件安装配置 &…

Redis深度解析:从缓存原理到高并发实战

第一部分&#xff1a;Redis核心概念与架构设计1.1 Redis本质解析Redis&#xff08;Remote Dictionary Server&#xff09;作为开源的内存数据结构存储系统&#xff0c;其核心价值在于&#xff1a;内存优先架构&#xff1a;数据主要存储在内存中&#xff0c;读写性能达到10万 QP…

【NLP舆情分析】基于python微博舆情分析可视化系统(flask+pandas+echarts) 视频教程 - 微博类别信息爬取

大家好&#xff0c;我是java1234_小锋老师&#xff0c;最近写了一套【NLP舆情分析】基于python微博舆情分析可视化系统(flaskpandasecharts)视频教程&#xff0c;持续更新中&#xff0c;计划月底更新完&#xff0c;感谢支持。今天讲解架构搭建 视频在线地址&#xff1a; 2026…

GD32/STM32嵌入CMSIS-DSP的库(基于Keil)

当你要用到三角函数、开方、矩阵运算等复杂的数学运算时&#xff0c;可以选择用C库的math.h里面的函数&#xff0c;如果要求速度快的话就得用CMSIS-DSP库里面的函数了&#xff0c;因为CMSIS-DSP库充分运用了CM4内核的浮点运算单元&#xff08;若有&#xff09;和DSP相关的指令&…

页面登录阻止浏览器提醒是否保存密码

一、原因 使用input的type"password"类型&#xff0c;浏览器会提醒是否记住密码。 二、解决 取消type"password" 三、实现输入密码*代替 通过input输入框&#xff0c;监听输入值&#xff0c;进行替换成*符号&#xff0c;避免使用input的type"password…

【iOS】dyld加载流程——应用程序的加载

目录 前言 编译过程与动静态库 编译过程 动静态库 dyld &#x1f4cc; 什么是 dyld&#xff1f; dyld_shared_cache: dyld加载流程 _dyld_start dyldbootstrap::start dyld::main() 配置环境变量 共享缓存 主程序的初始化 插入动态库 link主程序 link动态库 弱…

从零开始,手把手教你本地部署Stable Diffusion AI绘画(Win最新版)

本号之前有发过一篇win平台的教程&#xff0c;由于是去年10月发布的&#xff0c;而Al绘画技术发展很快&#xff0c;那篇教程已经有些不适用了&#xff0c;有些同学执行到第二步就出错了。 应广大同学的期望&#xff0c;我更新一版新版详细教程。 一、前言 1.为什么要本地部署…

day21 力扣669. 修剪二叉搜索树 力扣108.将有序数组转换为二叉搜索树 力扣538.把二叉搜索树转换为累加树

修剪二叉搜索树 给你二叉搜索树的根节点 root &#xff0c;同时给定最小边界low 和最大边界 high。通过修剪二叉搜索树&#xff0c;使得所有节点的值在[low, high]中。修剪树 不应该 改变保留在树中的元素的相对结构 (即&#xff0c;如果没有被移除&#xff0c;原有的父代子代关…