深入解析 Pytest 中的 conftest.py:测试配置与复用的利器
在 Pytest 测试框架中,conftest.py 是一个特殊的文件,用于定义测试会话的共享配置和通用功能。它是 Pytest 的核心功能之一,可以用于以下目的:
【主要功能】
1、定义共享的 Fixture
(1)conftest.py 文件可以存放常用的测试前置(fixture)代码,供同目录下或子目录中的测试用例直接使用,而无需显式导入。
参考前面的文章:全面解析 pytest fixture:使用方法、实战技巧与最佳实践-CSDN博客
(2)fixture 是 pytest 用来管理测试用例依赖的核心机制,可以用于设置测试前后需要的做的内容(通过yield实现),例如,启动appium server、启动app等。
参考前面的文章:全面解析 pytest fixture:使用方法、实战技巧与最佳实践-CSDN博客
2、自定义钩子函数(Hooks)
(1)Pytest 提供了一系列的钩子(Hooks)函数,用于扩展测试框架行为。例如:
a. 在测试会话开始或结束时执行特定代码,下面是iOS UI自动化每条用例执行结束后,如果failed会截一张图,并附加到allure报告中,并且把当次执行的结果passed、failed、skipped输出到日志中:
@pytest.hookimpl(tryfirst=True, hookwrapper=True)
def pytest_runtest_makereport(item, call):outcome = yieldrep = outcome.get_result()if rep.when == 'call':if rep.failed:logger.error(f"Test {item.nodeid}: FAILED\n")driver = item.funcargs['ios_driver']screenshot_path = take_screenshot(driver)with open(screenshot_path, 'rb') as image_file:allure.attach(image_file.read(), name='测试未通过截图', attachment_type=allure.attachment_type.PNG)if call.excinfo:error_message = str(call.excinfo.value)logger.error(f"Test {item.nodeid} failed with error: {error_message}\n")elif rep.skipped:outcome_status = 'SKIPPED'logger.info(f"Test {item.nodeid}: {outcome_status}\n")else:outcome_status = 'PASSED'logger.info(f"Test {item.nodeid}: {outcome_status}\n")
b. 修改收集测试用例的行为。
(2)这些钩子函数通常也会放在 conftest.py 中。
3、参数化和共享配置
可以在 conftest.py 中为多个测试用例设置公共的参数化数据或共享变量或者通过conftest.py 集中管理其他fixture,例如,在本次的iOS UI自动化项目中,把用到的设备数据单独放在了test_data_fixture.py中,数据格式如下,在conftest.py中引用test_data_fixture.py,通过 conftest.py 来集中管理所有 fixture,避免了在每个测试文件中都需要导入多个 fixture 文件:
# conftest.pyfrom test_data_fixture import *
# test_data_fixture.py# 设备数据
@pytest.fixture(scope="module")
def device_data(request):from network_request import get_dev_name_over_requestdev_model = request.paramdev_name = get_dev_name_over_request(dev_model)if dev_model == 'CCC':result = clear_sandbox_log('iPhoneX')return {'iphone_model': 'iPhoneX','sn': 'CCC2DA110012345','dev_model': 'CCC','dev_name': dev_name,'sleep_time': 25}elif dev_model == 'LLL':result = clear_sandbox_log('iPhoneX')return {'iphone_model': 'iPhoneX','sn': 'CCC2DA110012345','dev_model': 'CCC','dev_name': dev_name,'sleep_time': 35}else:raise ValueError("Unknown device model: {}".format(dev_model))
4、灵活的作用域控制
通过设置 fixture 的作用域(function、class、module 或 session),可以让它们在不同层次的测试中共享,减少冗余。
参考前面的文章:全面解析 pytest fixture:使用方法、实战技巧与最佳实践-CSDN博客
5、层级作用域
每个目录都可以有自己的 conftest.py,这些文件会在测试运行时自动被发现,且只会作用于其所在目录及子目录中的测试用例。
【conftest.py 的加载规则】
1、不需要显式导入,pytest 会自动发现 conftest.py 文件。
2、每个目录下的 conftest.py 仅影响该目录及其子目录的测试用例。
3、同名的 fixture 或配置会覆盖上层目录的内容。
示例 1:共享 Fixture
目录结构
project/
│
├── conftest.py
├── tests/
│ ├── test_login.py
│ ├── test_dashboard.py
# conftest.pyimport pytest# 定义一个共享的 Fixture
@pytest.fixture(scope="session")
def setup_environment():print("\nSetting up the environment")yieldprint("\nTearing down the environment")
# test_login.pydef test_login(setup_environment):# 测试用例会自动调用 `setup_environment` Fixtureprint("\nRunning login test")assert 1 == 1
# test_hahahah.pydef test_hahahah(setup_environment):# 测试用例会自动调用 `setup_environment` Fixtureprint("\nRunning hahahah test")assert 2 == 2
$ pytest -s
Setting up the environment
Running login test
.
Running hahahah test
.
Tearing down the environment
【注意事项】
1、避免在 conftest.py 中包含业务逻辑
conftest.py 应该仅用于配置和工具代码,不建议放置实际的测试逻辑。
2、fixture 名称避免冲突
如果在多个 conftest.py 文件中定义了同名的 fixture,pytest 会根据目录层级覆盖上层目录的定义。
3、调试时避免命名冲突
如果测试用例或模块中定义了与 conftest.py 中同名的 fixture,pytest 优先使用本地的 fixture。
【总结】
conftest.py 是 Pytest 中一个用于集中管理共享配置的工具,可以极大地提高测试代码的可维护性和复用性。对于复杂的测试框架来说,合理使用 conftest.py 是非常关键的一部分。
相关文章:
深入解析 Pytest 中的 conftest.py:测试配置与复用的利器
在 Pytest 测试框架中,conftest.py 是一个特殊的文件,用于定义测试会话的共享配置和通用功能。它是 Pytest 的核心功能之一,可以用于以下目的: 【主要功能】 1、定义共享的 Fixture (1)conftest.py 文件可…...
JAVA |日常开发中Websocket详解
JAVA |日常开发中Websocket详解 前言一、Websocket 概述1.1 定义1.2 优势 二、Websocket 协议基础2.1 握手过程2.2 消息格式2.3 数据传输方式 三、Java 中使用 Websocket3.1 Java WebSocket API(JSR - 356)3.2 第三方库(如 Tyrus&…...
Typora教程
目录 一、下载安装 二、激活 1.激活 2.解决激活提示窗口 一、下载安装 去官网下载Typora安装,我的是1.9.5版本 二、激活 1.激活 根据路径找到Typora/resources/page-dist/static/js 使用记事本打开LicenseIndex文件,如下图: 按住快捷…...
泛微E9常见API保姆级详解!!!!
前言 在泛微前端开发过程中,虽然大部分是对流程以及流程逻辑的调整,但是还是会有一些小的个性化需求是需要借助JS来实现的。 比如:对同一组数据,前后变化不一样时,需要对这组变化后的数据进行标红处理;对提…...
UniApp配置使用原子化tailwindcss
参考视频 创建项目 新建项目选择uniapp - vue版本这里我选择3 - 点击创建即可 创建完成后,如果是要编译到小程序的项目则可以先将项目运行到小程序打开了 初始化package.json 执行 npm init -y安装和配置 安装 npm i -D tailwindcss postcss autoprefixer # 安…...
02. Docker:安装和操作
目录 一、Docker的安装方式 1、实验环境准备 1.1 关闭防火墙 1.2 可以访问网络 1.3 配置yum源 2、yum安装docker 2.1 安装docker服务 2.2 配置镜像加速 2.3 启动docker服务 3、二进制安装docker 3.1 下载或上传安装包并解压 3.2 配置使用systemctl管理 3.3 配置镜像…...
【MySQL中多表查询和函数】
目录 1.多表查询 1.1 外键 1.2 链接查询 2.MySQL函数 内置函数简介 数值函数 字符串函数 时间日期函数 条件判断操作 开窗函数 1.多表查询 本质:把多个表通过主外键关联关系链接(join)合并成一个大表,在去单表查询操作…...
加速科技精彩亮相ICCAD 2024
12月11日—12日 ,中国集成电路设计业的年度盛会——ICCAD 2024在上海世博馆隆重举行。本次活动以“智慧上海,芯动世界”为主旨,汇聚了众多业界精英,共同探讨集成电路产业的未来。作为半导体测试行业领军企业,加速科技携…...
免费下载 | 2024算网融合技术与产业白皮书
《2024算网融合技术与产业白皮书(2023年)》的核心内容概括如下: 算网融合发展概述: 各国细化算网战略,指引行业应用创新升级。 算网融合市场快速增长,算力互联成为投资新热点。 算网融合产业模式逐渐成型…...
Ubuntu系统下部署大语言模型:Ollama和OpenWebUI实现各大模型的人工智能自由
之前在window下安装过 Ollama和OpenWebUI搭建本地的人工智能web项目(可以看我之前写的文章),无奈电脑硬件配置太低,用qwen32b就很卡,卡出PPT了,于是又找了一台机器安装linux系统,在linux系统下测试一下速度能否可以快一些。 系统硬件介绍 Ubuntu 22.04.4 LTS CPU: i5…...
基于Mybatis,MybatisPlus实现数据库查询分页功能
基于Mybatis,MybatisPlus实现数据库查询分页功能 目录 基于Mybatis,MybatisPlus实现数据库查询分页功能使用Mybatis插件实现分页数据库准备分页插件配置和使用常用数据: 使用MybatisPlus插件实现分页数据库准备分页插件配置和使用自定义分页查…...
【razor】echo搭配relay功能分析
echo 要搭配relay 实现作者说relay在linux上跑,可以模拟丢包、延迟目前没看到如何模拟。relay监听9200,有俩作用 echopeer1 发relay,replay 把peer1的包给peer2 ,实现p2p能力。 接收端:采集后发送发给relay的 接收端的地址就是自己,的地址就是本地的9200,因此是让relay接…...
技术文档的定义和规范,以及技术文档模板参考
技术文档是指用于记录、传达和共享技术信息的文档,通常涵盖系统设计、开发过程、用户指南、维护手册等内容。技术文档的质量直接影响到项目的可维护性、可扩展性和团队的协作效率。以下是技术文档的定义和一些规范: 一、定义 技术文档是用于描述产品、系…...
基于windows环境使用nvm安装多版本nodejs
目录 前言 一、卸载node 二、nvm是什么? 三、nvm安装 1.官网下载 nvm 包 2. 安装nvm-setup.exe 3. 配置路径和下载镜像 4. 检查安装是否完成 四、 使用nvm安装node 五、修改npm默认镜像源为淘宝镜像 六、环境变量配置 1. 新建目录 2. 设置环境变量 七…...
力扣9. 回文数
给你一个整数 x ,如果 x 是一个回文整数,返回 true ;否则,返回 false 。 回文数 是指正序(从左向右)和倒序(从右向左)读都是一样的整数。 例如,121 是回文,而…...
C#—BitArray点阵列
C#—BitArray点阵列 在 C# 中,BitArray 类用来管理一个紧凑型的位值数组,数组中的值均为布尔类型,其中 true(1)表示此位为开启,false(0)表示此位为关闭。 当需要存储位(…...
国产自主可控新征程:华为原生鸿蒙系统与鲲鹏认证
华为于今年10月22日在深圳正式发布了其原生鸿蒙系统HarmonyOS NEXT。这是我国首个实现全栈自研的操作系统,标志着中国在操作系统领域取得了突破性进展。HarmonyOS NEXT 5.0的发布,使得鸿蒙操作系统成为继苹果iOS和安卓系统之后的全球第三大移动操作系统&…...
esxi8 虚拟机使用ubuntu22模板后 没有ip配置文件,只有ipv6链接正常使用
esxi8 虚拟机使用模板后 没有ip配置文件,只有ipv6链接正常使用,/etc/NetworkManager/system-connections配置下没有配置文件 只有/etc/netplan/有文件 sudo ip addr add 192.168.1.9/24 dev ens35 # 临时设置ip, 接口名ens35 sudo vi /et…...
【Qualcomm】IPQ5018查看连接终端RSSI、SNR、NF方法
IPQ5018 简介 IPQ5018 是高通(Qualcomm)公司推出的一款面向网络设备的系统级芯片(SoC)。它通常用于路由器、接入点和其他网络设备中,提供高性能的无线网络连接。以下是关于 IPQ5018 的一些关键特性和功能: 关键特性 高性能处理器 IPQ5018 集成了多核 CPU,通常是 ARM …...
【构建工具】现代开发的重要角色
你可能有所听闻构建工具,但是不知道是干什么的,或者是开发中用到了,大概会使用,但是想理解一下具体的工作原理等,那么我将分享一下我对其的理解。【 我将分为两篇来讲解】。 当我们谈到构建工具时,可以把它…...
基于大模型的 UI 自动化系统
基于大模型的 UI 自动化系统 下面是一个完整的 Python 系统,利用大模型实现智能 UI 自动化,结合计算机视觉和自然语言处理技术,实现"看屏操作"的能力。 系统架构设计 #mermaid-svg-2gn2GRvh5WCP2ktF {font-family:"trebuchet ms",verdana,arial,sans-…...
Debian系统简介
目录 Debian系统介绍 Debian版本介绍 Debian软件源介绍 软件包管理工具dpkg dpkg核心指令详解 安装软件包 卸载软件包 查询软件包状态 验证软件包完整性 手动处理依赖关系 dpkg vs apt Debian系统介绍 Debian 和 Ubuntu 都是基于 Debian内核 的 Linux 发行版ÿ…...
大型活动交通拥堵治理的视觉算法应用
大型活动下智慧交通的视觉分析应用 一、背景与挑战 大型活动(如演唱会、马拉松赛事、高考中考等)期间,城市交通面临瞬时人流车流激增、传统摄像头模糊、交通拥堵识别滞后等问题。以演唱会为例,暖城商圈曾因观众集中离场导致周边…...
【第二十一章 SDIO接口(SDIO)】
第二十一章 SDIO接口 目录 第二十一章 SDIO接口(SDIO) 1 SDIO 主要功能 2 SDIO 总线拓扑 3 SDIO 功能描述 3.1 SDIO 适配器 3.2 SDIOAHB 接口 4 卡功能描述 4.1 卡识别模式 4.2 卡复位 4.3 操作电压范围确认 4.4 卡识别过程 4.5 写数据块 4.6 读数据块 4.7 数据流…...
React19源码系列之 事件插件系统
事件类别 事件类型 定义 文档 Event Event 接口表示在 EventTarget 上出现的事件。 Event - Web API | MDN UIEvent UIEvent 接口表示简单的用户界面事件。 UIEvent - Web API | MDN KeyboardEvent KeyboardEvent 对象描述了用户与键盘的交互。 KeyboardEvent - Web…...
spring:实例工厂方法获取bean
spring处理使用静态工厂方法获取bean实例,也可以通过实例工厂方法获取bean实例。 实例工厂方法步骤如下: 定义实例工厂类(Java代码),定义实例工厂(xml),定义调用实例工厂ÿ…...
CocosCreator 之 JavaScript/TypeScript和Java的相互交互
引擎版本: 3.8.1 语言: JavaScript/TypeScript、C、Java 环境:Window 参考:Java原生反射机制 您好,我是鹤九日! 回顾 在上篇文章中:CocosCreator Android项目接入UnityAds 广告SDK。 我们简单讲…...
多种风格导航菜单 HTML 实现(附源码)
下面我将为您展示 6 种不同风格的导航菜单实现,每种都包含完整 HTML、CSS 和 JavaScript 代码。 1. 简约水平导航栏 <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport&qu…...
【碎碎念】宝可梦 Mesh GO : 基于MESH网络的口袋妖怪 宝可梦GO游戏自组网系统
目录 游戏说明《宝可梦 Mesh GO》 —— 局域宝可梦探索Pokmon GO 类游戏核心理念应用场景Mesh 特性 宝可梦玩法融合设计游戏构想要素1. 地图探索(基于物理空间 广播范围)2. 野生宝可梦生成与广播3. 对战系统4. 道具与通信5. 延伸玩法 安全性设计 技术选…...
React---day11
14.4 react-redux第三方库 提供connect、thunk之类的函数 以获取一个banner数据为例子 store: 我们在使用异步的时候理应是要使用中间件的,但是configureStore 已经自动集成了 redux-thunk,注意action里面要返回函数 import { configureS…...
