python pytest解析命令行env 和解析pytest.ini文件
从最根源获取pytest env.参数
env来源pytest.ini配置文件,通过解析pytest.ini获取到env值。
env来源命令行参数,解析执行命令时指定的–env获取到env值。
import sys
import configparser
import os
import re
import yaml
from config.settings import BASE_DIR
# 通过命令行获取到env值
def get_env_from_sys_argv():
print(len(sys.argv)) # 参数序列的长度,此时所有参数存放在一个list之中
if len(sys.argv) < 2:
return None
sys_argv_str = ",".join(sys.argv)
re_env_str = re.findall(r'--env,(\S+),', sys_argv_str)
if re_env_str:
env_str = re_env_str[0]
print(f"解析到命令行中的为env {env_str}")
return env_str
print(f"未解析到命令行中的env参数")
return None
# 通过解析pytest.ini 获取到env
def parse_pytest_ini():
# 实例化configParser对象
config = configparser.ConfigParser()
# -read读取ini文件
config.read(os.sep.join([BASE_DIR, "pytest.ini"]), encoding='GB18030')
"""
首先得到配置文件的所有分组,然后根据分组逐读取所有
"""
pytest_ini_map = {}
for sections in config.sections():
sections_map = {}
for items in config.items(sections):
sections_map[items[0]] = items[1]
if sections == "pytest" and items[0] == "addopts":
env_ls = re.findall(r'--env\s+(\S+)', items[1])
if env_ls:
pytest_ini_map["env_str"] = env_ls[0]
pytest_ini_map[sections] = sections_map
return pytest_ini_map
# 组合两种获取env方式,命令行获取到env优先级更高,如果两种方式都未能获取到env值则默认为test环境
def get_env_str():
default = "test" # 解析出错,或者未解析到env 返回test
try:
argv_env = get_env_from_sys_argv() # 如果从命令行解析到env 返回命令行env
if argv_env:
return argv_env
pytest_ini_map = parse_pytest_ini()
env_str = pytest_ini_map.get("env_str")
if env_str:
print(f"匹配到环境:{env_str}")
return env_str
else:
print(f"未匹配到环境,返回test")
return default
except Exception as e:
print(f"获取环境出错:{e},返回test")
return default
# 根据env获取到该env详细环境配置数据
def env_config(environment=None):
"""
Parse env config info
:param environment:对应环境
:return: 返回环境数据
"""
if not environment:
environment = get_env_str()
config_path = f'{BASE_DIR}/config/{environment}/{environment}_config.yml'
with open(config_path) as f:
env_configs = yaml.load(f, Loader=yaml.FullLoader)
return env_configs
应用场景
pytest根据环境判断是否运行测试案例
ENV_STR = get_env_str()
@pytest.mark.skipif("test" != ENV_STR, reason="只在test环境运行")
def test_only_run_in_test_case(env, mongodb):
print("只在test环境运行")
pytest fixture 中的params参数依赖环境场景
conftest.py中定义
ENV_STR = get_env_str()
rd = get_request_data_by_env(ENV_STR)
@pytest.fixture(scope="class", params=rd, autouse=False)
def request_data(request):
yield request.param