python+pytest接口自动化之测试函数、测试类/测试方法的封装

本文介绍如何在Python pytest框架下封装接口自动化测试,包括测试用例的封装规则,测试函数和测试类的方法,以及示例代码。重点强调了测试函数必须以test开头,测试类以Test开头,并提供了相关命名规范。

前言

今天呢,笔者想和大家聊聊python+pytest接口自动化中将代码进行封装,只有将测试代码进行封装,才能被测试框架识别执行。

例如单个接口的请求代码如下:

import requests

headers = {
    "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.51 Safari/537.36"
}

url = "https://mp.toutiao.com/profile_v4/"
res = requests.get(url=h_url, headers=headers)

假设我们需要将上面这段代码编写成测试框架能执行的测试用例,仅仅只是这样写代码显然是不够的,还需要进行如下补充:

  • 需要将代码封装成单元测试框架 (pytest或unittest) 能识别的测试函数或测试类,否则将不会被识别执行。
  • 需要加上断言,即结果与期望之间的对比,单元测试框架才能判定该用例执行结果是否通过,结果==期望则说明通过,否则失败。

python中函数以及类的封装这里不做过多说明,这篇文章的目的是让大家明白在接口自动化测试中一般怎样封装测试代码

一、测试用例封装的一般规则

测试用例的封装有两种,测试函数和测试类,封装的一般规则如下:

  • 一个测试函数对应一条测试用例。
  • 测试类中可定义多个测试方法,一个测试方法对应一条测试用例,测试类可以看作是一个测试用例集。
  • pytest中测试函数或测试方法的命名必须以test开头,测试类名必须以Test开头。具体命名规则可以参考我之前的文章pytest(3)-测试命名规则。
  • 对于单接口的测试校验,一个单接口的测试用例只包含一个接口请求,即将一个接口请求封装成一个测试函数或测试方法。
  • 对于场景(多接
<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]。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值