当前位置: 首页 > article >正文

pytest自动化中关于使用fixture是否影响用例的独立性

第一个问题:难道使用fixture 会影响用例独立吗?

✅ 简单回答:
使用 fixture ≠ 不独立。
只要你的 fixture 是每次测试都能自己运行、自己产生数据的,那么测试用例依然是“逻辑独立”的。

✅ 怎么判断 fixture 是否影响独立性?

情况是否影响独立性说明
fixture 中 硬编码共享数据(如共享 token)❌ 是耦合的多个用例依赖同一数据,顺序或状态会影响结果
fixture 每次调用都能 重新生成独立数据✅ 不影响比如每个测试都生成新 token、新用户
fixture 被多个用例共享,且包含有状态操作❌ 可能影响比如 fixture 中做了前置清理,多个测试共享它就有影响
fixture 被一个用例专用✅ 安全就像把准备步骤封装起来,依然独立

📌 示例一:✅ 独立的 fixture(没问题)

pythonimport pytest
import requests@pytest.fixture
def valid_token():# 每次都调用登录接口,获取新 tokenresponse = requests.post("http://example.com/api/login", json={"username": "testuser","password": "123456"})assert response.status_code == 200return response.json()["token"]def test_user_info(valid_token):headers = {"Authorization": f"Bearer {valid_token}"}resp = requests.get("http://example.com/api/user/info", headers=headers)assert resp.status_code == 200

✔️ 这个 valid_token fixture 每次都是“自给自足”的,不依赖其他测试状态,所以仍然是独立用例。

⚠️ 示例二:❌ 有耦合风险的 fixture

python# 假设 login_fixture 中手动生成了 token 或写死一个 token
@pytest.fixture(scope="session")
def shared_token():return "abc1234567"  # 固定写死,或者由前置用例创建def test_user_info(shared_token):...

这个 shared_token fixture:

  • 不一定来自当前测试生成

  • 可能是别的用例产生或初始化时产生的

    🛑 这种就存在耦合风险。如果别的地方修改了 token 或状态,可能影响这个用例。

✅ 最佳实践建议:

做法推荐程度理由
每个用例内部写登录逻辑👍 简单但冗余少量可接受✅ 保证测试完全独立,无需依赖外部状态或 fixture,适合初学或用例量较少时
用 fixture 封装登录,但每次自动重新登录✅ 最推荐✅ 实现代码复用 + 独立性兼顾,每个用例拿到的 token 都是最新、唯一、干净的
共享全局 token、session 作为 fixture⚠️ 仅限于性能优化场景,否则不推荐⚠️ 存在用例状态耦合、测试顺序依赖等风险,若 token 被修改或过期会影响所有用例

📌 总结一句话:

只要 fixture 是“每个用例都能独立用”的工具,它就是帮助测试保持独立的;只有当它变成“多个测试共用的状态容器”,才会破坏独立性。

第二个问题:那scope="session"这种级别的都是耦合的吗?

✅ 简短回答:
不是所有 scope=“session” 的 fixture 都导致耦合,关键在于你放了什么内容进去。

🧠 深入理解:fixture 的 scope 只是控制“生命周期”,不等于是否“耦合”。

scope 值生命周期举例
“function”每个用例都执行一次(默认)最独立、最干净
“class”每个类只执行一次类内测试共享
“module”每个测试文件只执行一次跨函数共享
“session”整个测试执行过程只执行一次所有用例共享,最广

✅ 所以:是否“耦合”,取决于 fixture 内部内容是否有状态 / 会变化 / 受上下文影响

📌 下面通过具体例子来解释:

✅ 安全的 session 级别 fixture(无耦合)

python# 这是一个静态配置类 fixture,和用例无状态相关
@pytest.fixture(scope="session")
def base_url():return "http://example.com/api"

✔️ 这个不会耦合,因为它只是一个静态值,多个用例共享没有问题。

⚠️ 有耦合风险的 session 级别 fixture(含状态)

python@pytest.fixture(scope="session")
def shared_token():# 登录一次,所有用例共用resp = requests.post("http://example.com/api/login", json={"username": "testuser", "password": "123456"})return resp.json()["token"]

🛑 如果某个测试改变了用户状态(比如禁用账号、修改密码),其它测试就会失败。这就是“隐性耦合”。

✅ 推荐做法(平衡独立性 & 性能):

✅ 方案一:默认使用 function scope,保持测试独立性

python@pytest.fixture
def fresh_token():# 每个用例登录一次,独立、干净...

✅ 方案二:使用 session,但只放“无状态的共享配置”

python@pytest.fixture(scope="session")
def env_config():return {"base_url": "http://example.com/api","headers": {"Content-Type": "application/json"}}

🔚 总结一句话:

scope=“session” 本身不是坏事,但如果 fixture 中包含用户态、系统态、会变的内容,就可能导致耦合问题。配置类 OK,状态类要谨慎。

相关文章:

pytest自动化中关于使用fixture是否影响用例的独立性

第一个问题:难道使用fixture 会影响用例独立吗? ✅ 简单回答: 使用 fixture ≠ 不独立。 只要你的 fixture 是每次测试都能自己运行、自己产生数据的,那么测试用例依然是“逻辑独立”的。 ✅ 怎么判断 fixture 是否影响独立性&a…...

Token与axios拦截器

目录 一、Token 详解 1. Token 的定义与作用 2. Token 的工作流程 3. Token 的优势 4. Token 的安全实践 5. JWT 结构示例 二、Axios 拦截器详解 1. 拦截器的作用 2. 请求拦截器 3. 响应拦截器 4. 拦截器常见场景 5. 移除拦截器 三、完整代码示例 四、总结 五、…...

unity3d实现物体闪烁

unity3d实现物体闪烁,代码如下: using UnityEngine;public class Test : MonoBehaviour {//创建一个常量,用来接收时间的变化值private float shake;//通过控制物体的MeshRenderer组件的开关来实现物体闪烁的效果private MeshRenderer BoxColliderClick…...

C#—Lazy<T> 类型(延迟初始化/懒加载模式)

C# 的 Lazy<T> 类型 Lazy<T> 是 C# 中的一个类&#xff0c;用于实现延迟初始化&#xff08;懒加载&#xff09;模式。它提供了一种线程安全的方式来延迟创建大型或资源密集型对象&#xff0c;直到第一次实际需要时才进行初始化。 主要特点 延迟初始化&#xff1a…...

Spring Boot 项目启动命令解析

Spring Boot 项目启动命令参数 一、启动命令基础格式 java [JVM参数] [Spring Boot参数] -jar your-project.jar必选部分&#xff1a;java -jar your-project.jar 启动可执行 JAR 包。 可选部分&#xff1a; JVM 参数&#xff1a;控制 Java 虚拟机行为&#xff08;如内存、垃…...

为什么 Docker 容器中有额外的目录(如 `/dev`、`/proc`、`/sys`)?及 `docker run` 详细执行过程

、当你使用 docker run 启动一个基于极简镜像&#xff08;如 scratch 或手动构建的镜像&#xff09;的容器时&#xff0c;发现容器内出现了 /dev、/proc、/sys 等目录&#xff0c;即使你的镜像中并未包含这些目录。这是因为 Docker 在启动容器时&#xff0c;会自动挂载一些必要…...

Tailwind 武林奇谈:bg-blue-400 失效,如何重拾蓝衣神功?

前言 江湖有云,Tailwind CSS,乃前端武林中的轻功秘籍。习得此技,排版如行云流水,配色似御风随形,收放自如,随心所欲。 某日,小侠你奋笔敲码,正欲施展“蓝衣神功”(bg-blue-400),让按钮怒气冲冠、蓝光满面,怎料一招使出,画面竟一片白茫茫大地真干净,毫无半点杀气…...

【Docker 运维】Java 应用在 Docker 容器中启动报错:`unable to allocate file descriptor table`

文章目录 一、根本原因二、判断与排查方法三、解决方法1、限制 Docker 容器的文件描述符上限2、在执行脚本中动态设置ulimit的值3、升级至 Java 11 四、总结 容器内执行脚本时报错如下&#xff0c;Java 进程异常退出&#xff1a; library initialization failed - unable to a…...

开始放飞之先搞个VSCode

文章目录 开始放飞之先搞个VSCode重要提醒安装VSCode下载MinGW-w64回到VSCode中去VSCode原生调试键盘问题遗留问题参考文献 开始放飞之先搞个VSCode 突然发现自己的新台式机上面连个像样的编程环境都没有&#xff0c;全是游戏了&#xff01;&#xff01;&#xff01;&#xff…...

基于SA模拟退火算法的车间调度优化matlab仿真,输出甘特图和优化收敛曲线

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.本算法原理 5.完整程序 1.程序功能描述 基于SA模拟退火算法的车间调度优化matlab仿真,输出甘特图和优化收敛曲线。输出指标包括最小平均流动时间&#xff0c;最大完工时间&#xff0c;最小间隙时间。 2…...

【仿Mudou库one thread per loop式并发服务器实现】SERVER服务器模块实现

SERVER服务器模块实现 1. Buffer模块2. Socket模块3. Channel模块4. Poller模块5. EventLoop模块5.1 TimerQueue模块5.2 TimeWheel整合到EventLoop5.1 EventLoop与线程结合5.2 EventLoop线程池 6. Connection模块7. Acceptor模块8. TcpServer模块 1. Buffer模块 Buffer模块&…...

基于Redis实现高并发抢券系统的数据同步方案详解

在高并发抢券系统中&#xff0c;我们通常会将用户的抢券结果优先写入 Redis&#xff0c;以保证系统响应速度和并发处理能力。但数据的最终一致性要求我们必须将这些结果最终同步到 MySQL 的持久化库中。本文将详细介绍一种基于线程池 Redis Hash 扫描的异步数据同步方案&#…...

SPL 量化 序言

序言 量化交易是通过数学模型、统计学方法和计算机技术&#xff0c;将市场行为转化为可执行的交易策略的自动化投资方式。其核心是通过大数据分析、机器学习和金融工程等技术&#xff0c;从历史数据中挖掘市场规律&#xff0c;预测价格趋势并生成交易信号。 量化交易的实现通…...

【LLM Prompt】CoT vs.ToT

CoT&#xff08;Chain of Thought&#xff09; Definition: CoT refers to the method of prompting a language model to generate responses in a step-by-step manner, explicitly showing the reasoning process leading to the final answer.定义: CoT 是一种提示语言模型…...

uniapp h5接入地图选点组件

uniapp h5接入地图选点组件 1、申请腾讯地图key2、代码接入2.1入口页面 &#xff08;pages/map/map&#xff09;templatescript 2.2选点页面&#xff08;pages/map/mapselect/mapselect&#xff09;templatescript 该内容只针对uniapp 打包h5接入地图选点组件做详细说明&#x…...

【Rust 精进之路之第13篇-生命周期·进阶】省略规则与静态生命周期 (`‘static`)

系列: Rust 精进之路:构建可靠、高效软件的底层逻辑 作者: 码觉客 发布日期: 2025年4月20日 引言:让编译器“读懂”你的意图——省略的艺术 在上一篇【生命周期入门】中,我们理解了生命周期的必要性——它是 Rust 编译器用来确保引用有效性、防止悬垂引用的关键机制。我…...

OSI模型和传输过程

OSI模型概述 OSI&#xff08;Open Systems Interconnection&#xff09;模型是由国际标准化组织&#xff08;ISO&#xff09;提出的一个概念性框架&#xff0c;用于标准化网络通信功能。它将网络通信分为七层&#xff0c;每一层负责特定的功能&#xff0c;并通过接口与相邻层交…...

MySQL-CASE WHEN条件语句

介绍 MySQL 中的一种流程控制语法结构&#xff0c;用于在 SQL 查询中实现条件逻辑。它允许你根据一个或多个条件的真假来返回不同的值。可以根据某些条件对数据进行分类或者转换。 使用方式 简单 CASE 表达式 CASE input_expressionWHEN when_expression THEN result_expre…...

【随缘更新,免积分下载】Selenium chromedriver驱动下载(最新版135.0.7049.42)

目录 一、chromedriver概述 二、chromedriver使用方式 三、chromedriver新版本下载&#x1f525;&#x1f525;&#x1f525; 四、Selenium与Chrome参数设置&#x1f525;&#x1f525; 五、Selenium直接操控已打开的Chrome浏览器&#x1f525;&#x1f525;&#x1f525;…...

jenkins批量复制Job项目的shell脚本实现

背景 现在需要将“测试” 目录中的所有job全部复制到 一个新目录中 test2。可以结合jenkins提供的apilinux shell 进行实现。 测试目录的实际文件夹名称是 test。 脚本运行效果如下&#xff1a; [qdevsom5f-dev-hhyl shekk]$ ./copy_jenkins_job.sh 创建文件夹 test2 获取源…...

iOS Google登录

iOS Google登录 SDK下载地址在 Firebase 有下载&#xff0c;要下载整个SDK文件&#xff0c;然后拿其中的Google 登录SDK来使用 Firebase 官方文档 github 下载链接...

嵌入式工程师( C / C++ )笔试面试题汇总

注&#xff1a;本文为 “嵌入式工程师笔试面试题” 相关文章合辑。 未整理去重。 如有内容异常&#xff0c;请看原文。 嵌入式必会 C 语言笔试题汇总 Z 沉浮 嵌入式之旅 2021 年 01 月 19 日 00:00 用预处理指令 #define 声明一个常数&#xff0c;用以表明 1 年中有多少秒&a…...

重构便携钢琴专业边界丨特伦斯便携钢琴V30Pro定义新一代便携电钢琴

在便携电钢琴领域&#xff0c;特伦斯推出的V30Pro折叠钢琴以"技术革新场景适配"的双重升级引发关注。这款产品不仅延续了品牌标志性的折叠结构&#xff0c;更通过声学系统重构与智能交互优化&#xff0c;重新定义了便携乐器的专业边界。 ▶ 核心特点&#xff1a;技术…...

DiffuRec: A Diffusion Model for Sequential Recommendation

DiffuRec: A Diffusion Model for Sequential Recommendation Background 序列推荐&#xff08;Sequential Recommendation, SR&#xff09;领域&#xff0c;主流方法是将用户与物品表示为fixed embedding。然而&#xff0c;这种静态向量表达方式难以全面刻画用户多样化的兴趣…...

多模态大语言模型arxiv论文略读(三十三)

Jailbreaking Attack against Multimodal Large Language Model ➡️ 论文标题&#xff1a;Jailbreaking Attack against Multimodal Large Language Model ➡️ 论文作者&#xff1a;Zhenxing Niu, Haodong Ren, Xinbo Gao, Gang Hua, Rong Jin ➡️ 研究机构: Xidian Univer…...

IntelliJ IDEA download JDK

IntelliJ IDEA download JDK 自动下载各个版本JDK&#xff0c;步骤 File - Project Structure &#xff08;快捷键 Ctrl Shift Alt S&#xff09; 如果下载失败&#xff0c;换个下载站点吧。一般选择Oracle版本&#xff0c;因为java被Oracle收购了 好了。 花里胡哨&#…...

计算机网络——常见的网络攻击手段

什么是XSS攻击&#xff0c;如何避免? XSS 攻击&#xff0c;全称跨站脚本攻击&#xff08;Cross-Site Scripting&#xff09;&#xff0c;这会与层叠样式表(Cascading Style Sheets, CSS)的缩写混淆&#xff0c;因此有人将跨站脚本攻击缩写为XSS。它指的是恶意攻击者往Web页面…...

Android动态化技术优化

Android动态化技术优化 一、WebView优化基础 1.1 WebView性能瓶颈 初始化耗时内存占用高页面加载慢白屏问题1.2 WebView基本配置 class OptimizedWebView : WebView {init {// 开启硬件加速setLayerType(LAYER_TYPE_HARDWARE, null...

面向对象设计中的类的分类:实体类、控制类和边界类

目录 前言1. 实体类&#xff08;Entity Class&#xff09;1.1 定义和作用1.2 实体类的特点1.3 实体类的示例 2. 控制类&#xff08;Control Class&#xff09;2.1 定义和作用2.2 控制类的特点2.3 控制类的示例 3. 边界类&#xff08;Boundary Class&#xff09;3.1 定义和作用3…...

鸿蒙ArkUI实战之TextArea组件、RichEditor组件、RichText组件、Search组件的使用

本文接上篇继续更新ArkUI中组件的使用&#xff0c;本文介绍的组件有TextArea组件、RichEditor组件、RichText组件、Search组件&#xff0c;这几个组件的使用对应特定场景&#xff0c;使用时更加需要注意根据需求去使用 TextArea组件 官方文档&#xff1a; TextArea-文本与输…...