详细讲解!如何模拟后台API调用场景

news2024/9/27 5:59:45

目录

简介

Postman 迁移至 ApiFox

ApiFox 导入 Postman

ApiFox 展示 API 调用场景

增加断言验证 API

使用测试执行场景 API 序列

总结


简介

在进行Web性能测试时,我们不仅需要测试前端页面的性能,还需要测试与后台API的交互性能,以及后台服务的响应时间和吞吐量等指标。

在开发前后台分离项目并且通过不同团队来实现的时候,如何将后台设计的 API 准确的传达到前台,是一个非常重要的工作。为了简化这个过程,开源社区做了很多努力,比如 protobuf技术,swagger 的诞生, 以及后面 openapi 的演化,都在试图解决 API 描述和文档的问题。这些标准某些程度上大大简化了 API 文档的撰写和维护,但是API设计往往比较复杂,所以另外还有一些痛点没有解决:

  • 若干 API 的调用顺序是有要求的

  • 若干 API 的输入和输出是相互关联的

  • 若干 API 需要重复调用达到不同的效果

举了具体的例子, 某后端小伙伴X和前端小伙伴Y合作开发一款游戏, X 设计好 API 然后 Y 来调用实现:

Y: API1 根本调用不成功, 得不到我想要的数据? X: balabala 介绍了一遍. (X 默默地完善了文档) Y: 如何触发这个游戏逻辑啊? X: 可以参考我的文档 (自信的说) Y: 这个文档根本看不懂啊, 还是给我举个例子吧? X: ... balabala 沟通半天

过了几天来了一个新的前端开发 Z:

Z: 如何触发这个游戏逻辑啊 X: ...

有时候我们会发现很多时候 API 文档不足以完成前后端 API 设计的交流, 更多的时间用在相互沟通中. API 管理平台的诞生,可以说解决了这些痛点. 说起 API 管理平台首先最成功的的要数 Postman 了,笔者是 Postman 早期用户,基本使用了大部分的高级功能,近几年开始推广 Team 概念. ApiFox 作为中国的一体化 API 协作平台,从一开始就定位于团队协作,可以说目标十分明确. 目前在尝试从 Postman 迁移至 ApiFox,发现过程非常流畅,涵盖了所有目前我们使用功能.

本文主要介绍两方面内容:

  • 如何从 Postman 迁移至 ApiFox

  • 如何使用 ApiFox 实现展示后台 API 的调用场景

在介绍第二个方面内容时,尽可能介绍 Postman 对应的功能名称,从而给那些熟悉 Postman 的开发者以参考.

Postman 迁移至 ApiFox

结构对比

首先我们先了解一下 Postman 和 ApiFox 的管理控制结构,

Postman: Team → Workspace → Collections → Any Level Folders → Request

ApiFox: Team → Project → Any Level Folders → Request

变量控制

两者类似:

  1. 支持全局变量

  2. 支持环境变量及切换

ApiFox 导入 Postman

通过上面的管理控制结构,我们可以明确知道,我们只需要将对应的 Postman 的 Collection 导入 ApiFox 的 Project 中即可.

其中 ApiFox 提供了详细的文档介绍 Postman 的导出以及 ApiFox 导入. 通过测试,目前的 Postman 可以支持所有的数据映射,包含了 Postman 中的 Pre-req 和 test 脚本.

导入完成后两者对比,可以发现 Postman 的 Collection 映射到 Project 的 Root Folder 之后的结构完全是相同的:

这里唯一美中不足的是, 目前无法导入环境变量, 应该还在开发中.

关于 Script 的导入

这里需要注意的一点是,在 Postman 中我们可以直接在 Request 上进行编辑 pre-req 和 test 来控制 Request 的 Response. 在导入后,ApiFox 把默认的数据创建出一个 API Case,这个 Case 包含了 Postman 的 script 数据.

举个例子:

这是 Postman 中的一个 API,其中包含 Test script

在 ApiFox 中,Request 本身并没有包含这个 Script

ApiFox 创建了一个默认的 Passed API Case,然后在这个 API Case 中加入了这个 Script

ApiFox 展示 API 调用场景

介绍完导入工作,下面就开始重点介绍使用 ApiFox 来模拟 API 使用场景. 实现这个目标是基于如下功能:

  1. 无限级别目录

  2. 动态更新环境变量

  3. 每个请求支持 pre-processer 和 post-processer 来处理返回数据,理论上支持任何操作

  4. 测试用例支持添加某个目录来执行

总的来说,通过 ApiFox 的脚本引擎,来模拟客户端的一些操作,从而达到展示 API 使用场景的目的. 本文针对笔者目前使用经验介绍若干脚本的使用方法,如果需要深入了解脚本系统,请参考官方文档: 使用脚本. ApiFox 提供了比 Postman 更加强大的脚本系统,除了 Javascript,还支持其他语言的调用.

请求的后置脚本

下面我们通过一个简单的游戏 API 案例来介绍以上功能的使用.

API 接口定义很简单,只包含两个 API

  1. Game_init: 初始化用户数据

  2. Game_round: 游戏的玩法很简单,玩家只需要点击一个按钮来进行抽奖,抽奖的结果是随机的,并且可能触发特殊游戏: 比如更换更高级的奖品. API 本身支持调试,就是通过输入参数来返回特定的抽奖结果.

现在我们的目标就是模拟一次用户开始抽奖并且触发了特殊游戏获取高级奖励,并继续抽奖最后获取奖励的游戏场景. 通过 API 的接口定义,我们可以看到 API 的调用逻辑应该是:

  1. 调用 Game_init 一次

  2. 调用 Game_round 多次,直到游戏结束

所以游戏场景的 API 结构如下图:

我们使用 Scene1 来表示上述演示的调用场景. 下面我们开始对每个 API 的 Request 进行处理,从而达到模拟 API 连续调用.

Game_init API的输入和输出很简单:

输入:

{   "gameId": "{{fe}}",   "player": {       "isDummy": true   } }

输出

{   "player": {         "playerId": "Demo",         "name": "Demo",         "balance": "1000000",         "balanceRate": "100",         "currency": "FUN",         "isDummy": true   } }

Game_init API 调用完成后,我们需要持续追踪玩家数据的变化,所以这里我们需要将返回的用户信息储存在环境变量中,我们可以通过 Post-processors,添加一个 Custom Script 来实现:

pm.test("Get Response",function () {     var jsonData = pm.response.json();     console.log(jsonData)     // we update playerData in the environment     pm.environment.set('playerData',JSON.stringify(jsonData.player)) });

这段代码有两个关键点:

  1. 将 API 的返回结果解析为 JSON 数据: pm.response.json()

  2. 将 JSON 数据中的 player 信息出处到环境变量中,并且命名为 playerData: pm.environment.set('playerData',JSON.stringify(jsonData.player))

完成这脚本后,我们可以执行这个 Request,然后查看我们的环境变量信息,playerData 动态添加进来:

Game_round API的输入输出

输入:

{     "gameId": "{{fe}}",     "cheat": {         "cheatId": 1     },     "player": {{playerData}},     "betContext": {{betContextData}} }

输出

{     "player": {         "playerId": "Demo",         "name": "Demo",         "balance": "1015000",         "balanceRate": "100",         "currency": "FUN",         "isDummy": true     },     "betContext": {         "roundsAwarded": 1,         "currentBetMode": "A",         "nextBetMode": "B"     },     "gameRoundResult": {} }

我们在处理 Game_round API 的时候和 Game_init 类似,每次得到 Game Round 的返回的 JSON 后,更新 playerData 和 betContextData. 同时我们还发现,该请求的输入数据同样使用了环境变量 playerData 和 betContextData,从而多次调用 Game_round API 后,玩家数据和游戏数据是不断进行更新的.

pm.test("Get Response",function () {     var jsonData = pm.response.json();     console.log(jsonData)         // we update playerData and game context in the environment     pm.environment.set('playerData',JSON.stringify(jsonData.player))     pm.environment.set('betContextData',JSON.stringify(jsonData.betContext)) });

通过这种方法在执行这 3 个 API的过程中,就可以查看用户数据的变化以及每次游戏结果,从而帮助前端开发者理解和使用 API.

  1. GameInit游戏初始化

  2. Round1进入特殊游戏

  3. Round2特殊游戏奖励

增加断言验证 API

我们在设计 API 使用场景的时候,可以同时对 API 进行测试. 在不同场景下 API 的返回可能是不同的,所以这里进行测试断言可以更精确的定位问题.

比如我们上述的案例,第二个请求需要触发用户进入特殊的游戏模式,这里需要后台 API 支持特殊的测试参数,通过这个参数可以跳过随机结果直接获取需要的结果.

"cheat": {         "cheatId": 1 }

也就是说如果 Game_round 请求的输入数据中包含如下数据,那么这个请求的数据一定是进入了特殊模式. 在这个案例中就是说,输出的nextBetMode 一定是模式 SpeicalMode

"betContext": {         "roundsAwarded": 1,         "currentBetMode": "A",         "nextBetMode": "SpeicalMode" }

这时候我们就可以断言: $.betContext.nextBetMode equl SpeicalMode

如果我们在执行 request 的时候断言出错,就会得到一个 Error,如下图 (这里是故意配置错误的断言结果)

在 Postman 中这个功能是通过 test 脚本来实现的, 比如 pm.expect(pm.response.json()).to.deep.include("xx");, ApiFox 提供的方式更加人性化.

使用测试执行场景 API 序列

目前我们上述场景构建的 3 个 API 是手动依次执行的,我们还可以创建一个 Test Case 可以一次性执行多个 API. (该功能在 Postman 中是在各级文件夹下的 Run 功能)

首先创建一个新的 Test Case

然后导入我们之前创建的一组 API Case, 注意这里选择 API Case, 也就是带有后置脚本的请求.

最后执行 Run,可以看到最后返回的结果

通过这个功能, 后续如果 API 出现变更, 可以直接运行这个 Test Case 来进行回归测试.

另外类似于 Postman 的 newman 命令行工具, ApiFox 也有自己的 CLI 工具, 通过 CLI 工具, 我们还可以使用我们自己的 CI/CD 系统自动执行这个 Test Case, 从而将 API 测试深入的融合到整个开发生命周期中.

apifox run https://api.apifox.cn/api/v1/api-test/ci-config/349571/detail?token=xxxx -r html,cli

总结

这篇文章主要介绍如何通过 ApiFox 来构建 API 场景测试,通过后置脚本可以将多个 API 的输入和输出进行串联,从而达到模拟客户端行为的目的. 同时本文还对照了 Postman 的相应的功能,帮助熟悉 Postman 的开发者快速上手.

作为一位过来人也是希望大家少走一些弯路,希望能对你带来帮助。(WEB自动化测试、app自动化测试、接口自动化测试、持续集成、自动化测试开发、大厂面试真题、简历模板等等),相信能使你更好的进步!

留【自动化测试】即可

【自动化测试交流】:574737577(备注ccc)icon-default.png?t=N4P3http://qm.qq.com/cgi-bin/qm/qr?_wv=1027&k=_IjHegeJ1FQnPeEKrMSmI4m8d-jOK2vN&authKey=QNcmDg0w07hxmEQGYswEgLBvrgH2VarqHkIDjZHQg2LOd4OtWxrw4pjErW9M5Gkc&noverify=0&group_code=574737577 

 

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

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

相关文章

Spring Cloud常用组件介绍(Netflix、Alibaba)

Spring Cloud常用组件介绍 文章目录 **Spring Cloud常用组件介绍**一、说明**1.1.什么是Spring Cloud**1.2.Spring Cloud的组件选型 **二、组件介绍****2.1.服务注册与发现****2.1.1.Netflix Eureka****1)分布式模型****2)主要组件****3)工作…

骑行陡坡村,潇潇洒洒出品

2023年6月10日群峰环抱小村庄盘山陡坡蜜桃香唇干舌燥咬一口甘甜香沁嘴边淌久旱叶枯悯农急乌云密布盼雷响但得雷神甘露下雨中狂奔又何妨

高效搞定文件重命名和归类!使用文件批量改名高手轻松实现

文件夹管理是计算机使用中非常重要的一项任务,对于个人电脑用户或企业机构来说,都需要对文件夹进行有效管理归类和重命名。 第一步,打开文件批量改名高手,进入文件批量重命名板块并点击添加文件,选择需要重命名的文件…

IOS应用跳转URL scheme和Universal Links

简介 IOS常见的跳转方式有URL scheme和Universal Links。这两个均可以实现App之间的跳转,以及通过网页实现跳转到对应的App内。通过本文章可以了解到两者的区别和具体的使用方法,以及参数的传递。应对常见的几种跳转需求。 URL scheme:需要配置URL sch…

增值税高不再是难事,只需一招即可解决!

《税筹顾问》专注于园区招商,您的贴身节税小能手,合理合规节税! 任何一家企业,都逃脱不了一种税费的缴纳,那就是增值税。但其实小规模纳税人增值税缴纳,是可以享受到一些税收优惠照顾的,未达到月…

看完阿里大牛的LeetCode算法刷题手册后,成功在四面字节斩获offer

最近有看到很多朋友想进大厂,四面竟然都考了算法,很多同学面对算法的问题都很头大,因为自己做项目很难用到,但是但凡高薪的职位面试都会问到。最近我整理了一份刷题宝典,这份刷题宝典,也让我进了心仪的大厂…

MyBatis Plus 解决大数据量查询慢问题

常规查询 流式查询 游标查询 大数据量操作的场景大致如下: 数据迁移 数据导出 批量处理数据 在实际工作中当指定查询数据过大时,我们一般使用分页查询的方式一页一页的将数据放到内存处理。但有些情况不需要分页的方式查询数据或分很大一页查询数…

实用工具指南:2个提升效率的互联网利器

工具一: 字体酷站是全球最大的字体网址导航网站,收录了大量优质的字体素材和字体设计资源。该网站拥有丰富多样的字体分类和标签,用户可以根据需求选择不同类型、不同风格的字体,如商务字体、手写字体、卡通字体等。同时&#xf…

B+树单表超过2500万行的性能影响

(有许多人是用青春的幸福作成功的代价的。——莫扎特) B树 关于B树的原理请查看这篇文章 分析 MySQL采用了索引组织表的形式组织数据,叶子节点存储数据,非叶子节点存储主键与页面号的映射关系。若用户的主键长度是8字节时&…

基于MATLAB涡度通量数据处理

查看原文>>>基于MATLAB涡度通量数据处理实践技术应用 【内容简述】: 基于MATLAB语言、以实践案例为主,提供代码、原理与操作结合1、以涡度通量塔的高频观测数据为例:基于MATLAB上机操作2、涡度通量观测基本概况:观测技术…

用友 畅捷通T+ DownloadProxy.aspx 任意文件读取漏洞

1. 漏洞描述 用友 畅捷通T DownloadProxy.aspx文件存在任意文件读取漏洞,攻击者通过漏洞可以获取服务器上的敏感文件. 2.FOFA app"畅捷通-TPlus" 3.漏洞复现 登录页面 验证POC /tplus/SM/DTS/DownloadProxy.aspx?preload1&Path../../Web.Confi…

2.3 逻辑代数的基本公式和常用公式

博主介绍:一个爱打游戏的计算机专业学生 博主主页:夏驰和徐策 所属专栏:程序猿之数字电路 学习目标: 1. 学习基本概念:首先,了解逻辑代数的基本概念和术语,如命题、逻辑运算符(与…

探索上位机编程的挑战与乐趣

上位机编程的难度取决于多个因素,包括您的编程经验、所使用的编程语言和开发工具、应用程序的复杂程度等等。 如果您具备一定的编程经验并且熟悉所选的编程语言和开发工具,那么上位机编程可能相对容易上手。上位机编程通常涉及与外部设备(如…

Unity入门1——窗口布局

文章目录 一、Hierarchy 窗口 二、Scene 窗口 三、工具栏 四、Game 窗口 五、Project 工程窗口 六、Inspector 窗口 七、Console 窗口 一、Hierarchy 窗口 ​ 在这里创建对象、操作对象。 ​ 快捷键:F2:对象改名 ​ CtrlC:复制 ​ CtrlV&…

avue curd 中的配置项插槽使用

效果图&#xff1a;&#xff08;新增时候的步骤条&#xff0c;以为是设置透明度是0-1中的小数 avue中步骤是整数 于是使用到插槽用element-ui&#xff09; html&#xff1a; <template slot"opacityForm"><el-row class"row"><el-slider v-…

ABAP:后台执行JOB报错问题

错误&#xff1a;CL_GUI_CUSTOM_CONTAINERCP生成容器错误&#xff0c;主要在OOALV中运用到 原因&#xff1a;是由于我们在JOB后台执行的时候无法打开GUI端而报错的 此时&#xff0c;我们就需要在程序中去规避后台执行这一段逻辑&#xff0c;可以通过SY-BATCH解决&#xff0c;当…

今天终于知道了,阿里巴巴 P8、P9 及以上到底是什么水平?

做人做事不能万事向钱看&#xff0c;但是钱这个东西很多时候都反映了事物的价值以及一个人的能力水平。 比如阿里P8、P9 这些拿着高薪的程序员他们的技术水平就一直是大家好奇的。 今天在逛某乎的时候就恰好看见了一个几百万人关注的问题&#xff1a; 阿里的高p们动辄百万以上…

探索地理空间的无限可能:GIS地图的应用与发展

随着科技的飞速发展和数字化时代的来临&#xff0c;GIS地图正成为一个强大的工具&#xff0c;为我们提供了更准确、全面的地理空间数据和智能化的解决方案。GIS地图集成了地理信息、空间分析和可视化技术&#xff0c;为我们打开了一个全新的世界&#xff0c;让我们能够更好地理…

linux进阶 --- chrony服务器

chrony服务器 &#xff08;1&#xff09;定义&#xff1a; 是一个开源自由的网络时间协议NTP的客户端与服务器端软件。让计算机保持系统时钟与时钟服务器&#xff08;NTP&#xff09;同步。chrony由两个程序组成&#xff0c;chronyd&#xff08;服务器端&#xff09;和chronyc…

接口如何运用pytest+HttpRunner展开测试?

目录 前言&#xff1a; 一、 什么是接口测试 二、 引入自动化背景 三、 自动化技术选型 四、 自动化测试用例 五、自动化成果 前言&#xff1a; pytest和HttpRunner都是Python编程语言中常用的接口测试框架。 pytest是一种成熟的、灵活的、社区支持良好的测试框架&…