测试之路 pytest接口自动化框架扩展-params数据解析

本文介绍了MeterSphere中如何解析GET请求的参数。通过遍历arguments节点下的列表,提取并验证每个参数,设定最大最小值,最终形成参数模板。适用于GET、DELETE、PUT等请求。

哈喽大家好,上期内容介绍了一下数据分流的一个函数。可以理解为我们日常生活中的经理角色。用来分配任务。本期就先介绍他手下的一个小弟,小p(params解析函数)。废话不多,昊料开始~

开篇

上期我们在展示数据分流的函数中,判断了一下当前接口是否为get。在MeterSphere中,get的接口参数相对简单 在MeterSphere的json文件中。request下面有一个arguments的节点。该节点内部就记录的是params类型的参数。如下所示。

"arguments": [
    {
      "contentType": "text/plain",
      "enable": true,
      "file": false,
      "name": "name",
      "required": true,
      "type": "text",
      "urlEncode": false,
      "valid": true
    },
    {
      "contentType": "text/plain",
      "enable": true,
      "file": false,
      "name": "age",
      "required": false,
      "type": "text",
      "urlEncode": false,
      "valid": true
    },
    {
      "contentType": "text/plain",
      "enable": true,
      "file": false,
      "required": false,
      "type": "text",
      "urlEncode": false,
      "valid": false
    }
  ]

可以看到。这是一个字典嵌套列表嵌套字典的数据格式。字典中的每个元素都记录了该接口字段的详细信息。

解析

首先分析数据结构。

  • 在arguments下是一个列表嵌套字典的模式。所以我们首先遍历这个列表。拿到列表内的所有字典。

  • 拿到字典以后先要判断一下这个数据是不是正常数据。判断依据就是这个数据里面是否包含正常的字段。

  • 下一步就是解析这个参数里面是否包含大小值,在MeterSphere中,最大值和最小值是非必填的,如果操作人没有填写该值,我们就要给他一个默认的最大值和最小值

  • 做完上述步骤校验后,就可以将参数提取出来,存入一个模板中,最后将组织好的数据交给”经理”。

# 解析params类型参数.常用与get/delete/put
def get_arguments(data):
    field = {}
    for i in data:
        if "name" in i.keys():
            try:
                if ("min" and "max") in i:
                    par = {
                        i["name"]: {
                            "required": str(i["required"]).lower(),
                            "max": i["max"],
                            "min": i["min"],
                            "type": "string",
                            "description": i["description"] if "description" in i else ""
                        }
                    }
                    field.update(par)
                else:
                    par = {
                        i["name"]: {
                            "required": str(i["required"]).lower(),
                           # MAX_LENGTH、MIN_LENGTH写死的常量
                            "max": MAX_LENGTH,
                            "min": MIN_LENGTH,
                            "type": "string",
                            "description": i["description"] if "description" in i else ""
                        }
                    }
                    field.update(par)
            except Exception as e:
                raise Exception(f"未知错误{e}")
    return field

params类型数据比较单一,情况也比较单一。当前阶段可以简单处理

小p同学完成了他的工作。并将工作成果交由经理。

结语

以上就是本期内容。小p同学的工作相对简单,无需考虑很多场景。下期我们介绍小j(json解析函数)的工作。

各位大佬。我们下期见

<think>首先,用户的问题是关于在Python中使用pytest接口自动化框架对requests库进行基类封装的方法。用户提供了多个引用,我需要参考这些引用来构建回答。 回顾引用: - 引用[1]:提到了Python+Pytest+Allure+Jenkins接口自动化框架,支持Excel或Json维护测试用例,数据库操作等。 - 引用[2]:展示了接口类的示例,其中有一个TestAPI类,它封装了登录和获取用户信息的方法,使用了BaseRequest类。 - 引用[3]:讨论了分层处理和基类封装的好处,包括代码复用、结构清晰等。 - 引用[4]:展示了项目级fixture和使用ApiKey类发送请求的例子。 用户的具体问题是:“我想查找使用Python语言结合pytest接口自动化框架对request进行基类封装方法 请问Python中基于pytest接口自动化框架对request进行基类封装”。所以,我需要解释如何封装一个基类用于处理HTTP请求。 回答结构: - 按照系统指令,回答要结构清晰,逐步解决问题。 - 使用中文。 - 对于数学表达式,使用$...$或$$...$$格式,但在这个上下文中,可能不太需要数学公式,除非涉及方程或变量。 - 末尾添加相关问题。 - 在引用的内容末尾添加引用标识。 关键点: 1. **解释基类封装的目的**:提高代码复用性,减少重复代码,使测试用例更简洁。 2. **描述BaseRequest类的实现**:基于引用[2]和[4],创建一个处理HTTP请求的基类。 - 导入requests库。 - 定义方法如send_request,处理GET、POST等请求。 - 包括异常处理和断言方法。 3. **集成到pytest框架**:使用fixtures来管理资源,如token或会话(引用[4])。 4. **示例代码**:提供一个完整的代码示例。 5. **好处**:参考引用[3],强调分层封装的优势。 步骤: 1. 介绍基类封装的概念和好处。 2. 展示如何创建BaseRequest类。 3. 展示如何在测试用例中使用这个基类。 4. 讨论pytest集成,如fixtures。 5. 添加相关问题。 确保回答真实可靠:基于提供的引用构建。例如: - 从引用[2]中提取BaseRequest的send_request方法。 - 从引用[4]中提取ApiKey类(可能是BaseRequest的别名)和fixture使用。 示例代码结构: - 创建一个BaseRequest类。 - 实现send_request方法。 - 添加断言方法,如assert_response。 -测试类中使用。 引用标识: - 在相关段落末尾添加[^1], [^2], 等。 相关问题: - 在结尾添加几个相关问题,如“如何优化请求封装?”或“如何处理认证?”。 最终回答大纲: 1. 引言:介绍封装请求基类的重要性。 2. 基类实现:详细代码示例。 3. pytest集成:使用fixtures。 4. 好处总结。 5. 相关问题和引用。 </think> ### Python中使用pytest接口自动化框架对requests进行基类封装方法 在接口自动化测试中,对HTTP请求进行基类封装是提高代码复用性、可维护性和效率的关键策略。通过创建一个通用的请求基类,您可以将请求发送、响应处理和断言逻辑集中管理,避免在每个测试用例中重复编写代码。参考提供的引用内容,我将逐步解释如何基于Python的`requests`库和`pytest`框架实现这种封装。 #### 1. **基类封装的目的和好处** - **目的**:封装`requests`库的功能,提供一个统一的接口用于发送HTTP请求(如GET、POST),并集成响应验证逻辑,使测试用例更简洁。 - **好处**: - **代码复用**:减少重复代码,提高开发效率(例如,所有测试用例共享同一个请求方法)[^3]。 - **结构清晰**:分层设计(如分离请求层、测试逻辑层)便于维护和扩展[^3]。 - **灵活性**:支持参数化请求、异常处理和认证管理(如Token获取)[^4]。 #### 2. **实现请求基类(BaseRequest)** 创建一个名为`BaseRequest`的基类,封装`requests`的核心功能。以下是完整代码示例,基于引用[2]和[4]的设计: ```python import requests import json class BaseRequest: def __init__(self): self.session = requests.Session() # 使用Session保持会话,提高性能 self.headers = {'Content-Type': 'application/json'} # 默认请求头 def send_request(self, method, url, params=None, data=None, headers=None, **kwargs): """发送HTTP请求并返回响应对象。 :param method: 请求方法,例如'GET'或'POST' :param url: 接口URL :param params: 查询参数(字典) :param data: 请求体数据(字典) :param headers: 自定义请求头(字典) :param kwargs: 其他requests参数(如timeout) :return: requests.Response对象 """ # 合并默认头和自定义头 final_headers = {**self.headers, **(headers or {})} try: # 根据方法发送请求 if method.upper() == 'GET': response = self.session.get(url, params=params, headers=final_headers, **kwargs) elif method.upper() == 'POST': response = self.session.post(url, json=data, headers=final_headers, **kwargs) else: raise ValueError(f"Unsupported HTTP method: {method}") return response except requests.exceptions.RequestException as e: raise RuntimeError(f"请求失败: {str(e)}") def assert_response(self, response, expected_status=200, expected_data=None): """验证响应状态码和内容。 :param response: 响应对象 :param expected_status: 预期状态码,默认200 :param expected_data: 预期响应数据(字典),例如{'success': True} """ assert response.status_code == expected_status, \ f"状态码错误: 预期{expected_status}, 实际{response.status_code}" if expected_data: response_data = response.json() for key, value in expected_data.items(): assert key in response_data, f"响应缺少字段: {key}" assert response_data[key] == value, \ f"字段{key}值错误: 预期{value}, 实际{response_data[key]}" ``` **关键点解析**: - **方法封装**:`send_request`方法支持多种HTTP方法(GET/POST),处理参数和异常,确保健壮性。 - **会话管理**:使用`requests.Session()`保持连接,减少重复握手开销。 - **断言集成**:`assert_response`方法验证状态码和响应内容,简化测试用例中的断言逻辑。 #### 3. **在pytest测试用例中使用基类** 将`BaseRequest`集成到pytest框架中,结合fixtures管理资源(如Token)。参考引用[4]的项目级fixture设计: ```python import pytest from base_request import BaseRequest # 导入上述基类 # 定义项目级fixture(整个测试会话只初始化一次) @pytest.fixture(scope='session') def api_client(): """初始化请求基类并返回实例,用于所有测试用例""" client = BaseRequest() # 可选:登录获取Token(如需要认证) login_url = 'http://api.example.com/login' login_data = {'username': 'test_user', 'password': 'test_pass'} response = client.send_request('POST', login_url, data=login_data) client.assert_response(response, expected_data={'success': True}) token = response.json()['token'] client.headers['Authorization'] = f'Bearer {token}' # 添加Token到请求头 return client # 示例测试用例 def test_get_user_info(api_client): """测试获取用户信息接口""" url = 'http://api.example.com/user_info' params = {'user_id': 123} response = api_client.send_request('GET', url, params=params) api_client.assert_response(response, expected_data={'id': 123, 'name': 'John Doe'}) ``` **关键点解析**: - **fixture使用**:`api_client` fixture在会话级别初始化`BaseRequest`,并处理登录认证,避免每个用例重复登录。 - **测试用例简化**:测试用例直接调用`send_request`和`assert_response`,专注于业务逻辑而非底层请求细节。 - **分层设计**:分离基类(请求层)、fixture(资源层)和测试用例(逻辑层),提升可维护性[^3]。 #### 4. **封装的好处与最佳实践** - **性能优化**:通过Session复用连接,减少网络开销,适合高频接口测试- **错误处理**:基类中的异常捕获确保测试失败时提供清晰错误信息。 - **扩展性**:可轻松添加新方法(如PUT/DELETE请求)或集成Allure报告生成[^1]。 - **统计指标**:在基类中添加性能监控(如响应时间记录),例如计算平均响应时间$\bar{t} = \frac{1}{n} \sum_{i=1}^{n} t_i$,帮助分析接口性能。 #### 5. **完整项目结构建议** 参考引用[1]和[4],推荐分层目录: ``` project/ ├── base_request.py # 存放BaseRequest基类 ├── conftest.py # pytest全局fixture(如api_client) ├── tests/ # 测试用例目录 │ └── test_user.py # 具体测试用例 ├── utils/ # 工具类 │ └── config.py # 配置文件读取 └── requirements.txt # 依赖库(requests, pytest等) ``` 通过这种封装,您能构建高效、可靠的接口自动化框架。如需进一步优化,可结合Excel/Json测试数据驱动(引用[1])或Jenkins持续集成[^1]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值