【pytest】执行环境切换的两种解决方案

news2024/12/27 13:07:19

一、痛点分析

  在实际企业的项目中,自动化测试的代码往往需要在不同的环境中进行切换,比如多套测试环境、预上线环境、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_url
        start_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命令行传入自定义的参数都可以通过方法一实现,因此杀鸡焉用牛刀,环境切换优先推荐方法二!

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

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

相关文章

深度解析Linux kernel同步机制(上篇)

在现代操作系统里,同一时间可能有多个内核执行流在执行,因此内核其实像多进程多线程编程一样也需要一些同步机制来同步各执行单元对共享数据的访问,尤其是在多处理器系统上,更需要一些同步机制来同步不同处理器上的执行单元对共享…

开源之夏 2023 | 欢迎报名openEuler sig-eBPF开发任务

开源之夏是中国科学院软件研究所联合openEuler发起的开源软件供应链点亮计划系列暑期活动,旨在鼓励在校学生积极参与开源软件的开发维护,促进优秀开源软件社区的蓬勃发展。活动联合各大开源社区,针对重要开源软件的开发与维护提供项目&#x…

Windows版Sketch软件也太好用了吧!

目前为止,Sketch 软件仅支持 macOS 系统,没有推出 Windows 版本,而且在短期内也不太可能推出。这是因为 Sketch 软件是使用独有的 OS X 技术和框架开发的,它依赖于许多 OS X 的核心功能,这些功能不容易轻松移植到其他操…

[MYAQL / Mariadb] 数据库学习-管理表记录2:匹配条件

管理表记录-匹配条件 匹配条件基本条件查询逻辑匹配(多个条件判断) 高级条件范围匹配模糊查询正则表达式: regexp四则运算 操作查询结果(对查找到的数据再做处理)排序分组(一样的显示一次)&…

FreeRTOS_系统配置

目录 1. FreeRTOSConfig.h 文件 2. "INCLUDE_" 开始的宏 2.1 INCLUDE_xSemaphoreGetMutexHolder 2.2 INCLUDE_xTaskAbortDelay 2.3 INCLUDE_vTaskDelay 2.4 INCLUDE_vTaskDelayUntil 2.5 INCLUDE_vTaskDelete 2.6 INCLUDE_xTaskGetCurrentTaskHandle 2.7 IN…

数据结构与算法(二)

一、数组 什么是数组? 数组:在内存中用一串连续的区域来存放一些值。数组是相同类型数据元素的有序集合 数组是由相同类型的元素的集合组成的数据结构 连续内存:JS的数组元素可以是任意类型,JS中的内存地址是不连续的 数组的…

工业互联网的新应用:高端装备的故障预测和健康管理

高端装备制造行业作为我国战略性新兴产业的重要组成部分,面临着产品复杂和生命周期长的挑战。为了提高装备的可靠性、可用性和维护效率,工业互联网技术在高端装备的故障预测和健康管理方面发挥了重要作用。 本文将探讨工业互联网在高端装备中故障预测和…

如何应用金字塔模型提高结构化表达能力

看一下结构化表达的定义: 结构化表达:是基于结构化思维,理清事物整理与部分之间关系、换位思考后,进行简洁、清晰和有信服力的表达,是一种让受众听得明白、记得清楚、产生认同的精益沟通方式。 结构化表达的基本原则是…

度娘教我influxdb,先搞一波在补理论

InfluxDb中的数据查询语法where子句 公司用的时序性数据库是influxdb,但是确实接触有点少。 心里话: 就是没接触过,度娘教教我。。。。 我咋回呢,现学吧,都是数据库,天下乌鸦一般黑然后就哟了以下&#xf…

Mac 更换.gradle文件目录

用mac开发最大滑铁卢居然是存储空间不足......于是加了一个外置的存储器。于是需要把android开发中最大的一个缓存目录移到外置存储器... 一开始对android studio的进行了如下设置 于是乎...Mac用户下的.gradle全删了...这个时候用android studio打包运行都没问题了。 如果你…

AI在视频教学方面会有哪些有意思应用?

阿酷TONY / 原创 / 2023-5-17 / 长沙 来,我们一起来探索未来式的学习体验,AI视频,AI与视频的应用将为你带来前所未有的教学体验。AI在视频教学方面的应用,主要会体现在如下几个方面: 1. AI 课程知识点梳理 2. AI 学…

前段时间公司招人,面了一个要23K的,一问自动化只会点皮毛···

前段时间公司要招2个自动化测试,同事面了几十个候选人,发现了一个很奇怪的现象,面试的时候,如果问的是框架api、脚本编写这些问题,基本上个个都能对答如流,等问到实际项目的时候,类似“怎么从0开…

OPPO关停哲库业务,工程师造芯何去何从?

5月12日(上周五),新浪科技从OPPO处了解到,OPPO将终止ZEKU业务。3000多人团队突然原地解散,网上唏嘘声一片! ZEKU最初成立于2019年,是OPPO的全资子公司,欧加集团百分之百注资成立。总…

提高合规性与安全性:ADAudit Plus助力企业数据审计

简介:在现代数字化时代,企业面临着日益增长的数据安全威胁和法规合规要求。为了应对这些挑战,企业需要强大的数据审计解决方案来监控和保护其敏感数据。ADAudit Plus是一款功能强大的工具,旨在帮助企业提高合规性,并提…

dll注入技术

一、dll注入的概念 当一个进程运行时,它会加载并使用一些动态链接库(DLL)来提供额外的功能和资源。这些DLL可以被多个进程共享,使得代码重用和资源共享变得更加高效。DLL注入技术利用了这种共享机制。它允许向正在运行的进程中注…

厦大凭什么和清北复一起入选首批国家集成电路产教融合创新平台?对台区位优势吗

最近,有网友提出这样一个问题,众所周知,中国集成电路研究主要集中在北京和上海,清北可以和北京合作,复旦可以和上海合作,那么厦大和谁合作,厦大又凭什么和清北复一起入选了首批国家集成电路产教…

RecyclerView 分层级展示(抽屉) TreeView

先看效果 难点: 数据层级的划分;理清楚层级关系, 剩下的就简单明了了; 1. 第一步 new Adapter, and setAdapter; (不需要setLayoutManager, Adapter里有set); mAdapter new TreeViewAdapter(getContext(),mRecyclerView); mRecyclerView.setAdapter(mAdapter); 2. 第二步, …

素雅的登录界面,简单而优雅

先上效果图&#xff1a; 再上代码&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Title</title><style>*, *::after, *::before {margin: 0;padding: 0;box-sizing: bord…

本地服务器与云服务器哪个好?

本地服务器和云服务器是企业可以使用的两种不同的服务器设置。主要区别在于本地服务器托管&#xff0c;第三方提供商托管云服务器。那么&#xff0c;本地服务器和云服务器哪个更好呢&#xff1f; 接下来&#xff0c;将带大家讨论本地服务器和云服务器的优缺点&#xff0c;并帮…

Golang笔记:使用embed包将静态资源嵌入到程序中

文章目录 目的使用演示//go:embed 指令在WebServer中应用总结 目的 Golang编译程序默认是静态编译&#xff0c;会把相关的库都打包到一起&#xff0c;这在分发部署使用时非常方便。不过如果项目中用到的外部的静态资源文件&#xff0c;通常就需要将这些资源和程序一起拷贝分发…