接口测试框架实战(三) | APIObject 模式、原则与应用

APIObject模式在接口测试框架的应用实战
本文介绍了APIObject设计模式在接口测试中的应用,通过企业微信部门管理接口为例,展示从无封装到使用APIObject模式的封装改造过程。文章详细讲解了APIObject的6个模块,并提供了环境准备、接口测试框架、文件结构和具体实现的思路,旨在帮助读者深入理解并实践APIObject设计模式。

本文节选自霍格沃玆测试学院内部教材,文末链接进阶学习。

APIObject 模式与原则
在普通的接口自动化测试中,如果接口的参数,比如 url,headers 等传参改变,或者测试用例的逻辑、断言改变,那么整个测试代码都需要改变。APIObject 设计模式借鉴了 PageObject 的设计模式,可以实现一个优雅、强大的接口测试框架。

理念

APIObject 设计模式可以简单分为 6 个模块,分别是 API 对象、接口测试框架、配置模块、数据封装、Utils、测试用例。

  • 接口测试框架:base_api,完成对 API 的驱动
  • API 对象:继承 base_api 后,完成对接口的封装
  • 配置模块:完成配置文件的读取
  • 数据封装:数据构造与测试用例的数据封装
  • Utils:其他功能封装,改进原生框架不足
  • 测试用例:调用 Page/API 对象实现业务并断言

枯燥的讲述概念可能难以理解,后面的章节都会围绕这个6个模块进行理论的拆解和实例的演示。

APIObject 模式应用

本章将结合企业微信的部门管理,获取部门列表接口作为一个接口测试用例,从没有封装到使用APIObject 设计模式进行封装改造。将实战与理论结合,更深入理解 APIObject 设计模式。

环境准备

企业微信服务端 API:
https://work.weixin.qq.com/api/doc/90000/90135/90664
不加任何封装和改造的企业微信,获取部门列表接口测试用例:

import requests


class TestDemo:

    def test_get_token(self):
        r = requests.get(url="https://qyapi.weixin.qq.com/cgi-bin/gettoken",
            params={
   
   "corpid": "ww93348658d7c66ef4", "corpsecret": "T0TFrXmGYel167lnkzEydsjl6bcDDeXVmkUnEYugKIw"})
        return r.json()["access_token"]

    def test_department_list(self):
        r = requests.get(url=
<think>我们注意到用户想要获取关于“接口测试框架实战案例及方法”的内容。根据引用内容,我们可以整合以下信息: 引用[1]提到: - 使用requests库进行接口测试并处理复杂场景 - 利用unittest框架组织和执行测试用例 - 采用数据驱动测试策略 引用[2]强调了接口文档测试的关键点: - 确保开发提供完整接口文档(URL/方法/Header/参数等) - 检查接口设计规范(命名/格式/状态码/容错等) 引用[3]则是推广内容,无实质技术信息。 因此,我们将重点构建基于Python的接口测试框架实战方案,包含以下核心模块: 1. 基础请求模块(requests封装) 2. 测试用例管理(unittest) 3. 数据驱动实现 4. 接口文档校验方法 下面开始具体实现: </think>### 接口测试框架实战案例方法 #### 一、接口测试框架核心组件 基于引用内容[1][2],完整的接口测试框架需包含以下模块: 1. **请求封装层**:使用 `requests` 库封装 HTTP 请求 ```python import requests class RequestClient: def __init__(self, base_url): self.base_url = base_url def send_request(self, method, endpoint, params=None, json=None, headers=None): url = f"{self.base_url}{endpoint}" return requests.request(method, url, params=params, json=json, headers=headers) ``` 2. **测试用例管理**:通过 `unittest` 组织用例(引用[1]) ```python import unittest class APITestCase(unittest.TestCase): @classmethod def setUpClass(cls): cls.client = RequestClient("https://api.example.com") def test_user_login(self): response = self.client.send_request("POST", "/login", json={"username": "test", "password": "123456"}) self.assertEqual(response.status_code, 200) self.assertIn("token", response.json()) ``` 3. **数据驱动测试**:使用 `ddt` 实现(引用[1]) ```python import ddt @ddt.ddt class DataDrivenTest(unittest.TestCase): @ddt.data( {"query": "apple", "expected_count": 15}, {"query": "banana", "expected_count": 8} ) @ddt.unpack def test_search_api(self, query, expected_count): response = self.client.send_request("GET", "/search", params={"q": query}) self.assertEqual(len(response.json()["results"]), expected_count) ``` #### 二、实战优化技巧 1. **接口文档验证**(引用[2]关键点) - 校验必填项:使用 `jsonschema` 验证响应结构 ```python from jsonschema import validate schema = { "type": "object", "properties": { "code": {"type": "integer"}, "data": {"type": "object"} }, "required": ["code", "data"] } def test_response_schema(self): response = self.client.send_request("GET", "/user/1") validate(instance=response.json(), schema=schema) ``` 2. **稳定性增强** - 重试机制处理偶发失败 ```python from tenacity import retry, stop_after_attempt @retry(stop=stop_after_attempt(3)) def call_flaky_api(): return requests.get("https://api.example.com/flaky-endpoint") ``` 3. **持续集成集成** - 结合 Jenkins/GitHub Actions 实现自动化执行 #### 、典型实战案例 **电商订单场景测试链** ```python class OrderWorkflowTest(unittest.TestCase): def test_order_workflow(self): # 1. 登录获取token login_res = self.client.send_request("POST", "/login", json={"user": "test"}) token = login_res.json()["token"] # 2. 创建订单 order_res = self.client.send_request( "POST", "/orders", json={"product_id": 100}, headers={"Authorization": f"Bearer {token}"} ) order_id = order_res.json()["order_id"] # 3. 支付校验 pay_res = self.client.send_request( "POST", f"/orders/{order_id}/pay", headers={"Authorization": f"Bearer {token}"} ) self.assertEqual(pay_res.json()["status"], "PAID") ``` #### 四、关键注意事项 1. **接口文档规范**(引用[2]核心要求) - 强制要求提供包含以下内容的文档: $$ \text{文档要素} = \left\{ \begin{array}{c} \text{URL} \\ \text{请求方法} \\ \text{Header 规范} \\ \text{入参结构} \\ \text{返回值定义} \\ \text{状态码说明} \end{array} \right\} $$ 2. **安全测试扩展** - 增加 SQL 注入测试:`/search?q=' OR 1=1--` - 敏感数据加密验证 --- ### 相关问题 1. 如何处理接口测试中的动态令牌认证? 2. 如何设计可维护的接口测试数据工厂? 3. 接口性能测试应该关注哪些核心指标? 4. 微服务架构下如何实现契约测试? > 引用说明: > [^1]: Python接口测试实战案例技巧 > [^2]: 接口文档测试规范要点
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值