pytest自动化测试两种执行环境切换的解决方案
目录
一、痛点分析
方法一:Hook方法pytest_addoption注册命令行参数
1、Hook方法注解
2、使用方法
方法二:使用插件pytest-base-url进行命令行传参
一、痛点分析
在实际企业的项目中,自动化测试的代码往往需要在不同的环境中进行切换,比如多套测试环境、预上线环境、UAT环境、线上环境等等,并且在DevOps理念中,往往自动化都会与Jenkins进行CI/CD,不论是定时执行策略还是迭代测试,那么问题来了,难道每次切换环境都需要提供一套测试代码?或者每次切换都要需修改我们的自动化环境配置?答案当然不是,不然怎么能叫测试自动化呢! 在未使用pytest的Hook相关方法之前,切换环境我们一般会使用python的内置模块sys,它有一个argv的方法,可以从我们的命令行接收参数,通过它也可以实现上面的需求,就像如下部分代码这样:
try:if sys.argv[1] == '-p':# 预上线环境conf_url.write_value(filename=CONFIGS_FILE_PATH_URL,data=p_api_address)modify_properties_url(filename=ENVIRONMENT_PROPERTIES_PATH,url=p_api_address["request"]["url"])elif sys.argv[1] in [f't{i}' for i in range(1, 8)]:# 测试环境conf_url.write_value(filename=CONFIGS_FILE_PATH_URL,data=test_api_address(sys.argv[1][1:]))modify_properties_url(filename=ENVIRONMENT_PROPERTIES_PATH,url=test_api_address(sys.argv[1][1:])["request"]["url"])else:case_logger.error("Please confirm the environmental information.")print("Please confirm the environmental information.")raise Exception
except IndexError:# 生产环境conf_url.write_value(filename=CONFIGS_FILE_PATH_URL,data=formal_api_address)modify_properties_url(filename=ENVIRONMENT_PROPERTIES_PATH,url=formal_api_address["request"]["url"])
这种方式我们需要使用 "python xxx.py -p" 这种方式进行环境切换,然后再执行pytest命令行去执行测试用例,但是这种方法能在pytest的命令行中使用吗?能不能将环境切换的命令行也集成到pytest的命令行中,执行整个自动化项目只使用一条命令行呢?
方法一:Hook方法pytest_addoption注册命令行参数
1、Hook方法注解
- pytest_addoption:可以让用户注册一个自定义的命令行参数,方便用户将数据传递给 pytest
- 这个 Hook 方法一般和内置 fixture pytestconfig 配合使用
- pytest_addoption 注册命令行参数,pytestconfig 通过配置对象读取参数的值
2、使用方法
1.一般编写到conftest.py文件中
2.定义pytest_addoption方法注册pytest命令行参数,函数名和参数保持一致
def pytest_addoption(parser):"""注册自定义参数 env 到配置对象"""parser.addoption("--env", action="store",default="https://www.cnblogs.com/",help="将命令行参数 ’--env' 添加到 pytest 配置中")
parser.addoption参数说明:
- name:自定义命令行参数的名字,可以是:"xx", "-xx" 或 "--xx"
- action:在命令行中遇到此参数时要采取的基本操作类型
- - store:默认,只存储参数的值,可以存储任何类型的值,此时 default 也可以是任何类型的值,而且命令行参数多次使用也只能生效一个,最后一个值覆盖之前的值
- - append:存储一个列表,用 append 模式将可以同时多次使用自定义参数,并且 default 默认值必须是一个列表,pytest 会把 default 默认参数的值和多个自定义参数的值放在一个列表中
- - store_const:用 const 为命令行参数指定一个常量值,必须和 const 参数同时使用,使用这个模式后命令行参数不能赋值
- - append_const:存储一个列表,使用 const 为命令行参数指定一个常量值,并将 default 默认值和 const 常量值添加到列表中,这个模式可以同时多次使用自定义参数,但是还是不能赋值,只能使用常量
- nargs:应该使用的命令行参数的数量
- const:某些操作和nargs选择所需的常量值
- default:如果参数的值不在命令行中,则使用默认值
- type:可以是 python 的基础类型,比如:int,str,float,list 等类型,如果不指定类型的话,pytest会把接受到的参数值都默认为 str 类型,所以我们有时需要指定参数的类型,在使用 type 指定类型时,也需要把 default 的类型修改为同样的类型!
- choices:choices 可以指定几个值,自定义参数必须在这几个值中选择一个,否则会报错
- required:命令行选项是否可以省略(仅可选)
- help:对参数作用的简要说明
- metavar:用法消息中参数的名称
- dest:要添加到 parse_args() 返回的对象中的属性的名称
3.使用request.config.getoption("--命令行")获取命令行参数的值
@pytest.fixture(scope="session")
def get_env(request):"""从配置对象中读取自定义参数的值"""return request.config.getoption("--env")
4.fixture继承,进行环境切换
@pytest.fixture(autouse=True) def set_env(get_env):"""将自定义参数的值写入全局配置文件"""with open(ENV_TXT_FILE, 'w', encoding='utf-8') as f:f.write(get_env)
5.通过pytest命令行传参一键化实现环境切换和测试用例执行


方法二:使用插件pytest-base-url进行命令行传参
1.安装pytest-base-url
pip install pytest-base-url -i https://pypi.douban.com/simple
2.将base_url参数传入到fixture函数中
@pytest.fixture
def driver_setup(base_url):try:URL = base_urlstart_chrome(URL, options=browser_options(), headless=False)driver = get_driver()except Exception as e:log.error(e)else:yield driver
3.pytest命令行传参
使用 --base-url https://www.xxx.com/ 形式传参
pytest --base-url https://www.cnblogs.com/
第一种不局限于环境切换,任何想通过pytest命令行传入自定义的参数都可以通过方法一实现,因此杀鸡焉用牛刀,环境切换优先推荐方法二!
这可能是B站最详细的pytest自动化测试框架教程,整整100小时,全程实战!!!
相关文章:
pytest自动化测试两种执行环境切换的解决方案
目录 一、痛点分析 方法一:Hook方法pytest_addoption注册命令行参数 1、Hook方法注解 2、使用方法 方法二:使用插件pytest-base-url进行命令行传参 一、痛点分析 在实际企业的项目中,自动化测试的代码往往需要在不同的环境中进行切换&am…...
说说TIME_WAIT和CLOSE_WAIT区别
分析&回答 TCP协议规定,对于已经建立的连接,网络双方要进行四次握手才能成功断开连接,如果缺少了其中某个步骤,将会使连接处于假死状态,连接本身占用的资源不会被释放。网络服务器程序要同时管理大量连接…...
Docker的优势
Docker是一种开源的容器化平台,提供了一种将应用程序、库和其它依赖项封装在容器中的方法。以下是Docker的基本概念和优势: 基本概念: 镜像:一个Docker镜像是一个可运行的软件包,包括应用程序、库和其它依赖项。它是D…...
C++——string使用
string的常见构造接口 string() 构造空的srting类对象,空字符串 string(const char* str) 用字符串初始化 string(const string& str)拷贝构造,使用string类初始化string(size_t n, char c) 用n个字符c初始化 string s1; string s2("hello …...
10. selenium API (二)
目录 1. 多层框架/窗口定位 2. 下拉框处理 2.1 前端界面 2.2 代码 3. 针对 alert 弹窗进行操作 3.1 前端界面 3.2 代码 4. 文件提交 4.1 前端界面 4.2 代码 5. 显示等待 6. 操作浏览器滚动条 7. 截图 8. 浏览器关闭 9. 窗口切换 在上篇文章中,我们学…...
[国产MCU]-W801开发实例-用户报文协议(UDP)数据接收和发送
用户报文协议(UDP)数据接收和发送 文章目录 用户报文协议(UDP)数据接收和发送1、UDP简单介绍2、W801的UDP创建逻辑2.1 UDP使用步骤2.2 代码实现1、UDP简单介绍 用户数据报协议 (UDP) 是一种跨互联网使用的通信协议,用于对时间敏感的传输,例如视频播放或 DNS查找。它通过在数…...
JavaScript 生成 16: 9 宽高比
这篇文章只是对 for 循环一个简单应用,没有什么知识含量。 可以跳过这篇文章。 只是我用来保存一下我的代码,保存在本地我嫌碍眼,总想把他删了。 正文部分 公式:其中 width 表示宽度,height 表示高度 16 9 w i d t…...
HTML5之drawImage函数
参数说明: drawImage(image, x, y) //按原图片大小绘制。 drawImage(image, x, y, width, height) //按指定大小绘制。 drawImage(image, sourceX, sourceY, sourceWidth, sourceHeight, destX, destY, destWidth, destHeight) //常用于图片裁剪。 其中:…...
leetcode7.整数反转-Java
题目 给你一个 32 位的有符号整数 x ,返回将 x 中的数字部分反转后的结果。 如果反转后整数超过 32 位的有符号整数的范围 [−231, 231 − 1] ,就返回 0。 假设环境不允许存储 64 位整数(有符号或无符号)。 7. 整数反转 - 力扣&a…...
操作系统备考学习 day2 (1.3.2 - 1.6)
操作系统备考学习 day2 计算机系统概述操作系统运行环境中断和异常的概念系统调用 操作系统体系结构操作系统引导虚拟机 计算机系统概述 操作系统运行环境 中断和异常的概念 中断的作用 CPU上会运行两种程序,一种是操作系统内核程序,一种是应用程序。…...
Django-跨域
一、基础概念 cors 跨域资源共享 二、跨域请求-简单请求 满足以下全部条件的请求为 简单请求 1.请求方法如下: GET or HEAR or POS 2.请求头仅包含如下: Accept、Accept-Language、Content-Language、Content-Type 3.ConTent-Type 仅支持如下三种&…...
wireshark抓包体验
目录 1、使用基础 1.1 数据包筛选 1.2 MAC地址筛选 1.3 端口筛选 1.4 协议筛选 1.5 包长度筛选 1.6 http请求筛选 2.数据包搜索 3.数据包还原 2、例题复现 1、使用基础 1.1 数据包筛选 ip.src 源ip地址 同理可以得到筛选目标地址: ip.dst 目的ip地址 1.2 …...
Prometheus+grafana安装配置
Prometheus安装配置 Prometheus下载地址 官方地址:Download | Prometheus 可根据系统版本下载想要的安装包,复制链接地址 wget https://github.com/prometheus/prometheus/releases/download/v2.33.3/prometheus-2.33.3.linux-amd64.tar.gzwg 解压pr…...
长连接和短连接有什么区别?
长连接和短连接是什么? HTTP的长连接和短连接本质上是TCP长连接和短连接。HTTP属于应用层协议,在传输层使用TCP协议,在网络层使用IP协议。 IP协议主要解决网络路由和寻址问题,TCP协议主要解决如何在IP层之上可靠地传递数据包&…...
Qt应用开发(基础篇)——输入对话框 QInputDialog
一、前言 QInputDialog类继承于QDialog,是一个简单方便的对话框,用于从用户获取单个值。 对话框窗口 QDialog QInputDialog输入对话框带有一个文本标签、一个输入框和标准按钮。输入内容可以字符、数字和选项,文本标签用来告诉用户应该要输入…...
C++ struct 笔记(超级详细)
今日碎碎念:我在学C语言时经常用到结构体struct,之后在写C程序时遇到在struct中定义构造函数和成员函数的情况,这在c语言中是从未遇到过的,觉得奇怪,想到之前并没有真正系统学习C里的struct,有必要今天详细…...
Vue基础1:生命周期汇总(vue2)
Description 生命周期图: 可以理解vue生命周期就是指vue实例从创建到销毁的过程,在vue中分为9个阶段:创建前/后,载入前/后,更新前/后,销毁前/后,其他;常用的有:created&…...
Linux串口驱动
《I.MX6ULL 参考手册》第 3561 页的“Chapter 55 Universal Asynchronous Receiver/Transmitter(UART) I.MX6ULL串口原理 1.1UART与USART UART是异步通信,USART是异步/同步通信,比UART多了一条时钟线 USART 的全称是 Universal Synchronous/Asynchr…...
java反编译工具jd-gui使用
文章目录 一、JD-GUI介绍二、下载三、安装四、使用教程五、免责声明摘抄 一、JD-GUI介绍 JD-GUI是一个独立的图形实用程序,显示“.class”文件的Java源代码。 使用JD-GUI浏览重构的源代码,以便即时访问方法和字段。 二、下载 MAC安装包:ht…...
Linux 之 shell 脚本
Linux 之 shell 脚本 1、脚本的格式要求2、shell 脚本常用执行方式2.1、绝对路径或相对路径方式2.2、sh脚本方式(不推荐) 3、shell 的变量3.1、定义 shell 变量3.2、将命令返回值赋值给变量 (重点)3.3、设置环境变量3.4、位置参数…...
T型翼/尾板导向的穿浪双体船姿态控制【附代码】
✨ 长期致力于穿浪双体船、T型翼、尾板、多自由度姿态控制、舒适性评估研究工作,擅长数据搜集与处理、建模仿真、程序编写、仿真设计。 ✅ 专业定制毕设、代码 ✅ 如需沟通交流,点击《获取方式》 (1)动态水翼升力模型与耦合运动方…...
利用DiSEqC协议与AVR单片机驱动卫星天线电机改造户外设备
1. 项目概述:用卫星天线电机驱动一切如果你手头有一些需要承受风吹日晒、还得精确转动的设备,比如一个户外的大型定向天线,或者一个需要定期调整角度的太阳能板支架,甚至是一个坚固的监控云台,你可能会为驱动机构发愁。…...
第3篇:系统透视——信息部门如何构建“税务友好型”IT架构
本篇导读:如果你是信息总监或IT负责人,请通读全文,尤其是“系统合规设计的三必须”和“现场检查SOP”;如果你是财税人员,请重点阅读“研产供销全链条的系统对接要求”和“与IT部门的协作要点”;如果你是老板…...
贵阳婚礼西服定制攻略:面料、工艺、版型避坑指南
婚礼西装是男士婚礼造型的核心,区别于日常商务正装,婚礼西服更看重版型精致度、面料质感、上身挺拔感以及镜头适配度。在贵阳备婚的新人,大多会放弃成品西装,选择专属定制服务。但本地婚礼西服定制市场参差不齐,很多新…...
金融合规审核为何人力堆积却仍漏洞百出?2026年RegTech演进与Agent全链路闭环解决方案
在2026年的金融监管环境下,合规审核已不再是简单的“查漏补缺”,而是演变为一场高强度的算力与逻辑博弈。尽管金融机构在合规成本上的投入逐年攀升,甚至不惜以“人海战术”填补流程断点,但监管罚单的数额与频率却并未显著下降。这…...
Python UiAutomation实战:从网页数据抓取到桌面应用,一个库打通数据采集全链路
Python UiAutomation实战:打通数据采集全链路的智能解决方案 在数据驱动的商业环境中,企业常常面临跨平台数据采集的挑战——财务系统里的交易记录需要与网站后台的报表进行交叉分析,销售数据要从桌面软件导出后上传到云端处理系统。传统的人…...
Unity事件系统实战:用事件驱动重构你的金币拾取逻辑(告别硬编码)
Unity事件系统实战:用事件驱动重构你的金币拾取逻辑(告别硬编码)在游戏开发中,我们经常会遇到这样的场景:玩家拾取金币后,需要更新UI、播放音效、解锁成就、保存数据……如果把这些逻辑全部写在金币拾取的代…...
同步带装配工艺要点与损伤防控策略
一、引言在工业精密传动系统中,盖茨同步带凭借高精度、高效率、无滑差的优势,成为自动化设备、精密机床、输送产线的核心传动部件。多数企业在运维中,普遍将同步带异常磨损、断齿、断带等故障归咎于工况恶劣或产品质量问题,却忽略…...
免费抓包工具选型指南:Wireshark、Fiddler、mitmproxy、Charles实战对比
1. 抓包工具不是“黑科技”,而是网络世界的显微镜很多人第一次听说“抓包”,脑子里立刻浮现出黑客电影里满屏滚动的绿色代码、键盘敲得噼啪作响、三秒破解银行防火墙的画面。其实完全不是这样——抓包(Packet Capture)本质上就是把…...
用Azure Kinect DK和Body Tracking SDK,5分钟实现一个实时人体骨骼点检测Demo(C++版)
5分钟实战:用Azure Kinect DK实现实时人体骨骼点追踪(C版) 当你第一次拿到Azure Kinect DK时,最令人兴奋的莫过于它强大的人体追踪能力。这款深度相机不仅能捕捉高清彩色图像,更能通过AI算法实时重建人体骨骼关节点。本…...
