pytest 框架之外解析环境

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
    
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值