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

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

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

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="https://qyapi.weixin.qq.com/cgi-bin/department/list",
            params={"access_token": self.test_get_token(), "id": 1})
        assert r.json()["errcode"] == 0
        return print(r.json())
思路

改造后的文件结构:

├── __init__.py
├── api
│   ├── __init__.py
│   ├── base_api.py
│   ├── department.py
│   └── wework.py
├── data
│   └── department_list.yml
├── testcases
│   ├── __init__.py
│   └── test_department_list.py
└── utils
    ├── __init__.py
    └── utils.py
  • API

    * base_api.py 是封装用来所有 API 的通用方法,比如打印 Log、对断言工具做二次封装等,不牵涉和业务相关的操作;
    • wework.py 继承 base_api 并实现基本业务,之后所有的具体的业务资源继承自 wework,比如 token 的获取等;
    • department 继承自 wework,用来实现对应模块具体的业务逻辑,比如发送请求,请求内有什么参数等等。
  • testcases 文件夹内统一存放所有的测试用例,调用 API 对象实现业务并断言;
  • utils 文件夹内存放对其他功能封装,改进原生框架不足;
  • data 文件夹数据构造与测试用例的数据封装;

此外,还有配置模块与数据封装会在后面的章节进行具体的介绍。

APIObject 实战

utils.py,在此文件中封装一个 jsonpath 方法。

import json

from jsonpath import jsonpath

class Utils:
    @classmethod
    def jsonpath(cls, json_object, expr):
        return jsonpath(json_object, expr)

base_api.py,在此文件中调用utils中的jsonpath方法。

from test_wework.utils.Utils import Utils

class BaseApi:
    json_data = None

    def jsonpath(self, expr):
        return Utils.jsonpath(self.json_data, expr)

wework.py,继承类BaseApi,实现 token 的获取。将在后面“通用 API 封装”章节中详细讲述函数内部的设计。

class WeWork(BaseApi):
    corpid = "ww93348658d7c66ef4"
    contact_secret = "T0TFrXmGYel167lnkzEydsjl6bcDDeXVmkUnEYugKIw"
    token = dict()
    token_url = "https://qyapi.weixin.qq.com/cgi-bin/gettoken"

    @classmethod
    def get_token(cls, secret=contact_secret):
        # 避免重复请求,提高速度
        if secret not in cls.token.keys():
            r = cls.get_access_token(secret)
            cls.token[secret] = r["access_token"]
        return cls.token[secret]

    @classmethod
    def get_access_token(cls, secret):
        r = requests.get(cls.token_url, params={"corpid": cls.corpid, "corpsecret": secret})
        return r.json()

department.py,继承类WeWork,发起一个 get 请求,获取 department 的 list。

class Department(BaseApi):
    list_url = "https://qyapi.weixin.qq.com/cgi-bin/department/list"

    def list(self, id):
        self.json_data = requests.get(self.list_url, params={"access_token": WeWork.get_contact_token(), "id": id}).json()
        return self.json_data

test_department.py,断言返回值中的第一个 name 是否为"WestWayyt"。

class TestDepartment:
    department = Department()

    def test_department_list(self):
        r = self.department.list(1)
        assert self.department.jsonpath(expr="$..name")[0] == "WestWayyt"

以上,更多接口测试框架实战进阶内容,我们在后续文章分享。

更多技术文章分享及测试资料

相关文章
|
1月前
|
机器学习/深度学习 自然语言处理 API
query改写:大模型应用测试离不开的实践
queryrewrite 是一个用于大模型应用测试的 Python 库,专注于查询(query)的改写与验证。它支持多种改写方法,包括大型语言模型(LLM)、词汇表替换和同义词替换,同时提供多种验证方法如 ROUGE-L、BLEU、帕累托最优和LLM语义相似度,以确保改写后的查询在语义上保持一致。该项目特别优化了对中文文本的处理,涵盖分词和相似度计算。用户可通过 pip 安装,并支持扩展不同的 LLM 模型,如 OpenAI、Ollama 等。
327 87
query改写:大模型应用测试离不开的实践
|
1月前
|
JSON 自然语言处理 算法
大模型应用测试必备技能:问题对生成实践
本文介绍了利用LangChain的QAGenerationChain从文本生成问题-答案对(QA pairs)的方法,旨在解决LLM应用开发中测试数据生成的格式不统一、库版本过时、模型输出异常及代码可维护性差等问题。文中提供了完整的代码实现,并对生成结果进行了有效性评估,包括语义相似度检查、关键词匹配和重复性检测,确保生成的QA对质量可靠,适用于知识库测试与评估。
248 86
|
2月前
|
Web App开发 开发框架 .NET
Playwright 自动化测试系列(6)| 第三阶段:测试框架集成​指南:参数化测试 + 多浏览器并行执行
Pytest 与 Playwright 集成可提升自动化测试效率,支持参数化测试、多浏览器并行执行及统一报告生成。通过数据驱动、Fixture 管理和并行优化,显著增强测试覆盖率与执行速度,适用于复杂 Web 应用测试场景。
|
1月前
|
SQL 安全 Linux
Metasploit Pro 4.22.8-2025073001 (Linux, Windows) - 专业渗透测试框架
Metasploit Pro 4.22.8-2025073001 (Linux, Windows) - 专业渗透测试框架
79 0
|
2月前
|
测试技术 API C++
Playwright 自动化测试系列(7)| 第三阶段:测试框架集成​​Page Object 模式
本课程详解Playwright测试框架中的Page Object模式,通过电商登录-下单实战演示PO架构设计与高级技巧,结合Pytest实现多用户测试。重点解析PO模式提升代码复用性、降低维护成本的核心价值,并提供常见问题解决方案,助力构建高可维护性的自动化测试体系。
|
2月前
|
Java 测试技术 API
自动化测试框架深度解析与选择指南
Apache JMeter是Apache组织基于Java开发的一款压力测试工具,旨在测试软件的性能承受能力。它支持多种协议测试及功能测试,提供灵活的断言创建能力,如同创建带断言的脚本来验证程序是否返回预期结果。
|
3月前
|
Java 测试技术 容器
Jmeter工具使用:HTTP接口性能测试实战
希望这篇文章能够帮助你初步理解如何使用JMeter进行HTTP接口性能测试,有兴趣的话,你可以研究更多关于JMeter的内容。记住,只有理解并掌握了这些工具,你才能充分利用它们发挥其应有的价值。+
690 23
|
8月前
|
数据可视化 前端开发 测试技术
接口测试新选择:Postman替代方案全解析
在软件开发中,接口测试工具至关重要。Postman长期占据主导地位,但随着国产工具的崛起,越来越多开发者转向更适合中国市场的替代方案——Apifox。它不仅支持中英文切换、完全免费不限人数,还具备强大的可视化操作、自动生成文档和API调试功能,极大简化了开发流程。
|
5月前
|
SQL 安全 测试技术
2025接口测试全攻略:高并发、安全防护与六大工具实战指南
本文探讨高并发稳定性验证、安全防护实战及六大工具(Postman、RunnerGo、Apipost、JMeter、SoapUI、Fiddler)选型指南,助力构建未来接口测试体系。接口测试旨在验证数据传输、参数合法性、错误处理能力及性能安全性,其重要性体现在早期发现问题、保障系统稳定和支撑持续集成。常用方法包括功能、性能、安全性及兼容性测试,典型场景涵盖前后端分离开发、第三方服务集成与数据一致性检查。选择合适的工具需综合考虑需求与团队协作等因素。
583 24
|
5月前
|
SQL 测试技术
除了postman还有什么接口测试工具
最好还是使用国内的接口测试软件,其实国内替换postman的软件有很多,这里我推荐使用yunedit-post这款接口测试工具来代替postman,因为它除了接口测试功能外,在动态参数的支持、后置处理执行sql语句等支持方面做得比较好。而且还有接口分享功能,可以生成接口文档给团队在线浏览。
215 2