使用Python与PyTest测试API的参数维护痛点及解决方法咨询
解决API测试中参数名维护的问题
方案一:用常量统一管理参数/字段名
把所有API请求参数、响应字段名定义在单独的常量文件里,所有代码都引用这些常量,避免硬编码字符串。
- 创建常量文件
constants.py:
# constants.py # API响应字段 RESPONSE_FIELDS = { "USER_NAME": "name", "USER_LASTNAME": "lastname" } # API请求参数 REQUEST_PARAMS = { "PARAM_1": "parameter1", "PARAM_2": "parameter2" }
- 修改测试代码:
from constants import RESPONSE_FIELDS from http import HTTPStatus def test_stackoverflow(): response = stackoverflow(parameter1, parameter2) assert response.status_code == HTTPStatus.OK data = response.json() assert type(data[RESPONSE_FIELDS["USER_NAME"]]) is str assert data[RESPONSE_FIELDS["USER_LASTNAME"]] == "Wilson"
- 修改API调用函数:
from constants import REQUEST_PARAMS def stackoverflow(parameter1, parameter2): return my_session.post("/api/endpoint", params={ REQUEST_PARAMS["PARAM_1"]: parameter1, REQUEST_PARAMS["PARAM_2"]: parameter2 })
后续字段/参数名变更时,只需要修改constants.py里的对应值,所有引用处会自动同步,也不用再记忆具体字符串。
方案二:用数据类封装响应数据
通过Python的dataclass把API响应数据转换成类实例,用点语法访问字段,IDE会提供自动补全,彻底摆脱记忆字典键名的麻烦。
- 定义响应数据类:
from dataclasses import dataclass from constants import RESPONSE_FIELDS @dataclass class UserInfo: name: str lastname: str def parse_user_response(response_data): return UserInfo( name=response_data[RESPONSE_FIELDS["USER_NAME"]], lastname=response_data[RESPONSE_FIELDS["USER_LASTNAME"]] )
- 修改测试代码:
def test_stackoverflow(): response = stackoverflow(parameter1, parameter2) assert response.status_code == HTTPStatus.OK data = response.json() user_info = parse_user_response(data) assert type(user_info.name) is str assert user_info.lastname == "Wilson"
如果后续字段名变更,只需要修改parse_user_response函数里的映射逻辑,测试代码里的user_info.name这类引用会在IDE中直接报错提示,方便批量修改。
方案三:结合Fixture封装请求与响应逻辑
把API请求、响应解析的逻辑放到pytest的Fixture里,测试用例只关注业务断言,进一步降低维护成本。
import pytest from dataclasses import dataclass from constants import RESPONSE_FIELDS, REQUEST_PARAMS from http import HTTPStatus @dataclass class UserInfo: name: str lastname: str @pytest.fixture def fetch_user(): def _fetch(parameter1, parameter2): # 发起请求 response = my_session.post("/api/endpoint", params={ REQUEST_PARAMS["PARAM_1"]: parameter1, REQUEST_PARAMS["PARAM_2"]: parameter2 }) # 统一断言状态码 assert response.status_code == HTTPStatus.OK # 解析响应为数据类实例 data = response.json() return UserInfo( name=data[RESPONSE_FIELDS["USER_NAME"]], lastname=data[RESPONSE_FIELDS["USER_LASTNAME"]] ) return _fetch def test_stackoverflow(fetch_user): user_info = fetch_user(parameter1, parameter2) assert type(user_info.name) is str assert user_info.lastname == "Wilson"
这个方案让测试用例更简洁,所有参数、字段的维护都集中在Fixture和常量文件中,后续变更只需修改这两处即可。
内容的提问来源于stack exchange,提问作者ᴜsᴇʀ
相关产品推荐
相关产品推荐

