測試框架中往往要實現環境切換和環境變量的選擇,一般的實現方案
- 使用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_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)