Pytest自动化测试执行环境切换的两种解决方案(超详细)

🍅 视频学习:文末有免费的配套视频可观看

🍅 点击文末小卡片 ,免费获取软件测试全套资料,资料在手,涨薪更快

痛点分析

在实际企业的项目中,自动化测试的代码往往需要在不同的环境中进行切换,比如多套测试环境、预上线环境、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 通过配置对象读取参数的值
  • 参考文档:Writing plugins — pytest documentation

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命令行传入自定义的参数都可以通过方法一实现,因此杀鸡焉用牛刀,环境切换优先推荐方法二!

同时,在这我为大家准备了一份软件测试视频教程(含面试、接口、自动化、性能测试等),就在下方,需要的可以直接去观看,也可以直接【点击文末小卡片免费领取资料文档】

花了2万多买的自动化测试全套教程,现在分享给大家,入门到精通,全程干货无废话(软件测试全栈教程))

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

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

相关文章

蓝桥:重新排序(差分,python)

前言: 本题在模拟考试时还不会差分法,用纯暴力思路ac了60%的案列,之后看了蓝桥讲解,用差分做出来了(但对差分还是一知半解),最近学会了差分又来做本题,又卡在了技巧思路上&#xff…

【超细完整版】C# WebService 通过URL生成WSDL文件和DLL文件 【生成篇】

目的 支持通过web url (自适应“?wsdl”的有无) 生成.wsdl文件 和 .dll文件 实现 将通过一个类的三部分来实现这些功能 获取url中的ClassName (GetClassNameFromUrl)转换为WSDL文件 (UrlToWsdlFile)转换为DLL文件 (…

【算法】数组-二分搜索法

对应力扣704题目 左闭右闭 public class Solution{ public static void main(String[] args){ int[] nums {1,2,3,4,5,6,7,8,9,10}; int target 5; Solution solution new Soulution(); int result solution.search( nums, target); System.out.println("找到值的位置…

利用代理IP突破地域限制:解锁全球网络访问攻略

利用代理IP突破地域限制,实现解锁全球网络访问,是一种常见的网络技术手段。以下是一份详细的攻略: 1. 理解代理IP: 代理IP就像一个中间人,你的请求先发送到代理服务器,然后由代理服务器去获取你想要访问的网…

【STL基础】vector、stack、queue、list、pair、map、unordered_map、set、unordered_set(详细讲解)

vector、list、pair、unordered_map、unordered_set、stack、queue 参考文章: (1)【apollo】泛型编程 与 STL (2)c stack用法 入门必看 超详细 (3)C中queue的用法(超详细&#xff0c…

C语言关于void类型的指针作为函数形参在使用时需要注意的坑

目录 前言 一、void*指针使用时不同编译器下的处理结果 二、void*指针传递的指针变量进行位运算时,一定要注意强制转换的类型,和值的取值范围 总结 前言 众所周知,void* 指针作为函数形参时,表示可以接受任意类型的参数&#xf…

C语言基础知识点(十七)结构体中只用指针来存储字符串

// 如果需要用结构存储字符串&#xff0c;用字符数组作为成员会比较简单 // 如果需要使用指向char的指针来进行存储&#xff0c;那么需要请求malloc来 // 为字符串分配合适的存储空间#include <stdio.h> #include <string.h> //提供strcpy()\strlen()的原型 #i…

Linux修改Redis密码

方法一&#xff1a;修改配置文件 找到Redis配置文件redis.conf&#xff0c;通常位于/etc/redis/或/usr/local/etc/目录 sudo vim /etc/redis/redis.conf找到requirepass指令&#xff0c;如果已经有这个指令&#xff0c;你可以直接修改密码&#xff0c;如果没有&#xff0c;添…

Python实战:上下文管理器与with语句

一、引言 在Python编程中&#xff0c;上下文管理器与with语句是实现资源高效管理的重要工具。当程序使用资源&#xff08;如文件、网络连接等&#xff09;时&#xff0c;我们需要确保这些资源在使用完毕后能够被正确地释放&#xff0c;以避免资源泄漏和程序崩溃。上下文管理器…

基于FFmpeg混流及录制rtmp直播流

1、什么是混流&#xff1f; 混流就是把多路音视频流合成单流。准确的说&#xff0c;混流应该叫做混音&#xff08;音频流&#xff09;混画面&#xff08;视频流&#xff09; 混流的过程包括解码、混流、编码和推流四个部分。混流这个环节包括做抖动缓冲&#xff0c;目的是把多…

GDPU Java 天码行空4

文章目录 一、实验目的二、实验内容及要求三、实验内容及要求1. 设计AnimalTool工具类&#xff0c;实现eat()函数多态性&#x1f496; AnimalDemo.java&#x1f338; 运行结果 2. 是猫是狗&#x1f496; DuoTaiDemo5.java&#x1f338; 运行结果 3. 太会了&#x1f496; DuoTai…

国内IP地址切换排行榜软件大全

随着互联网的飞速发展&#xff0c;IP地址切换技术在日常工作和生活中扮演着越来越重要的角色。无论是为了网络安全、访问特定地区网站&#xff0c;还是进行市场调研、网络爬虫等&#xff0c;IP地址切换都成为了不可或缺的工具。虎观代理将为您介绍国内较受欢迎的IP地址切换软件…

B004-springcloud alibaba 服务容错 Sentinel

目录 高并发带来的问题服务雪崩效应常见容错方案常见的容错思路隔离超时限流熔断降级 常见的容错组件 Sentinel入门什么是Sentinel微服务项目集成Sentinel核心库安装Sentinel控制台实现一个接口的限流 Sentinel的概念和功能基本概念重要功能 Sentinel规则流控规则三种流控模式三…

mybatis拦截器打印sql日志

前言 利用mybatis拦截器打印输出sql 操作 编写拦截器 package com.it2.excel01.interceptor;import java.text.DateFormat; import java.util.Date; import java.util.List; import java.util.Locale; import java.util.Properties;import lombok.extern.slf4j.Slf4j; impo…

深度学习——线性代数相关知识

线性代数基础知识 一、线性代数基础知识1、标量2、向量3、矩阵4、张量5、点积6、向量—矩阵积7、矩阵—矩阵乘法 二、小结 一、线性代数基础知识 本节将介绍简要地回顾一下部分基本线性代数内容&#xff0c;线性代数中的基本数学对象、算术和运算&#xff0c;并用数学符号和相…

基于SpringBoot的高校办公室行政事务管理系统

采用技术 基于SpringBoot的高校办公室行政事务管理系统的设计与实现~ 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;SpringBootMyBatis 工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 页面展示效果 功能清单 教师信息管理 办公室管理 办公物资管…

软文营销应该怎么做?软文营销的关键

软文本营销不是一个简单的写作和发送文章的过程&#xff0c;而是一个从早期准备到软文本写作再到效果评估的综合运营管理过程。 步骤一&#xff1a;目标明确 目标是指目标用户&#xff0c;找出目标用户是什么样的群体&#xff0c;从而根据用户群体的画像进行软文准备。 步骤二…

C语言基础练习——Day13

目录 选择题 编程题 统计每个月兔子的总数 数列的和 选择题 1、如果x2014&#xff0c;下面函数的返回值是 int fun(unsigned int x) {int n 0;while(x 1){n;x x | (x 1);}return n; } A 20B 21C 23D 25 答案&#xff1a;C &#x1f4a1; 解析&#xff1a; 上面的代码中的x …

3000+人使用,这套人力资源数据分析工具还能这么用

中国科学院自动化研究所&#xff08;以下简称“自动化所”&#xff09;成立于1956年&#xff0c;是中国科学院率先布局成立的“人工智能创新研究院”的总体牵头单位&#xff0c;是中国最早开展智能科学与技术基础理论、关键技术和创新性应用研究的科研机构&#xff0c;也是中国…

ADAS-AEB系统详解

ADAS-AEB系统详解 AEB即自动紧急制动&#xff08;Automatic Emergency Braking&#xff09;&#xff0c;其通过雷达、摄像头共同监测前方车辆以及行人情况&#xff0c;若探测到潜在碰撞风险&#xff0c;系统将采取相应预警及制动措施&#xff0c;从而避免发生碰撞或减轻碰撞损…