如何将参数化测试中的参数传递给装饰器?
问题分析与解决
你的核心问题出在装饰器顺序错误,以及装饰器内部变量引用错误,导致无法正确获取参数化的测试参数和API响应。
错误原因
- 装饰器顺序颠倒:
@pytest.mark.parametrize需要放在自定义装饰器@check_api_response的下方(更靠近测试方法)。装饰器的执行顺序是从下到上,先应用parametrize完成参数化,再应用自定义装饰器,这样装饰器才能捕获到参数化后的测试参数。 - 变量引用错误:原装饰器中未正确引用API响应对象,
request变量未定义,且测试方法未返回API响应给装饰器进行校验。
正确实现方案
方案一:装饰测试方法(保留原有测试结构)
调整装饰器顺序,并让测试方法返回API响应供装饰器校验:
import pytest def check_api_response(test_func): def wrapper(*args, **kwargs): # 调用测试方法,获取API响应 response = test_func(*args, **kwargs) # 校验API响应状态码 assert response.status_code == 200, f"API请求失败,状态码: {response.status_code}" return response return wrapper class TestCatalogs: # 注意装饰器顺序:先parametrize,再自定义装饰器 @check_api_response @pytest.mark.parametrize('car_type', [1, 2, 3, 4]) def test_car_type(self, car_type): # 调用API并获取响应 response = catalogs_get(car_type) catalog = response.json() assert catalog['type'] != '' # 返回响应给装饰器做状态码校验 return response
方案二:直接装饰API调用函数(更简洁)
如果希望所有调用该API的地方都自动校验响应状态,可以直接装饰catalogs_get函数:
import pytest def check_api_response(api_func): def wrapper(*args, **kwargs): response = api_func(*args, **kwargs) assert response.status_code == 200, f"API请求失败,状态码: {response.status_code}" return response return wrapper # 给API调用函数添加装饰器,自动校验状态码 @check_api_response def catalogs_get(car_type): # 此处是原API调用逻辑,比如requests.get(...) pass class TestCatalogs: @pytest.mark.parametrize('car_type', [1, 2, 3, 4]) def test_car_type(self, car_type): catalog = catalogs_get(car_type).json() assert catalog['type'] != ''
验证效果
调整后,装饰器的wrapper函数将能正确获取到参数化后的car_type参数,同时可以对API响应的状态码进行有效校验。
内容的提问来源于stack exchange,提问作者ShahTat
相关产品推荐
相关产品推荐

