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

2023-12-21

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

总结:

感谢每一个认真阅读我文章的人!!!

作为一位过来人也是希望大家少走一些弯路,如果你不想再体验一次学习时找不到资料,没人解答问题,坚持几天便放弃的感受的话,在这里我给大家分享一些自动化测试的学习资源,希望能给你前进的路上带来帮助。

软件测试面试文档

我们学习必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有字节大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

  • Pytest版本冲突错误

    更新 Debian Jessie 后 pytest 无法工作 py test Traceback most recent call last File usr bin py test line 5 in
  • 使用 unittest.mock 在 Python 中模拟 os.remove

    我该如何嘲笑os remove with unittest mock 我的尝试 使用pytest def test patch remove with patch os remove remove foo 给出错误 remove foo E
  • 单元测试与 pytest

    在单元测试中 我可以setUp类中的变量 然后该类的方法可以选择它想要使用的任何变量 class test class unittest TestCase def setUp self self varA 1 self varB 2 sel
  • FastAPI 中的单元测试

    我有一个使用 FastAPI 开发的后端应用程序 使用 SQLModel SQLAlchemy 和 Pydantic 并连接到 Postgres 数据库 我有集成测试来测试我的端点是否可以与暂存 PG DB 正常工作 但现在我必须编写单元测
  • 是否可以在 pytest_generate_tests() 中使用固定装置?

    我有一些固定装置conftest py在实际测试功能中运行良好 但是 我想使用参数化一些测试pytest generate tests 基于其中一些装置的数据 我想做的 简化 conftest py my fixture returns a
  • pytest。使用堆叠参数化装饰器时定义预期结果的最佳方法?

    我有两个类似的测试用例 每个都有超过 100 行代码 这些代码为测试创建辅助对象 这些行非常相似 事实上 测试设置之间只有 2 行不同 我不想删除这些代码重复 我认为多个参数化可能会帮助我完成这项任务 使用多个参数化 我可以将设置组合起来
  • 尝试使用 pytest 在 python 3.10 上执行测试时出错

    如果我尝试使用执行测试pytest使用 python 3 10 我收到以下错误 TypeError required field lineno missing from alias 谷歌说这是一个已知问题 但我找不到解决的方法 如果我用 3
  • Pytest 适用于旧的模拟,但不适用于 unittest.mock

    我正在将一些代码从 Python 2 移植到 3 并且py test玩得不好patch装饰器来自unittest mock 当我使用patch装饰器将模拟传递到测试函数的参数中 py test相反 将该参数解释为固定装置 并且无法设置测试
  • py.test 无法导入我的模块

    我正在努力正确导入 python 我想要实现的是拥有一个包含多个源文件的模块和一个包含单元测试的测试文件夹 无论我做什么 我都无法让 py test 3 执行我的测试 我的目录布局如下所示 module init py testclass
  • 如何从视图中删除单元测试的“@oidc.login_required”?

    I use 烧瓶样机 questions tagged flask oidc用于用户登录和pytest questions tagged pytest供测试用 对于单元测试 我想 删除 oidc require login 我怎样才能做到这
  • sqlalchemy:无法在拆卸时删除数据库

    我正在尝试使用 pytest 进行 sqlalchemy 但遇到以下问题 pytest fixture scope function def my session my db request from my models import Se
  • 如何访问 pytest 夹具中的所有标记?

    我正在使用 pytest 我想用标记来标记我的测试 这些标记将指定固定装置要在驱动程序中加载哪个页面 这可以轻松地与行为上下文对象一起使用 但我找不到如何使用 pytest 来做到这一点 以这段代码为例 import pytest pyte
  • 在参数化中传递 pytest 夹具

    通过在 pytest mark parametrize 中传递 conftest py 中定义的装置 我收到以下错误 pytest alist 0220 0221 test 1 py v s NameError name alist is
  • 使用 pytest 动态控制测试顺序

    我想使用逻辑来控制测试的顺序 该逻辑将在它们已经运行时动态地重新排序它们 我的用例是这样的 我使用 xdist 并行化我的测试 每个测试都使用来自公共且有限池的外部资源 某些测试比其他测试使用更多的资源 因此在任何给定时间 当只有一小部分资
  • Django Channels Postgres InterfaceError:连接已关闭

    我似乎无法理解这里的问题 我正在为我的渠道消费者编写测试文档中的描述 https channels readthedocs io en latest topics testing html 我通常会使用 Django 默认的单元测试 但由于
  • 如何将脚本作为 pytest 测试运行

    假设我有一个用简单脚本表示的测试assert 陈述 请参阅背景了解原因 例如 import foo assert foo 3 4 我如何以一种好的方式将该脚本包含在我的 pytest 测试套件中 我尝试了两种有效但不太好的方法 一种方法是将
  • 如何全局安装 Python(开发)依赖项,以便我不必在每个 venv 中重新安装它们?

    我希望在为每个项目创建的每个 venv 虚拟环境 中都可以使用一些 Python 依赖项 例如 black flake8 和 pytest 这可能吗 如果可以 如何实现 我想安装这三个once在我的主要 Python 安装下 我必须在启动新
  • 模拟pytest中的异常终止

    我的多线程应用程序遇到了一个错误 主线程的任何异常终止 例如 未捕获的异常或某些信号 都会导致其他线程之一死锁 并阻止进程干净退出 我解决了这个问题 但我想添加一个测试来防止回归 但是 我不知道如何在 pytest 中模拟异常终止 如果我只
  • pytest 与 setup.py 测试

    我使用说明 描述了here https pytest org latest goodpractices html integrating with setuptools python setup py test pytest runner
  • pytest 看不到正在测试的函数的日志

    我有一个像这样的烧瓶应用程序 from flask import Flask import logging app Flask name app route def catch all logging warning I m a warni

随机推荐

  • 京东岗位吼哔多,具体有啥牛牛说!5类方向近20个岗位等你选~

    字节 测试开发 日常实习 三面面经 已发offer 字节测开秋招面经 华为上海青浦研究所现状 而我 落荒而逃 得物实习小记 运营岗位爆料 干了5年运营后我才知道的事 华为海思麒麟开奖清蒸白菜新鲜出炉 真的难啊 华为上海青浦研究所现状 华为上
  • 京东岗位吼哔多,具体有啥牛牛说!5类方向近20个岗位等你选~

    字节 测试开发 日常实习 三面面经 已发offer 字节测开秋招面经 华为上海青浦研究所现状 而我 落荒而逃 得物实习小记 运营岗位爆料 干了5年运营后我才知道的事 华为海思麒麟开奖清蒸白菜新鲜出炉 真的难啊 华为上海青浦研究所现状 华为上
  • 短视频时代:文案的力量与价值

    在当今这个信息时代 短视频以其独特的魅力和巨大的传播力 已经深深地渗透到我们的生活中 无论是抖音 快手 还是其他短视频平台 它们都在以自己独特的方式塑造着我们的娱乐生活 而在这些短片的背后 有一个重要的元素在发挥着关键的作用 那就是文案 文
  • Oracle EBS 暂挂发票放弃行按钮为灰色

    Oracle EBS 暂挂发票放弃行按钮为灰色 解决办法如下 应付设置职责下 设置 选项 应付款系统选项 找到发票页签 将 允许对已付发票进行调整 勾选后 回到发票界面重新查询发票 暂挂发票放弃行按钮正常操作 To allow the li
  • SAP ERP系统怎么样?适合中小企业吗?

    SAP是什么 它跟ERP什么关系 对于工业4 0 能起到什么作用 哪里有SAP最新的资讯 我们先来对这两个名词做一个简单的解释 SAP 思爱普 是全球领先的业务流程管理软件供应商之一 致力于开发先进的解决方案 帮助企业高效处理整个企业范围内
  • 博睿数据参与支持2023年度证券期货业标准研究课题获评“优秀”

    近期 全国金融标准化技术委员会证券分技术委员会发布 关于公布2023年度证券期货业标准研究课题结题评审结果的通知 由西南证券独立申报 博睿数据提供系统支持的课题 证券期货业移动互联网应用程序性能指标及检测模型研究 在2023年度证券期货业标
  • Clonable 接口和深拷贝

    Object 类中存在一个 clone 方法 调用这个方法可以创建一个对象的 拷贝 想用clone方法时报错了 查看一下 clone方法被protected修饰 不同包只能在子类中访问 可以用super关键字访问 clone方法返回类型是O
  • 如何保护服务器IP地址的安全,具体措施有哪些?

    福建 任意一台服务器都有自己的IP 可以是一个或者很多个 但是在分配到一台独立服务器上的IP 就不能被其他独立服务器使用 别小瞧IP这串数字 IP存在的意义重大 互联网中有很多攻击是从IP定位开始的 IP地址中窃取个人资料进行定位 此外 I
  • 服务器硬件系统之维护拆装教程

    服务器硬件系统之维护拆装教程 在进行电缆连接 插拔 时 通过该电缆连接 或将要连接 的设备应当是没有加电的 即应当先将设备的电源关掉 然后再进行电缆连接 插拔 操作 否则 如果带电进行电缆连接 有可能会对设备造成无法预料的损坏 1 在增加服
  • Linux常用命令..

    2024软件测试面试刷题 这个小程序 永久刷题 靠它快速找到工作了 刷题APP的天花板 CSDN博客 文章浏览阅读1 9k次 点赞85次 收藏11次 你知不知道有这么一个软件测试面试的刷题小程序 里面包含了面试常问的软件测试基础题 web自
  • 服务器漏洞评估的几个步骤

    服务器漏洞评估的几个步骤 漏洞扫描或漏洞评估是一个系统的过程 该过程可在解决潜在漏洞的任何系统中查找安全漏洞 漏洞评估的目的是防止未经授权访问系统的可能性 漏洞测试可保留系统的机密性 完整性和可用性 该系统是指任何计算机 网络 网络设备 软
  • WinSATAPI.dll文件缺少导致程序无法启动问题

    其实很多用户玩单机游戏或者安装软件的时候就出现过这种问题 如果是新手第一时间会认为是软件或游戏出错了 其实并不是这样 其主要原因就是你电脑系统的该dll文件丢失了或没有安装一些系统软件平台所需要的动态链接库 这时你可以下载这个WinSATA
  • 细说 MySQL 用户安全加固策略

    这是一篇关于如何加强 MySQL 用户安全的文章 通读全文您可以了解密码复杂度策略 连接控制插件以及密码变更策略的相关知识 本文内容仅供参考 请在操作时以实际环境为准 避免造成经济损失 作者 余振兴 爱可生 DBA 团队成员 热衷技术分享
  • 恐怖单机游戏:坤坤之夜 KUNKUNNIGHT 中文免安装版

    坤坤之夜 是一款结合了恐怖和恶搞元素的独立游戏 开发时长约为两年半 游戏以第一人称视角展开 讲述了一个虚构的恐怖故事 在游戏中 玩家将与一个名叫坤坤的男子进行一场惊心动魄的逃生经历 游戏特点 恐怖与恶搞元素 游戏在恐怖氛围的营造上十分用心
  • 独立搭建UI自动化测试框架分享

    今天给大家分享一个selenium testng maven ant的UI自动化 可以用于功能测试 也可按复杂的业务流程编写测试用例 今天此篇文章不过多讲解如何实现CI CD 只讲解自己能独立搭建UI框架 如果有其他好的框架也可以联系我 分
  • WinFax.dll文件缺少导致程序无法运行问题

    其实很多用户玩单机游戏或者安装软件的时候就出现过这种问题 如果是新手第一时间会认为是软件或游戏出错了 其实并不是这样 其主要原因就是你电脑系统的该dll文件丢失了或没有安装一些系统软件平台所需要的动态链接库 这时你可以下载这个WinFax
  • 接口测试测什么?一个简单问题把我难住了

    2024软件测试面试刷题 这个小程序 永久刷题 靠它快速找到工作了 刷题APP的天花板 CSDN博客 文章浏览阅读1 9k次 点赞85次 收藏11次 你知不知道有这么一个软件测试面试的刷题小程序 里面包含了面试常问的软件测试基础题 web自
  • 题解 | #返回购买价格为 10 美元或以上产品的顾客列表#

    脚气怎样治能够根除 2022腾讯秋招面经导航汇总 测试篇 华为上海青浦研究所现状 华为上海青浦研究所现状 华为上海青浦研究所现状 TP普联嵌入式一面 HC还有一千多个 招不到就浪费了 求求大家投下小米吧 吃透计算机网络八股文 年薪40万 实
  • 【2024全网最火最全性能教程】一文搞懂性能测试!

    性能测试概念 我们经常看到的性能测试概念 有人或称之为性能策略 或称之为性能方法 或称之为性能场景分类 大概可以看到性能测试 负载测试 压力测试 强度测试等一堆专有名词的解释 针对这些概念 我不知道你看到的时候会不会像我的感觉一样 乱 一个
  • 【pytest】执行环境切换的两种解决方案

    一 痛点分析 在实际企业的项目中 自动化测试的代码往往需要在不同的环境中进行切换 比如多套测试环境 预上线环境 UAT环境 线上环境等等 并且在DevOps理念中 往往自动化都会与Jenkins进行CI CD 不论是定时执行策略还是迭代测试