当前位置: 首页 > news >正文

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_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.jsqmd.com/news/273913/

相关文章:

  • 阿里出品2026版Java架构师面试指南,涵盖Java所有核心技能
  • FBM237-P0917QZ输出模块
  • 2026 垂直生命线系统防护厂家权威推荐榜单:水平生命线系统/垂直生命线系统/水平生命线系统装置/垂直生命线系统装置源头厂家精选。
  • 2026年Java岗最全面试攻略,面试必刷,跳槽大厂神器
  • FBM242-P0916JY外置开关模块
  • 2026南宁市英语雅思培训辅导机构推荐;2026权威出国雅思课程排行榜 - 苏木2025
  • 深入解析:【MySQL】视图
  • 2026Java面试常见知识点总结!
  • 2026南宁市英语雅思培训辅导机构推荐2026权威出国雅思课程排行榜 - 苏木2025
  • 192S06M0132B控制系统模块
  • 2026年评价高的反渗透超纯水设备,电子行业超纯水设备,超纯水设备厂家采购决策指南 - 品牌鉴赏师
  • 专业气体分析仪采购指南:七大技术类别厂家推荐与对比 - 品牌推荐大师
  • VME-HDD-4G单插槽软盘/硬盘模块
  • 2026年1月广东定制密封圈 /车削密封件 /超高压密封/ 聚氨酯密封 /非标密封厂家企业哪家好 - 2026年企业推荐榜
  • 2026四川口碑实木楼梯品牌深度选型指南 - 2026年企业推荐榜
  • 【大数据毕设全套源码+文档】基于Python的王者荣耀战队的数据分析系统的设计与实现(丰富项目+远程调试+讲解+定制)
  • Linux系统编程:内核协议栈,我把网络IO移到用户态后,延迟从毫秒级降到微秒级
  • 2026年1月中国大巴车租赁、包车、租车、商务车租赁、旅游包车公司行业竞争格局深度分析报告 - 2026年企业推荐榜
  • 网络安全基础核心框架一篇搞定:专为零基础设计的极简入门指南
  • 封箱机怎么选?2026年实力厂家质量评测来袭,覆顶缠膜机/行李包装机/自动套膜机/打包缠膜一体机,封箱机销售厂家怎么选购 - 品牌推荐师
  • 搞定Z世代求职者,你的招聘“操作系统”该升级了
  • 红色展厅展馆设计公司哪家好?盛世笔特经验丰富 - 工业品牌热点
  • 小白必看的10个网络安全基础核心概念,从零构建你的知识骨架
  • 2026年Q1四川照明灯具定做厂家综合比较 - 2026年企业推荐榜
  • 绘制你的第一张网络安全知识地图:一看就懂的体系化入门路径
  • 拉萨市英语雅思培训辅导机构推荐,2026权威出国雅思课程中心学校口碑排行榜2026 - 老周说教育
  • Keil:函数级优化技巧全解
  • HLS第一个入门工程(简单加法器)
  • 合规审计日志场景:企业网盘测评日志功能对比 - 速递信息
  • 探寻耐酸碱流量计优质厂家,2026年哪些品牌值得信赖,液体涡轮流量计/超声波液位计,耐酸碱流量计供应厂家哪里有卖 - 品牌推荐师