干货 | 通用 api 封装实战,带你深入理解 PO

简介: 干货 | 通用 api 封装实战,带你深入理解 PO

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

理念

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

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

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

api 模式应用

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

环境准备

企业微信服务端API:接口文档 - 企业微信开发者中心

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())

思路

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


实战案例

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"

通用 api 封装实战

在apiobject设计模式中,需要一个“base_api”作为其他api步骤的父类,把通用功能放在这个父类中,供其他的api直接继承调用。这样做的优点在于,减少重复代码,提高代码的复用性。

上文在演示使用api-object设计模式对脚本进行改造时提到了base_api。不过在上文,仅仅只是封装了一个utils中的一个简单方法。并没有完全体现出base_api的实际作用。

接下来会通过通用接口协议的定义与封装实战,实际体会一下base_api的巧妙之处。

base_api.py,在代码内,对request进行一层封装,当然在这里还看不出来具体的优势:

import requests
class BaseApi:
    def request(self, method, url, **kwargs):
        self.json_data = requests.request(method=method, url=url, **kwargs)
        return self.json_data

wework.py,继承于类BaseApi,可以直接调用父类中的request方法(不需要导入requests库),从而发起一个get请求:

from test_interface.test_wework.api.base_api import BaseApi
class WeWork(BaseApi):
    corpid = "ww93348658d7c66ef4"
    contact_secret = "T0TFrXmGYel167lnkzEydsjl6bcDDeXVmkUnEYugKIw"
    token = dict()
    token_url = "https://qyapi.weixin.qq.com/cgi-bin/gettoken"
    def get_access_token(self):
        r = self.request(method="get", url=self.token_url,
                         params={"corpid": self.corpid, "corpsecret": self.contact_secret})
        return r.json()

test_wework.py,继承于类WeWork,主要目的只是为了检查上面的get_access_token(self) 是否成功:

from test_interface.test_wework.api.wework import WeWork
class TestWeWork(WeWork):
    def test_get_access_token(self):
        r = self.get_access_token()
        assert r["errcode"]==0

在上面的案例中,在base_api.py中对 requests 进行了多一层的封装,这样子,只要是属于BaseApi这个类的子类,都可以无需引用而直接调用 requests 库。从而发起各种各样的请求,实现了通用接口协议的定义与封装。


更多技术文章

相关文章
|
16天前
|
程序员 API 开发者
实战阿里qwen2.5-coder 32B,如何配置Cline的Ollama API接口。
阿里Qwen2.5大模型开源免费,适合编程应用。在Ollama平台下载时,推荐选择带有“cline”字样的Qwen2.5-Coder版本,仅需额外下载适配文件,无需重复下载模型文件。Ollama环境永久免费,配置简单,效果出色,适合开发者使用。
761 77
|
9天前
|
供应链 搜索推荐 API
深度解析1688 API对电商的影响与实战应用
在全球电子商务迅猛发展的背景下,1688作为知名的B2B电商平台,为中小企业提供商品批发、分销、供应链管理等一站式服务,并通过开放的API接口,为开发者和电商企业提供数据资源和功能支持。本文将深入解析1688 API的功能(如商品搜索、详情、订单管理等)、应用场景(如商品展示、搜索优化、交易管理和用户行为分析)、收益分析(如流量增长、销售提升、库存优化和成本降低)及实际案例,帮助电商从业者提升运营效率和商业收益。
79 17
|
3天前
|
XML API 开发者
探究获取亚马逊畅销榜API接口及实战应用
亚马逊MWS(商城网络服务)提供了一系列API接口,帮助开发者获取平台数据,其中畅销榜API尤为关键。通过注册开发者账号、创建应用并申请权限,可使用HTTP POST请求获取商品的销售排名、价格等信息。Python代码示例展示了如何构建和发送请求,并处理返回的XML或JSON数据。注意遵守亚马逊的频率限制、数据准确性和合规性要求,以确保安全合法地利用这些数据支持电商业务决策。
15 1
|
4天前
|
JSON 监控 API
获取1688商品SKU信息API接口及实战应用
在电商蓬勃发展的今天,数据成为宝贵的财富。1688作为国内知名批发采购平台,提供商品SKU信息API接口,可获取库存、价格、规格等关键数据,助力电商运营、市场分析和价格监控。本文介绍如何注册1688开放平台账号、创建应用并获取AppKey/AppSecret,申请API权限,使用Python实现接口调用,处理响应数据,并注意请求频率限制和错误处理。通过该接口,可为电商运营和数据分析提供有力支持。
21 2
|
6天前
|
安全 程序员 API
API对于程序员的多元用法:从基础到实战
API(应用程序编程接口)是现代软件开发中不可或缺的工具,充当不同系统间沟通的桥梁。通过API,程序员可以轻松获取外部数据、扩展应用功能、实现微服务间的通信等,极大提升开发效率和应用功能性。常见的API类型包括Web API、本地API和第三方API。使用API,开发者能快速集成复杂功能(如支付、物流跟踪),并确保数据安全与管理。掌握API的开发、维护及安全管理技巧,对构建高效、稳定的应用至关重要。随着数字化进程加速,API的重要性将不断提升。
19 1
|
25天前
|
安全 API 数据安全/隐私保护
速卖通AliExpress商品详情API接口深度解析与实战应用
速卖通(AliExpress)作为全球化电商的重要平台,提供了丰富的商品资源和便捷的购物体验。为了提升用户体验和优化商品管理,速卖通开放了API接口,其中商品详情API尤为关键。本文介绍如何获取API密钥、调用商品详情API接口,并处理API响应数据,帮助开发者和商家高效利用这些工具。通过合理规划API调用策略和确保合法合规使用,开发者可以更好地获取商品信息,优化管理和营销策略。
|
2月前
|
JSON BI API
商城上货API接口的实战案例
在商城上货过程中,API接口扮演着至关重要的角色。以下是对商城上货API接口的实战分析,涵盖其主要功能、类型、安全性以及实战案例等方面。
|
2月前
|
XML 数据可视化 API
商品详情数据实战案例,API接口系列
淘宝商品详情数据在电商领域具有广泛的应用价值,而淘宝商品详情API接口则为开发者提供了获取这些数据的重要途径。通过合理利用这些接口和数据,可以提升业务效率、优化用户体验,为电商行业的发展注入新的活力。
|
2月前
|
前端开发 API 开发者
Python Web开发者必看!AJAX、Fetch API实战技巧,让前后端交互如丝般顺滑!
在Web开发中,前后端的高效交互是提升用户体验的关键。本文通过一个基于Flask框架的博客系统实战案例,详细介绍了如何使用AJAX和Fetch API实现不刷新页面查看评论的功能。从后端路由设置到前端请求处理,全面展示了这两种技术的应用技巧,帮助Python Web开发者提升项目质量和开发效率。
68 1
|
2月前
|
存储 JSON API
淘宝API接口实战:高效获取商品标题、分类及店铺名称
在淘宝API接口实战中,通过以下步骤高效获取商品标题、分类及店铺名称:1. 准备工作:了解淘宝开放平台文档,注册开发者账号,选择开发语言和工具。2. 获取API访问权限:申请相应权限,提供应用场景说明。3. 调用API接口:构建HTTP请求,提供必要参数。4. 解析响应数据:提取JSON数据中的所需信息。5. 数据处理和存储:进一步处理并存储数据。6. 注意事项:遵守使用规范,注意调用频率和数据安全。示例代码使用Python调用淘宝API。

热门文章

最新文章