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

深入解析 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)表示此位为关闭。 当需要存储位&#xff08…...

国产自主可控新征程:华为原生鸿蒙系统与鲲鹏认证

华为于今年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 …...

【构建工具】现代开发的重要角色

你可能有所听闻构建工具,但是不知道是干什么的,或者是开发中用到了,大概会使用,但是想理解一下具体的工作原理等,那么我将分享一下我对其的理解。【 我将分为两篇来讲解】。 当我们谈到构建工具时,可以把它…...

【Linux系统】—— 初识 shell 与 Linux 中的用户

【Linux系统】—— 初识shell 与 Linux 中的用户 1 Xshell 运行原理1.1 命令行的组成1.2 外壳程序 2 Linux中的用户2.1 两种用户2.2 创建普通用户2.3 用户切换2.3.1 普通->超级2.3.2 超级->普通 3 指令的短暂提权3.1 为什么要提权3.2 sudo 指令3.3 人人都能提权吗 1 Xshe…...

二维码数据集,使用yolov,voc,coco标注,3044张各种二维码原始图片(未图像增强)

二维码数据集,使用yolov,voc,coco标注,3044张各种二维码原始图片(未图像增强) 数据集分割 训练组70% 2132图片 有效集20% 607图片 测试集10% 305图…...

Vue指令

创建项目: vue init webpack 项目名称 element-ui npm i element-ui -saxios npm i axios1.1.3 -S vuex npm i vuex3.6.2 -S vuex持久化 npm i -S vuex-persistedstate4.1.0代理模版 proxyTable: {/api: {target: http://localhost:8081/,changeOrigin: true,pathRe…...

数据保护策略:如何保障重要信息的安全

一、什么是数据安全? 数据安全是保护数字信息免遭盗窃、未经授权的访问和恶意修改的过程。这是一个持续的过程,负责监督信息的收集、存储和传输。 机密性:保护数据免遭未授权方访问。 完整性:保护数据免遭未经授权的修改、损坏…...

Chrome webdriver下载-避坑

WebDriver以原生的方式驱动浏览器,不需要调整环境变量。 一、window版 1.chrome和chromedriver下载地址: Chrome for Testing availability 我下载的是如下两个安装包,解压即可。 2.导包 pip install selenium然后用python代码引用即可…...

递归求最大公约数

#include <stdio.h>// 函数声明 int gcd(int a, int b);int main() {int x, y;printf("请输入两个正整数&#xff1a;");scanf("%d %d", &x, &y);printf("最大公约数是&#xff1a;%d\n", gcd(x, y));return 0; }// 递归求最大公约…...

关于在浏览器里面获取手机方向的事件

先说问题&#xff1a;浏览器有一个自带原生的获取手机方向的事件方法 deviceorientation: https://developer.mozilla.org/en-US/docs/Web/API/DeviceOrientationEvent/DeviceOrientationEvent 这个事件里面有个实例absolute 看名字知道意思吧&#xff0c;对就是绝对坐标的意…...

STM32 出租车计价器系统设计(一) 江科大源码改写

STM32 出租车计价器系统设计 功能目标 驱动步进电机模拟车轮旋转&#xff0c;并实现调速功能。 设置车轮周长和单价&#xff0c;检测车轮转速和运转时间。 计算并显示行驶里程和价格。 硬件材料 28BYJ48 五线四相步进电机和 ULN2003 驱动板模块 测速传感器模块 嵌入式小系统…...

eclipse rcp-创建rcp-创建target

1.创建一个target文件&#xff0c;将其命名为mine-rcp.target 2. 编辑target 2.1 点击add按钮&#xff0c;选中software site 2.2 选择一个software site 打开浏览器。 选择一个合适的eclipse作为基础版本。进入https://download.eclipse.org/eclipse/downloads/https://dow…...

微信小程序--创建一个日历组件

微信小程序–创建一个日历组件 可以创建一个日历组件&#xff0c;来展示当前月份的日期&#xff0c;并支持切换月份的功能。 一、目录结构 /pages/calendarcalendar.wxmlcalendar.scsscalendar.jscalendar.json二、calendar.wxml <view class"calendar"><…...

wordpress主题知更鸟美化/网络优化器下载

struts2提供了从页面直接封装到List的功能&#xff0c;实现起来有两个办法 1.使用泛型定义集合中的对象类型2.配合配置文件定义集合中的对象类型 User.java packageHelloWorld;publicclassUser ...{ private String username; private String password; private…...

类豆瓣的模板wordpress/百度大数据官网

我们在项目中经常会用到一些正则表达式&#xff0c;将常用的正则做个归纳&#xff0c;方便后期查找 正则字符的简要说明 "^" &#xff1a; ^会匹配行或者字符串的起始位置&#xff0c;有时还会匹配整个文档的起始位置 "$" &#xff1a; $会匹配行或字符串的…...

如何做php网站/seo网站自动推广

Java 实例 - 重载方法异常处理以下实例演示了重载方法的异常处理&#xff1a;/*author by w3cschool.ccMain.java*/public class Main {double method(int i) throws Exception{return i/0;}boolean method(boolean b) {return !b;}static double method(int x, double y) thro…...

装修广告做哪个网站最好看/百度开放云平台

一个完整的正则使用过程 #调用re模块&#xff1a; In [11]: import re # re.match(pattern, string)第一个参数是你正则的规则, 第二个参数是检测的字符串&#xff1a; In [12]: are.match(r"redhat","redhathello") In [13]: print a.group() redhat #re…...

网站建设及网络推广/免费广告投放平台

一般在windows电脑中localhost的配置一般都在电脑的C:\Windows\System32\drivers\etc这个路径下​进入后&#xff0c;打开hosts文件通过编辑器或者其他的软件打开&#xff0c;打开后我们可以看到其源码&#xff1a;大家可以看到我在最后一行添加了127.0.0.1 cc.imooc.com 这样…...

5173网站源码/指数基金怎么买才赚钱

Python大本营每日一课大家好&#xff0c;我是营长&#xff0c;上期营长分享了数据科学”的知识点&#xff1a;&#xff0c;不清楚的小伙伴可戳这????每日一课 | 详解抽象之函数本期营长将为大家分享如何快速入门Python开发。这期分享营长邀请的是应书澜&#xff08;深耕 Ja…...