如何在pytest夹具中获取测试函数名、参数并手动执行
在pytest Fixture中手动执行测试函数的实现方案
针对你需要在数据库刷新前后各执行一次测试的场景,可以通过pytest内置的request fixture获取测试函数的上下文信息,进而手动调用测试函数。以下是具体实现:
核心实现思路
利用request fixture提供的测试上下文,获取当前测试函数的对象、参数及对应值,然后在fixture的执行流程中,分别在数据库刷新前后调用测试函数。
完整代码示例
import pytest # 替换为你的数据库刷新函数导入 from your_db_module import refresh_test_database @pytest.fixture(autouse=True) def run_test_before_after_refresh(request): # 获取当前测试函数对象 test_function = request.function # 获取测试函数的参数列表 func_param_names = test_function.__code__.co_varnames[:test_function.__code__.co_argcount] # 收集参数对应的值:处理fixture类型参数 param_values = [] for param_name in func_param_names: try: # 从request中获取fixture参数的实例 param_val = request.getfixturevalue(param_name) param_values.append(param_val) except pytest.FixtureLookupError: # 非fixture参数需自行处理,这里直接抛出异常提示 raise ValueError(f"测试函数参数 {param_name} 不是已定义的fixture,请手动配置参数值") # 1. 数据库刷新前执行测试 print(f"执行测试: {test_function.__name__}(刷新前)") test_function(*param_values) # 执行数据库刷新操作 refresh_test_database() print("测试数据库已完成刷新") # 2. 数据库刷新后再次执行测试 print(f"执行测试: {test_function.__name__}(刷新后)") test_function(*param_values) # 示例测试函数 def test_data_consistency(test_db_connection): # 你的测试逻辑:验证数据库数据符合预期 current_data = fetch_db_data(test_db_connection) assert current_data == expected_data_set
关键细节说明
获取测试函数信息
request.function:直接拿到当前测试的函数对象,test_function.__name__就是测试函数的名称- 通过
test_function.__code__.co_varnames和co_argcount提取测试函数的参数列表
处理测试参数
- 对于测试函数中的fixture类型参数,使用
request.getfixturevalue(param_name)获取其初始化后的实例 - 如果测试函数包含非fixture参数,需要根据业务逻辑手动传入对应值(示例中抛出异常提示需手动处理)
- 对于测试函数中的fixture类型参数,使用
手动执行测试函数
- 通过
test_function(*param_values)的方式,传递参数并执行测试函数,实现刷新前后两次测试的执行
- 通过
可选调整
- 如果不需要该fixture自动作用于所有测试,移除
autouse=True,在需要的测试函数上显式添加run_test_before_after_refreshfixture - 若测试函数是参数化的,可通过
request.param获取当前参数化值,整合到参数列表中执行
内容的提问来源于stack exchange,提问作者faked human mao
相关产品推荐
相关产品推荐

