使用pytest钩子,替换测试数据,自动命名ids

注意,以下内容放在conftest.py文件中

0、动态替换测试数据:

# 替换数据
def pytest_collection_modifyitems(config, items):
    value_list = set()
    g_price = {}
    for item in items:
        data_get_value(item.callspec.params["case"],value_list)
    print(value_list)
    if value_list:
        asyncio.run(get_exchange_price(value_list,g_price))
    print(f"g_price{g_price}")
    if g_price:
        for item in items:
            try:
                replace_data(item.callspec.params["case"],g_price)
            except:
                print("替换测试数据失败")
# 遍历获取要替换的值
def data_get_value(obj, value_list):
    if isinstance(obj, dict):
        for key, value in obj.items():
            if key in ["price","limitPrice","initialPrice"] and isinstance(value, str) and value.startswith("@"):
                value_list.add(value)
            else:
                obj[key] = data_get_value(value, value_list)  
    elif isinstance(obj, list):
        for i in range(len(obj)):
            obj[i] = data_get_value(obj[i], value_list)  
    elif isinstance(obj, str):
        pass
    return obj  

1、命令行接受一个参数  如:--env  赋值给全局变量

2、pytest 自定义ids

# 接收一个env命令行参数
def pytest_addoption(parser):
    parser.addoption("--env", action="store", default="", help="输入测试环境名称")


# 把命令行参数赋值到全局配置
def pytest_configure(config):
    if config.getoption('--env'):
        g_am.env = config.getoption('--env')
        g_gs.env = config.getoption('--env')


def pytest_make_parametrize_id(val, argname):
    # 自定义 id 的生成规则
    if isinstance(val, dict) and 'testname' in val:
        return val.get("testname")
    else:
        return f"invalid_param_{argname}"

3、pytest 在yml文件中添加自定义tag(即 pytest的mark)。执行单条用例时使用-m 执行,yml中的用例使用tag:mark1,mark2

4、pytest 继承allure报告,使用--reruns 插件时,用例数量匹配,可以使用 pytest_runtest_makereport添加rerun标记

def pytest_collection_modifyitems(config, items):
    for item in items:
        tag = item.callspec.params["case"].get("tag")
        if tag:
            tag_list = tag.split(",")
            for t in tag_list:
                item.add_marker(getattr(pytest.mark, t))


def pytest_runtest_makereport(item, call):
    if call.when == "call":
        if call.excinfo is not None:
            test_id = item.nodeid
            item.user_properties.append(("rerun", "true"))
            allure.dynamic.description(f"Test failed and was retried.{test_id}")
        else:
            item.user_properties.append(("rerun", "false"))

    return None  # Continue processing

 

posted on 2025-03-27 14:08  老吃鸡  阅读(32)  评论(0)    收藏  举报

导航