API Object设计模式

API测试面临的问题

API测试由于编写简单,以及较高的稳定性,许多公司都以不同工具和框架维护API自动化测试。我们基于seldom框架也积累了几千条自动化用例。

•简单的用例

import seldomclass TestRequest(seldom.TestCase):def test_post_method(self):self.post('/post', data={'key':'value'})self.assertStatusCode(200)def test_get_method(self):payload = {'key1': 'value1', 'key2': 'value2'}self.get("/get", params=payload)self.assertStatusCode(200)if __name__ == '__main__':seldom.main(base_url="http://httpbin.org")

•场景测试用例

在复杂场景中,比如,多个接口会用到的一些公共接口。

首先,封装一个公共类。

# common.py
from seldom.request import check_response 
from seldom.request import HttpRequestclass Common(HttpRequest):@check_response(describe="获取登录用户名",status_code=200,ret="headers.Account",check={"headers.Host": "httpbin.org"},debug=True)def get_login_user(self):"""调用接口获得用户名"""headers = {"Account": "bugmaster"}r = self.get("http://httpbin.org/get", headers=headers)return r

然后,调用common编写用例。

import seldom
from common import Commonclass TestRequest(seldom.TestCase):def start(self):self.c = Common()def test_case(self):# 调用 get_login_user() 获取user = self.c.get_login_user()self.post("http://httpbin.org/post", data={'username': user})self.assertStatusCode(200)if __name__ == '__main__':seldom.main(debug=True)

•其他用例

还有一些用例是通过数据驱动文件(CSV\EXcel…等)维护的,这里就不举例了。

以上写法基本没有问题。但是,随着参与编写自动化的人变多,自动化用例不断增加。一些问题就暴露出来了。

比如,A测试需要多条用例需要用到登录token,于是,将一个登录API封装成一个user_login()使用。B测试遇到这个场景大概率也会这么干!同样封装一个user_login()使用。庞大的自动化项目中会存在大量类似的冗余代码。当登录的API发生变化的时候,所有涉及到的用例或封装都需要修改。这个维护成本是很高的。

实际上,我们的项目就正在面临这个严重的问题。整个API自动化项目分多个团队,几十个人参与编写API测试用例&提交代码。没有引入清晰的分层设计,形成这些问题几乎是必然的。

API Object Models

API Object Models,简称AOM,AOM是一种设计模式,它围绕着将API、路由或功能交互及其相关行为封装在结构良好的对象中。AOM旨在增强API测试和集成的直观性和弹性。在实践中,AOM需要精心设计专门的API对象,以有效地保护用户免受与API 请求、响应、端点交互和身份验证过程相关的复杂性的影响。

基本概念

AOM基本用法

我们可以将业务高度关联的一组API封装为一个APIObject。例如,一个购物网站的API测试,我们可以创建一个OrderAPIObject来抽象化订单过程的复杂性。该对象封装了将商品添加到购物车、设置收件详细信息和下订单所需的API请求。测试脚本只需要与OrderAPIObject交互,从而简化了测试过程。

class OrderAPIObject:def add_item_to_cart(self, item_id: str):"""发出API请求和向购物车添加商品:param item_id::return:"""...def set_shipping_details(self, details):"""通过API请求设置收件信息:param details::return:"""...def place_order(self):"""下订单并接收确认:return:"""...

创建API对象技巧

为了创建强大的API对象,让我们进一步以OrderAPIObject为例。在此对象中,可以优雅地处理来自API的错误响应等场景。

class OrderAPIObject:def __init__(self):# 调用前置方法self.prepare_order()def prepare_order(self):"""准备下订单所需的项目和元素:return:"""...def place_order(self) -> dict:"""下订单,以及处理错误响应:return: OrderConfirmation ErrorResponse"""...

可以在下单之前,调用prepare_order()方法执行一些下单的前置工作。place_order()方法可以包含处理异常的响应,以及返回错误结果,以便测试保持弹性。

简单和灵活之间的平衡

任何设计模式的一个关键考虑因素是在简单性和灵活性之间找到适当的平衡。

例如,一个处理用户注册的API。在AOM 中,可以选择将用户注册数据作为单独的参数传递,或者将它们封装在User对象(或接口)中。选择取决于测试的可读性和可维护性要求。

class UserAPIObject:def register1(self, name: str, email: str, password: str):"""实现用户注册API:param name::param email::param password::return:"""...def register2(self, user: dict):"""实现用户注册API:param user::return:"""name = user.get("name", "")email = user.get("email", "")password = user.get("password", "")...

其中,register1()方法定义API所需要的每一个参数。当参数非常多时,也可以使用register2()方法直接接收dict对象。

AOM示例

通过模拟例子,演示基于AOM的接口自动化测试。

首先,定义APIObject层。

# shop_object.pyclass AuthAPIObject:def __init__(self, api_key):self.api_key = api_keydef get_token(self, user_id:str) -> str:"""模拟:根据用户ID生成登录token:param user_id::return:"""...class UserAPIObject:def __init__(self, token: str):self.token = tokendef get_user_data(self, user_id: str):"""模拟:根据用户ID查询用户信息:param user_id::return:"""...class ProductAPIObject:def __init__(self, token: str):self.token = tokendef get_product_data(self, product_id: str):"""模拟:根据产品ID查询产品信息:param product_id::return:"""...

以上非完整代码,说明如下。

•AuthAPIObject类用于封装用户认证相关接口,api_key参数用于接收接口的关键key。get_token()方法返回用户登录token。

•UserAPIObject类用于封装用户相关接口,调用接口需要登录token。get_user_data()方法,通过user ID查询用户数据。

•UserAPIObject类用于封装商品相关接口,调用接口需要登录token。get_product_data()方法,通过product ID查询商品数据。

然后,在用例中调用APIObject层。

import unittest
from shop_object import AuthAPIObject, UserAPIObject, ProductAPIObjectclass APITest(unittest.TestCase):def setUp(self) -> None:auth_api = AuthAPIObject("api_key_123")self.token = auth_api.get_token("user123")def test_user_info(self):"""用户信息查询接口"""user_api = UserAPIObject(self.token)user_data = user_api.get_user_data("tom123")self.assertEqual(user_data["name"], "tom")def test_product_info(self):"""商品信息查询接口"""product_api = ProductAPIObject(self.token)product_data = product_api.get_product_data("product123")self.assertEqual(product_data["name"], u"潮流T恤")if __name__ == '__main__':unittest.main()

总结

分层的好处立刻显现:

1.API只允许通过的APIObject进行封装,那么在封装之前可以检索一下是否有封装了,如果有,进一步确认是否满足自己的调用需求,我们一般在测试API的时候一般各种参数验证,当API作为依赖接口调用的时候,一般参数比较少且固定,所以,API在封装的时候要兼顾到这两种情况。

2.用例层只能通过APIObject的封装调用API,像登录token这种大部分接口会用到的信息,可以通过类初始化时传入,后续调用类下面方法的时候就不需要关心的。如果是多个接口组成一个场景,也可以再进行一层业务层的封装。

做好以上两点,就可以大大的减少代码冗余,后续维护起来也会方便很多。

你会发现 API Object 与 Page Object 思想基本一致,前者针对API测试,后者针对UI测试。

最后感谢每一个认真阅读我文章的人,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走:

这些资料,对于【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴上万个测试工程师们走过最艰难的路程,希望也能帮助到你!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/865774.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

vue3项目图片压缩+rem+自动重启等plugin使用与打包配置

一、Svg配置 每次引入一张 SVG 图片都需要写一次相对路径,并且对 SVG 图片进行压缩优化也不够方便。 vite-svg-loader插件加载SVG文件作为Vue组件,使用SVGO进行优化。 插件网站https://www.npmjs.com/package/vite-svg-loader 1. 安装 pnpm i vite-svg…

步进电机(STM32+28BYJ-48)

一、简介 步进电动机(stepping motor)把电脉冲信号变换成角位移以控制转子转动的执行机构。在自动控制装置中作为执行器。每输入一个脉冲信号,步进电动机前进一步,故又称脉冲电动机。步进电动机多用于数字式计算机的外部设备&…

DOM 中包含哪些重要方法

1. alert 带有指定消息的警告框 alert("hello world"); 2. confirm 带有确定和取消的对话框,点击确定返回 true,点击取消返回 false confirm("你好吗"); 3. prompt 显示一个提示框,允许用户输入文本,点击…

CST电磁仿真创建独特的天线

在日益无线化的世界中,一切都取决于天线,从我们用于医疗保健、工作和娱乐的智能设备到将我们从一个地方带到另一个地方的车辆。它们如此融入我们的日常生活,以至于我们大多数人甚至没有想到它们——即使想到了,我们也会想象屋顶上…

ubnutu20.04-vscode安装leetcode插件流程

1.在vscode插件商城选择安装leetcode 2.安装node.js 官网下载一个版本安装流程: ①tar -xvf node-v14.18.0-linux-x64.tar.xz ①sudo ln -s /app/software/nodejs/bin/npm /usr/local/bin/ ②ln -s /app/software/nodejs/bin/node /usr/local/bin/ 查看版本&…

nginx的LNMP构建+discuz论坛

一、LNMP: L:linux 操作系统 N:nginx前端页面的web服务 P:PHP,是一种开发动态页面的编程语言,解析动态页面,起到中间件的作用(在nginx和数据库的中间),在中…

横截面数据回归

横截面数据回归 一些笔记 观测值一定要比参数值多 p值<0.05,拒绝H0. 参数显著&#xff0c;不能说明模型对 AIC与BIC准则&#xff0c;越小越好的指标值AIC 回归分析一定要进行残差的正态性检验。所有的残差都大于0&#xff0c;小于0&#xff0c;都不正常。残差正常应该是分…

小学校园“闲书”交易平台的设计与实现-计算机毕业设计源码04282

小学校园“闲书”交易平台的设计与实现 摘 要 小学校园“闲书”交易平台是为了解决小学生之间的书籍交流和阅读兴趣培养而设计的。该平台通过使用现代技术手段&#xff0c;如移动应用开发和互联网技术&#xff0c;构建了一个功能齐全的交易平台。平台支持用户注册与登录&#x…

应用于空气和液体抑菌的静态UVC LED抑菌模组-WH-UVC001-VO

WH-UVC001-VO是一款用于空气和液体抑菌的静态UVC LED抑菌模组。适用于带水箱、密闭的腔体结构。可安装于顶部、侧壁及底部&#xff0c;出光面符合IP65的防水要求&#xff0c;即使安装于水箱底部也不用担心漏水。 使用的UVC LED的波长范围为260-280nm&#xff0c;具有优良高效的…

JavaScrip——switch类型

目录 任务描述 相关知识 严格相等 switch语句 编程要求 任务描述 北美五大湖的名称和面积如下&#xff1a; 名称面积(平方公里)Superior82414Huron59600Michigan58016Erie25744Ontario19554 本关任务&#xff1a;根据面积判断湖泊的名字。 相关知识 上一关讲解的是拥…

Java项目:基于SSM框架实现的网上医院预约挂号系统【ssm+B/S架构+源码+数据库+毕业论文】

一、项目简介 本项目是一套基于SSM框架实现的网上医院预约挂号系统 包含&#xff1a;项目源码、数据库脚本等&#xff0c;该项目附带全部源码可作为毕设使用。 项目都经过严格调试&#xff0c;eclipse或者idea 确保可以运行&#xff01; 该系统功能完善、界面美观、操作简单、…

Linux静态库的制作

Linux操作系统支持的函数库分为&#xff1a; 静态库&#xff0c;libxxx.a&#xff0c;在编译时就将库编译进可执行程序中。 优点&#xff1a;程序的运行环境中不需要外部的函数库。 缺点&#xff1a;可执行程序大 动态库&#xff0c;又称共享库&#xff0c;libxxx.so&a…

解决Python爬虫开发中的数据输出问题:确保正确生成CSV文件

引言 在大数据时代&#xff0c;爬虫技术成为获取和分析网络数据的重要工具。然而&#xff0c;许多开发者在使用Python编写爬虫时&#xff0c;常常遇到数据输出问题&#xff0c;尤其是在生成CSV文件时出错。本文将详细介绍如何解决这些问题&#xff0c;并提供使用代理IP和多线程…

【网络安全的神秘世界】SQL注入(下)

&#x1f31d;博客主页&#xff1a;泥菩萨 &#x1f496;专栏&#xff1a;Linux探索之旅 | 网络安全的神秘世界 | 专接本 | 每天学会一个渗透测试工具 3.7 二次注入 不好挖这个漏洞&#xff0c;需要搞懂业务逻辑关系 二次注入通常是指在存入数据库时做了过滤&#xff0c;但是取…

解码AWS EC2:塑造云服务器新标杆的五大核心优势

在云计算领域&#xff0c;亚马逊弹性计算云&#xff08;Amazon Elastic Compute Cloud, 简称EC2&#xff09;作为AWS的明星服务&#xff0c;凭借其卓越的性能、灵活性和广泛的生态系统&#xff0c;已经成为企业构建云上基础设施的首选。EC2不仅仅是一个简单的云服务器租用服务&…

“2024软博会” 为软件企业提供集展示、交流、合作一站式平台

随着全球科技浪潮的涌动&#xff0c;软件行业正迎来前所未有的发展机遇&#xff0c;成为了全球新一轮竞争的“制高点”&#xff0c;以及未来经济发展的“增长点”。在当前互联网、大数据、云计算、人工智能、区块链等技术加速创新的背景下&#xff0c;数字经济已经渗透到经济社…

工控软件开发框架,GTK和QT好难选,快来拯救开发者。

工控软件开发框架如何选&#xff0c;有人喜欢GTK&#xff0c;有人钟意QT&#xff0c;而且每个人都有自己的一番道理&#xff0c;好像说的还都有理&#xff0c;这种情况该怎么办呢?大千UI工场带着你深入了解下。 一、GTK是什么 GTK&#xff08;GIMP Toolkit&#xff09;是一个…

【JavaWeb】利用IntelliJ IDEA 2024.1.4 +Tomcat10 搭建Java Web项目开发环境(图文超详细)

1、启动IntelliJ idea 2024.1.4 在欢迎页面&#xff0c;请确认好版本。因为不同的版本&#xff0c;搭建项目过程不太一样。 点击&#xff0c;新建项目。如图&#xff1a; 2、新建项目 在新建项目界面&#xff0c;选择java&#xff0c;在右侧信息模块内&#xff0c;根据个人情…

帮公司搭了个Nuxt3项目框架

theme: smartblue 最近公司立项了一个新项目&#xff0c;因为是to C 的&#xff0c;所以对SEO是有较高需求的&#xff0c;由于公司前端技术栈统一用的VUE&#xff0c;顺理成章的就选择了nuxt这个全栈框架。项目立项之后我就被安排了负责前端项目框架的搭建&#xff0c;从搭建过…

高校教师教学质量评估系统-计算机毕业设计源码03344

摘要 在高等教育中&#xff0c;教学质量是培养优秀人才的关键。为了提高教学质量&#xff0c;高校需要建立一套科学、有效的教师教学质量评估系统。本研究采用 SSM技术框架&#xff0c;旨在开发一款高校教师教学质量评估系统。 SSM框架作为一种成熟的Java开发框架&#xff0c;具…