专栏首页测吧测试开发接口测试框架实战(三) | APIObject 模式、原则与应用
原创

接口测试框架实战(三) | 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="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"

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

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • pytest 自动化测试框架(二)

    在上一篇文章中分享了 pytest 的基本用法,本文进一步介绍 pytest 的其他实用特性和进阶技巧。

    霍格沃兹测试开发
  • 接口测试框架实战(四) | 通用 API 封装实战

    在 APIObject 设计模式中,需要一个 base_api 作为其他 API 步骤的父类,把通用功能放在这个父类中,供其他的 API 直接继承调用。这样做的...

    霍格沃兹测试开发
  • Python 自动化测试(三): pytest 参数化测试用例构建

    在之前的文章中主要分享了 pytest 的实用特性,接下来讲 Pytest 参数化用例的构建。

    霍格沃兹测试开发
  • 竞赛币GUS上线CoinTiger交易平台,竞猜公平触手可及

    近日,CoinTiger交易平台发布公告称将于5月30日16:00(新加坡时间)正式上线GUS,并将于6月6日16:00(新加坡时间)开放提币。

    区块链领域
  • 你可能没想过,最懂用户体验的其实是【外挂】

    说起用户体验,可能想到的是产品经理,觉得他们创造了产品,在产品中纵横捭阖,挥斥方遒,谈笑间用户俯首称臣,乖乖使用产品。但是现实中的产品经理可能是这样的:

    飞雪无情
  • 【转】配置子目录Web.config使其消除继承,用虚拟目录创建多个网站的方法

    原文链接:http://www.wtnzone.com/post/2011/02/20/Set-Web-Config-to-Turn-Inheritance-O...

    thz
  • iOS拍照图片旋转的问题

      很久之前,遇到了这种情况,iOS某端拍照上传到服务器,其他iOS端从服务器下载该照片展示,发现图片逆时针旋转了90度。当时百度了一下,找到一段代码修正ima...

    王大锤
  • Node.js官方披露安全漏洞,建议尽快升级

    ↓↓↓ 了解更多漏洞详情,点击 https://nodejs.org/en/blog/vulnerability/august-2018-security-re...

    TSW
  • Node.js官方披露安全漏洞,建议尽快升级

    TSW
  • Java基础-21(02)总结字符流,IO流编码问题,实用案例必做一遍

    C:把集合中的数据存储到文本文件 package cn.itcast_02; import java.io.BufferedWriter; import jav...

    Java帮帮

扫码关注云+社区

领取腾讯云代金券