使用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
鸡肉是我的最爱!