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 通过配置对象读取参数的值

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.mfbz.cn/a/145025.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Ora2Pg工具迁移Oracle到openGauss

📢📢📢📣📣📣 哈喽!大家好,我是【IT邦德】,江湖人称jeames007,10余年DBA及大数据工作经验 一位上进心十足的【大数据领域博主】!😜&am…

2022年12月 Python(五级)真题解析#中国电子学会#全国青少年软件编程等级考试

Python等级考试(1~6级)全部真题・点这里 一、单选题(共25题,每题2分,共50分) 第1题 下面哪个语句正确定义了元组类型数据tuple1?( ) A: tuple1=[“张三”,“李四”,“王五”] B: tuple1=(“张三”;“李四”;“王五”) C: tuple1=(张三,李四,王五) D: tuple1=(“张三…

C语言从入门到精通之【printf和scanf函数】

printf()是输出函数,scanf()是输入函数,但是它们的工作原理几乎相同。两个函数都使用格式字符串和参数列表。 printf()函数的格式 printf( 格式字符串, 待打印项1, 待打印项2,…);待打印项1、待打印项2等都是要打印的项。它们可以是变量、常量&#xff…

【论文阅读】GAIN: Missing Data Imputation using Generative Adversarial Nets

论文地址:[1806.02920] GAIN: Missing Data Imputation using Generative Adversarial Nets (arxiv.org)

应用层——HTTPS协议

文章目录 一.HTTPS协议介绍二.关于加密1.什么是"加密"2.为什么要加密3.常见的加密方式4.数据摘要 && 数据指纹 三.HTTPS的工作过程探究1.方案1 —— 只使用对称加密(明文传输不可取)2.方案2 —— 只使用非对称加密(仅单向安…

【数据分享】2015-2023年我国地级市逐月房价数据(Excel格式/Shp格式)

房价是一个城市发展程度的重要体现,一个城市的房价越高通常代表这个城市越发达,对于人口的吸引力越大!因此,房价数据是我们在各项城市研究中都非常常用的数据!之前我们分享过我国主要城市2023年房价数据(可…

Vue基础必备掌握知识点-Vue的指令系统讲解(二)

Vue指令系统继续讲解 v-for 作用:基于数据进行循环,多次渲染整个元素 数据类型:数组.对象.数字。。。 遍历数组语法:v-for"(item,index)" in 数组 item:表示每一项 index:则是表现下标 注意:v-for中的key值,key属性唯一的…

【算法|动态规划 | 区间dp No.2】AcWing 1068.环形石子合并

个人主页:兜里有颗棉花糖 欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 兜里有颗棉花糖 原创 收录于专栏【AcWing算法提高学习专栏】【手撕算法系列专栏】 🍔本专栏旨在提高自己算法能力的同时,记录一下自己的学习过程&a…

深度学习实战59-NLP最核心的模型:transformer的搭建与训练过程详解,手把手搭建与跑通

大家好,我是微学AI,今天给大家介绍一下深度学习实战59-NLP最核心的模型:transformer的搭建与训练过程详解,手把手搭建与跑通。transformer是一种基于自注意力机制的深度学习模型,由Vaswani等人在2017年的论文《Attention is All You Need》中提出。它最初被设计用来处理序…

SpringCloudalibaba2

一、nacos简介 Nacos(全称为"Nano Service")是一个用于动态服务发现、配置管理和服务元数据的开源平台。它由阿里巴巴集团于2018年开源,并逐渐成为云原生应用中的重要组件之一。 Nacos提供了以下主要功能: 1. 服务发…

【论文阅读】CTAB-GAN: Effective Table Data Synthesizing

论文地址:[2102.08369] CTAB-GAN: Effective Table Data Synthesizing (arxiv.org) 介绍 虽然数据共享对于知识发展至关重要,但遗憾的是,隐私问题和严格的监管(例如欧洲通用数据保护条例 GDPR)限制了其充分发挥作用。…

IDEA接口调试插件不好找?这款免费用!

IDEA插件市场中的API调试插件不是收费(Fast Request )就是不好用(apidoc、apidocx等等)今天给大家介绍一款国产的API调试插件:Apipost-Helper,完全免费且好看好用! 这款插件由Apipost团队开发的…

java springboot2.7 JSR303与Hibernate进行Bean的数据校验

我们如果对数据能进行格式校验 做个安全检查就会容易很多 其实 各个系统中都必然后拥有数据校验&#xff0c;这也不是新东西 J2EE规范中JSR303就规范定义了一组有关数据校验的API 首先 我们在 pom.xml 中 注入依赖 <dependency><groupId>javax.validation</gr…

异常与中断(一)

使用生活实例引入中断 假设有个大房间里面有小房间&#xff0c;婴儿正在睡觉&#xff0c;他的妈妈在外面看书。 问&#xff1a;这个母亲怎么才能知道这个小孩醒&#xff1f; 过一会打开一次房门&#xff0c;看婴儿是否睡醒&#xff0c;然后接着看书一直等到婴儿发出声音以后再…

接口测试用例设计

接口测试 最后感谢每一个认真阅读我文章的人&#xff0c;礼尚往来总是要有的&#xff0c;虽然不是什么很值钱的东西&#xff0c;如果你用得到的话可以直接拿走&#xff1a; 这些资料&#xff0c;对于【软件测试】的朋友来说应该是最全面最完整的备战仓库&#xff0c;这个仓库也…

【论文阅读】(VAE)Auto-Encoding Variational Bayes

论文地址&#xff1a;[1312.6114] Auto-Encoding Variational Bayes (arxiv.org) 【前言】&#xff1a;VAE模型是Kingma(也是Adam的作者)大神在2014年发表的文章&#xff0c;是一篇非常非常经典&#xff0c;且实现非常优雅的生成模型&#xff0c;同时它还为bayes概率图模型难以…

老卫带你学---go语言中context库里propagateCancel函数

go语言中context库里propagateCancel函数 // 设置当父context取消时候&#xff0c;子context也取消的逻辑 func propagateCancel(parent Context, child canceler) {//父context永远不会被取消&#xff08;例如WithValue&#xff09;done : parent.Done()if done nil {return …

SAP:解决函数CONNE_IMPORT_WRONG_COMP_DECS CX_SY_IMPORT_MISMATCH_ERROR错误

用户反馈报表中取数异常&#xff0c;经检查发现SE37执行取数函数ZLY_R_CWFX03报以下错误。 Category ABAP Programming Error Runtime Errors CONNE_IMPORT_WRONG_COMP_DECS Except. CX_SY_IMPORT_MISMATCH_ERROR ABAP Program ZLY_R_CWFX03FT Application Component Not Assig…

爱上C语言:整型和浮点型在内存中的存储(进制转换,原码,反码,补码以及大小端)

&#x1f680; 作者&#xff1a;阿辉不一般 &#x1f680; 你说呢&#xff1a;生活本来沉闷&#xff0c;但跑起来就有风 &#x1f680; 专栏&#xff1a;爱上C语言 &#x1f680;作图工具&#xff1a;draw.io(免费开源的作图网站) 如果觉得文章对你有帮助的话&#xff0c;还请…
最新文章