...

Pytest使用pytest.ini实现环境变量控制

测试框架中往往要实现环境切换和环境变量的选择,一般的实现方案

  • 使用pytest-base-url,切换base_url配置
  • 使用pytest-variables,配合不同的test.json/beta.json/prod.json文件来实现
    使用的问题
  1. 是json编辑容易出错
  2. 需要建立额外的多个数据文件

这里考虑借用pytest.ini来完成配置,由于pytest.ini实际只使用了一个[pytest]段,我们可以增加其他段的配置,比如

  • 增加全局变量[global]段
  • 增加不同环境的[test]、[beta]、[prod]段
    如下
# pytest.ini
[pytest]
addopts = -qs  
env = prod

[global]
a = 1
b = 2
[test]
a=2
[beta]
a=3
[prod]
a=4

这里我们需要增加一个命令行选项--env和配置项env来选择使用的环境,并根据环境加载对应环境的变量,全局变量则默认加载

# conftest.py
from configparser import ConfigParser
import pytest

def pytest_addoption(parser):
    parser.addoption("--env", action="store", help="choose env: test,beta,prod")
    parser.addini('env', help="choose env: test,beta,prod")


@pytest.fixture(scope='session')
def env_vars(request):
    config = request.config
    cur_env = config.getoption('--env') or  config.getini('env')
    inifile = config.inifile
    conf = ConfigParser()
    conf.read(inifile)
    variables = {}
    if conf.has_section('global'):
        variables.update(conf.items('global'))
    if conf.has_section(cur_env):
        variables.update(conf.items(cur_env))
    return variables

这里我们编写了一个名为env的fixture方法来拿到指定环境配置的变量,以及全局变量的内容,用例使用如

# test_demo1.py

def test_demo1(env_vars):
    print(env_vars)
posted @ 2021-07-06 00:31  韩志超  阅读(2161)  评论(0编辑  收藏  举报