测试框架中往往要实现环境切换和环境变量的选择,一般的实现方案
- 使用pytest-base-url,切换base_url配置
- 使用pytest-variables,配合不同的test.json/beta.json/prod.json文件来实现
使用的问题
- 是json编辑容易出错
- 需要建立额外的多个数据文件
这里考虑借用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(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 vars
这里我们编写了一个名为env的fixture方法来拿到指定环境配置的变量,以及全局变量的内容,用例使用如
# test_demo1.py
def test_demo1(env):
print(env)