Pytest 测试框架动态切换测试环境

本贴最后更新于 472 天前,其中的信息可能已经时过境迁

背景

在自动化测试过程中,有时候我们需要切换不同的测试环境用于验证功能是否正常(比如在测试环境中功能是正常的,但是到了预发布环境中就出现了问题)。往往我们需要手动修改测试脚本中的配置适配在不同的环境执行,十分不优雅!

如果能在执行测试脚本之前指定对应环境进行自动化配置那就不需要手动一个个修改配置了,比如像pytest执行时可以通过传入丰富的内置命令行参数改变其测试行为。同样pytest也能支持自定义命令行参数,通过对应的参数选取对应的环境配置进行执行,实现这一需求可以通过pytest的hook函数。

关于pytest hook函数

Hook函数(钩子函数),它是pytest框架的开发者为了让用户更好的去扩展pytest的功能而预留的一些函数。而预留的这些函数在整个测试执行的生命周期中特定的阶段会被pytest自动调用执行。

关于pytest中的预留钩子,可以通过开发插件,和在conftest.py去实现这些钩子。pytest中的钩子函数按功能一共分为6类:引导钩子,初始化钩子、用例收集钩子、用例执行钩子、报告钩子、调试钩子,当然动态切换测试环境这个需求我们不需要熟悉所有的钩子函数,这里我们只需要知道pytest_addoption这个初始化钩子函数即可:

函数

pytest_addoption

参数
  • parser :参数解析器
  • pluginmanager :插件管理器
触发时机:
  • conftest文件加载完之后执行, 在测试运行开始时调用一次。
作用:
  • 添加运行命令的命令行参数,pytest.ini的配置参数

实现步骤

Step1:新增conftest.py文件,添加pytest_addoption钩子函数

def pytest_addoption(parser):
    """
    注册自定义参数命令行参数
    """
    parser.addoption("--env", default="test", choices=['dev', 'test', 'pre'],
                     help="命令行参数 '--env' 设置环境切换")

参数说明:

需要注意:钩子函数名字是固定的,不能随意更改

Step2:定义fixture函数,用于获取命令行参数

@pytest.fixture(scope='session')
def get_env(request):
    option = request.config.getoption("--env")
    if option == 'test':
        print("当前环境为测试环境")
    elif option == "dev":
        print("当前环境为开发环境")
    elif option == "pre":
        print("当前环境为预发布环境")

Step3:在测试函数上使用fixture

image20230731151028054.png

我们可以看到通过--env参数可以切换不同的环境执行,不加参数的情况下使用的是test环境。

Step4:fixture函数解析不同的配置

上述的步骤能够完成基本的命令行参数解析,但是离动态切换环境还差一步:我们需要通过不同的参数读取对应的配置文件,将配置文件信息解析出来传递给测试用例使用。

在项目的config目录下保存项目的不同环境配置文件:dev-env.ini、test-env.ini、pre-env.ini。文件中存储不同的环境参数值(比如URL、账号信息、数据库配置信息等),如下所示:

[host]
baseurl = http://test.lemonban.com

[account]
username = lemon_auto
password = lemon123456

[dbinfo]
url = http://db.lemonban.com
port = 3306
username = student
password = 123456a

image20230731153018604.png

通过在测试函数中引用fixture函数get_env,即可获取对应的配置参数值。

回帖
请输入回帖内容 ...