Python中pytest命令行实现环境切换

 更新时间:2023年07月17日 10:25:01   作者:知识的宝藏  
在自动化测试过程中经常需要在不同的环境下进行测试验证,所以写自动化测试代码时需要考虑不同环境切换的情况,本文主要介绍了Python中pytest命令行实现环境切换,感兴趣的可以了解一下

前言

在自动化测试过程中经常需要在不同的环境下进行测试验证,所以写自动化测试代码时需要考虑不同环境切换的情况。pytest钩子函数pytest_addoption可以很好帮我们解决这个痛点。

pytest_addoption(parser, pluginmanager)

注册argparse样式选项和ini样式配置值,在测试运行开始时调用一次。

注意:

由于pytest在启动过程中如何发现插件,因此该函数只能在位于测试根目录的插件或conftest.py文件中实现。

参数

parser(pytest.parser)–若要添加命令行选项,请调用parser.addoption(…)。若要添加ini文件值,请调用解析器.addini(…)。

pluginmanager(pytest.PytestPluginManager)–pytest插件管理器,可用于安装hookspec()或hookpimpl(),并允许一个插件调用另一个插件的钩子来更改命令行选项的添加方式。

以后可以分别通过配置对象访问选项:

config.getoption(name)来检索命令行选项的值。

config.getini(name)来检索从ini样式文件中读取的值。

config对象通过.config属性在许多内部对象上传递,或者可以作为pytestconfig fixture检索。

在conftest.py文件中定义命令行参数

def pytest_addoption(parser):
    """
    添加命令行参数
    parser.addoption为固定写法
    default 设置一个默认值,此处设置默认值为sit
    choices 参数范围,传入其他值无效
    help 帮助信息
    """
    parser.addoption(
        "--env", default="sit", choices=["dev", "sit", "uat"], help="环境参数"
    )

我们定义了不同环境下的命令参数:dev、sit、uat,我们怎么获取运行的命令行参数呢?

获取命令行参数

@pytest.fixture(scope="session")
def get_env(request):
    return request.config.getoption("--env")

设置不同环境的全局变量

在不同的测试环境下,URL、用户信息等数据都是不一样的,建议在conftest中给全局变量赋值可以减少代码冗余。

先定义一个数据文件,data_util.py分别获取用户信息和URL信息

def get_env():
    env = {
        'sit': 'www.baidu.com',
        'uat': 'www.hao123.com'
    }
    return env
def get_user():
    users = {
        'sit': ['user1', 'pwd1'],
        'uat': ['user2', 'pwd2']
    }
    return users

然后在conftest中根据环境设置全局变量值

# 设置不同环境下的全局变量
@pytest.fixture(scope="session")
def set_env(get_env):
    if get_env == 'sit':
        env_url = data_util.get_env()['sit']
        user = data_util.get_user()['sit']
    if get_env == 'uat':
        env_url = data_util.get_env()['uat']
        user = data_util.get_user()['uat']
    return {'env_url': env_url, 'user': user}

注意fixture的使用范围为整个测试会话。

以下是完整的conftest

import pytest
import data_util
def pytest_addoption(parser):
    """
    添加命令行参数
    parser.addoption为固定写法
    default 设置一个默认值,此处设置默认值为sit
    choices 参数范围,传入其他值无效
    help 帮助信息
    """
    parser.addoption(
        "--env", default="sit", choices=["dev", "sit", "uat"], help="环境参数"
    )
@pytest.fixture(scope="session")
def get_env(request):
    return request.config.getoption("--env")
# 设置不同环境下的全局变量
@pytest.fixture(scope="session")
def set_env(get_env):
    if get_env == 'sit':
        env_url = data_util.get_env()['sit']
        user = data_util.get_user()['sit']
    if get_env == 'uat':
        env_url = data_util.get_env()['uat']
        user = data_util.get_user()['uat']
    return {'env_url': env_url, 'user': user}

定义测试类及测试方法

注意fixture不能在x-unit风格下的setup\teardown中引用,因此需要使用fixture定义setup、teardown方法才能引用到conftest里的fixture,一般我们在setup方法中初始化环境变量具体如下:

@pytest.fixture()
def class_fixture(set_env):
    print('setup_class')
    url = set_env.get('env_url')
    user = set_env.get('user')
    print(url, user)
    yield
    print('teardown class')

这样我们就在测试前把环境信息设置OK了。

测试验证

以下是测试方法

import pytest
pytestmark = pytest.mark.usefixtures("module_fixture")
@pytest.fixture(scope="module", params=["test_fixture"])
def module_fixture(request):
    param = request.param
    print("  SETUP module", param)
    yield param
    print("  TEARDOWN module", param)
@pytest.fixture()
def class_fixture(set_env):
    print('setup_class')
    url = set_env.get('env_url')
    user = set_env.get('user')
    print(url, user)
    yield
    print('teardown class')
@pytest.fixture(scope="function", params=[1, 2])
def function_fixture(request):
    param = request.param
    print("  SETUP function", param)
    yield param
    print("  TEARDOWN function", param)
@pytest.mark.usefixtures('class_fixture')
class TestFixture:
    def test_0(self, function_fixture):
        print("  RUN test0 with function_fixture", function_fixture)
    def test_1(self, module_fixture):
        print("  RUN test1 with module_fixture", module_fixture)
    def test_2(self, function_fixture, module_fixture):
        print(f"  RUN test2 with function_fixture {function_fixture} and module_fixture {module_fixture}")
    def test_env(self, get_env):
        print(f"The current environment is: get_env")
if __name__ == '__main__':
    pytest.main(['-v', '-s','--env=uat', 'test_fixture.py::TestFixture::test_0'])

我们首先填的uat命令运行,查看输出:

可以看出输出是正确的,我们再切换成sit试试:

if __name__ == '__main__':
    pytest.main(['-v', '-s','--env=uat', 'test_fixture.py::TestFixture::test_0'])

可以看出在不同的命令下获得的测试数据也不一样,这样我们就达到了环境切换的目的了~

到此这篇关于Python中pytest命令行实现环境切换的文章就介绍到这了,更多相关pytest 环境切换内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • django 数据库返回queryset实现封装为字典

    django 数据库返回queryset实现封装为字典

    这篇文章主要介绍了django 数据库返回queryset实现封装为字典,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-05-05
  • python实现炫酷屏幕保护的示例代码

    python实现炫酷屏幕保护的示例代码

    这篇文章主要为大家详细介绍了如何利用python实现炫酷屏幕保护效果,文中的示例代码讲解详细,具有一定的学习价值,感兴趣的小伙伴可以跟随小编一起了解一下
    2023-12-12
  • 利用Python脚本实现ping百度和google的方法

    利用Python脚本实现ping百度和google的方法

    最近在做SEO的时候,为了让发的外链能够快速的收录,想到了利用ping的功能,google和百度都有相关的ping介绍,有兴趣的朋友可以去看看相关的知识。下面这篇文章主要介绍了利用Python脚本实现ping百度和google的方法,需要的朋友可以参考借鉴,一起来看看吧。
    2017-01-01
  • Selenium多窗口切换解决方案

    Selenium多窗口切换解决方案

    本文主要介绍了Selenium多窗口切换解决方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-07-07
  • 如何使用Python VTK绘制线条

    如何使用Python VTK绘制线条

    这篇文章主要介绍了如何使用Python-VTK绘制线条,主要绘制直线和曲线,下面文章详细实现过程需要的小伙伴可以参考一下
    2022-04-04
  • 使用Python自动化生成PPT并结合LLM生成内容的代码解析

    使用Python自动化生成PPT并结合LLM生成内容的代码解析

    PowerPoint是常用的文档工具,但手动设计和排版耗时耗力,本文将展示如何通过 Python 自动化提取 PPT 样式并生成新 PPT,同时结合大语言模型(LLM)生成内容(如自我介绍文本),实现高效、个性化的 PPT 制作,需要的朋友可以参考下
    2025-05-05
  • 解决python3报错之takes 1 positional argument but 2 were given问题

    解决python3报错之takes 1 positional argument but 2 were gi

    这篇文章主要介绍了解决python3报错之takes 1 positional argument but 2 were given问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-03-03
  • opencv调整图像亮度对比度的示例代码

    opencv调整图像亮度对比度的示例代码

    本文通过实例代码给大家介绍了opencv调整图像亮度对比度,代码简单易懂,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-09-09
  • 一文详解Python中数据清洗与处理的常用方法

    一文详解Python中数据清洗与处理的常用方法

    在数据处理与分析过程中,缺失值、重复值、异常值等问题是常见的挑战,本文总结了多种数据清洗与处理方法,文中的示例代码简洁易懂,有需要的小伙伴可以参考下
    2025-01-01
  • Python在for循环里处理大数据的推荐方法实例

    Python在for循环里处理大数据的推荐方法实例

    这篇文章主要介绍了Python在for循环里处理大数据的推荐方法实例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2024-01-01

最新评论