【接口测试】Apifox实用技巧干货分享

前言

不知道有多少人和我有着这样相似的经历:从写程序只要不报错就不测试😊,到写了程序若是有bug就debug甚至写单元测试,然后到了真实开发场景,大哥和你说,你负责的功能模块的所有接口写完要测试一遍无误在commit和push

这时❔️就出现了,怎样进行接口测试,这么多接口要挨个儿写单元测试嘛(🥹真心抗拒),大哥就很贴心,给我展示了两种方案,看清楚了,额,作为后端开发,那选择Apifox开局吧,虽然之前也没闻其名用其品,但谁让我喜欢它的红,旭日东升,照耀大地

前置知识

1️⃣在实际生产项目中,后端在完成功能模块中的接口开发后,需要对接口进行自测,避免与前端联调时出现本不该有的错误,提供工作对接效率

2️⃣接口测试用于测试前端与后端之间进行数据交互的接口,测试重点:传参正确性、响应结果正确性、功能实现正确性和异常处理合理性与完整性

3️⃣对于http的请求与响应有一定认识,这Y的是必须的

Apifox干货运用

简介

🌟学习一个东西最好的方法就是阅读说明书,但绝不是一上来就猛冲说明书,而是在实际运用中遇阻,在针对性阅读解决,这样事半功倍,请对这句话有点印象,因为接下来我会用实际行动来印证这句话

这是一款开发协作工具,可用于接口测试,多平台可用,这是官网下载地址:https://apifox.com

官网还提供了使用文档:https://apifox.com/help

真心建议: 如果是刚接触接口测试,别看官方入门视频,真的从入门到入土

使用方针

1️⃣请大哥演示一遍,借用Apifox进行接口测试的具体使用流程

2️⃣自己上机操作一遍,对于其使用有了清晰而模糊的印象便可,然后在对所写接口进行独测与分析思考小结

3️⃣学习常见使用场景,使接口测试高效便捷

前两步请自行完成,而我能提供的,就是在常见场景下实用技巧的整理(形与神)

场景使用

官方文档第一篇:https://apifox.com/help/api-docs/api-design

前置URL使用场景

接口测试重点测试的是某路由下该接口的功能实现,大多数时候,其接口路由下的前置URL是重复的,所以每次用接口的全路径测试可以,但不够优雅

在这里插入图片描述
在程序中,对于重复的代码块可以用函数封装,而在测试这里,Apifox提供了前置URL功能

在这里插入图片描述

这只是一道开胃菜,重点是希望通过这道开胃菜,了解Apifox中🔥环境与变量,请阅读官方文档第二篇:https://apifox.com/help/environment-and-variables/environment-management

后置脚本使用场景一

有了环境与变量的认识,接下来看看这样一个使用场景(相信非常眼熟👀)

将上一个接口中获取到的响应体中某个字段用在下一个接口的请求路径中,并且该字段对应的值是不重复的(由时间戳+随机数构成)

在这里插入图片描述

请信奉一句话:优雅,永不过时

第一步,将上一个接口响应体中有用字段设为环境变量,这里需要使用后置脚本

在这里插入图片描述
第二步,将下一个接口请求路径中的动态值设为环境变量

在这里插入图片描述
在这里插入图片描述

思路简介:将上一个接口中有用字段设为环境变量,这样在请求完上一个接口后环境变量就有值,那么下一个接口的请求路径的动态值就会自动设置上了

后置脚本使用场景二

很多时候进行接口测试需要携带token才能通过校验,而token的获取要么自行模拟登录获取,要么让前端手动传过来,我想你也不是喜欢把事情搞复杂的人,所以还是自食其力

这时候可能会说,进行接口测试,我直接在拦截器放行不就不用携带token了嘛,是这样的,不过很多时候又需要从token中获取一些信息进行其他逻辑操作🤡

🔥要实现模拟登录,首先得明白登录实现的真实逻辑

登录实现通常分为两步,第一步就是请求跳转到登录界面,这时候前端就会加载静态资源和请求验证码接口

这里以若依在线演示平台为例来验证这一步:http://vue.ruoyi.vip/

在这里插入图片描述
在这里插入图片描述
后端对于前端请求的验证码接口会返回一个uuid来标识所返回的验证码图片

第二步,前端会基于登录信息、验证码答案和uuid来请求登录接口

在这里插入图片描述

在验证码接口响应体中uuid是动态生成的,验证码答案code也是在随机变化的,那么如何在模拟登录操作时高效取到token

第一步,通过后置脚本将uuid设为环境变量(📝这里涉及到验证码code获取,后面会重点提及,这里先忽略)

在这里插入图片描述
第二步,将登录接口中的请求体的uuid字段设为环境变量

在这里插入图片描述
说明: 之前让看环境与变量时涉及到变量使用:所有类型的变量都是通过双大括号的方式。而这里为什么要在双大括号外加引号了,是因为使用后置脚本设置的环境变量类型没有定义,只存储了某环境变量对应的某值,所以当使用的环境变量为字符串类型,就需要用引号标识

在这里插入图片描述

后置脚本使用场景三

当获取到了token后,每个接口都需要携带token,难道每次手动在请求头中手动添加嘛,可以但没必要

这里你可以根据上面两个使用场景自己推演出来,也可以对照着我的实现

第一步,使用后置脚本将响应体中的token字段设为环境变量

在这里插入图片描述
第二步,将请求头中的Authorization字段的取值设为环境变量token

在这里插入图片描述
在这里插入图片描述

数据可视化使用场景

对于验证码图片,是后端通过公共库随机生成的,返回的验证码图片通常是base64编码的字符串

而在模拟登录中,通常需要通过工具将base64编码的字符串转为图片,然后计算得出验证码答案code,这样就会使模拟登录变得更加繁琐

实现可能不止一条方案,但我只有这一条方案,可借鉴参考

思路: 通过后置脚本将获取到的响应体中的base64编码的字符串自动转为图片,然后就可以快速得出验证码答案

核心: 如何将base64编码的字符串转为图片,我刚开始尝试在Apifox中使用js来实现,但结果不尽人意,当时也不知道该怎么破局。后来结合官方文档,自己有了一条实现思路,便是通过在线工具的接口间接获取图片

简单介绍下我实现的流程,在得知官方有提供该功能,网查无此资料,便只好对照官方文档边啃边实现

官方文档第三篇:https://apifox.com/help/pre-post-processors-and-scripts/scripts/examples/visualize
官方文档第四篇:https://apifox.com/help/pre-post-processors-and-scripts/scripts/api-references/pm-reference

通过爱资料工具可将base64转为图片

在这里插入图片描述

第一步,观察其请求与响应

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
第二步,观察所请求的验证码接口的响应体

在这里插入图片描述

第三步,在脚本内异步发送 HTTPS 请求

const echoPostRequest = {
    url: "https://api3.toolnb.com/tools/base64ToImages.json",
    method: "POST",
    header: [
        "Content-Type: application/x-www-form-urlencoded; charset=UTF-8",
        "User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36",
        "Connection: keep-alive"
    ],
    // body 为 form-data 格式
    body: {
        mode: "formdata",
        formdata: [
            { key: "data", value: pm.response.json().img }
        ]
    }
};

pm.sendRequest(echoPostRequest, function (err, res) {
    console.log(err ? err : res.json().data.file);
    let resp = {
        response: res.json().data.file
    }

    let template = `<html><img src="{{response}}" /></html>`

    pm.visualizer.set(template, resp)
});

注意: 官网的异步请求头用{}包裹,但不知道为何最开始使用时报错,后来测试时又可以正常使用了,所以提供两个版本供选择

const echoPostRequest = {
    url: "https://api3.toolnb.com/tools/base64ToImages.json",
    method: "POST",
    header: {
        "Content-Type": "application/x-www-form-urlencoded; charset=UTF-8",
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36",
        "Connection": "keep-alive"
    },
    // body 为 form-data 格式
    body: {
        mode: "formdata",
        formdata: [
            { key: "data", value: pm.response.json().img }
        ]
    }
};

pm.sendRequest(echoPostRequest, function (err, res) {
    console.log(err ? err : res.json().data.file);
    let resp = {
        response: res.json().data.file
    }

    let template = `<html><img src="{{response}}" /></html>`

    pm.visualizer.set(template, resp)
});

最后效果图
在这里插入图片描述

小结

从大哥推荐通过Apifox进行接口测试,到本篇文章诞生已有三周之久

从不会用到用的惯往往只需要向前迈出这么一步,可这一步耗费了我三周,希望本篇文章能对你有所帮助

题外话

在CSDN上,如果有文章对你产生过帮助,还请点赞支持,这既可以激励创作者,也会让良币被更多需要的人发现。更为重要的是,做人还是得学会:投之以桃,报之以李

本来国内博文只能说发展前景很是宽广,毕竟批判家动动嘴远比动动手要简单多(说的永远比做的多,要是不行你不能自己动手改变嘛),这也无可厚非,可最近发现,有的搞博文搞着搞着就变成为了打榜而刷起了人情世故,懂得都懂。只能说:德不配位,必有灾殃

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

C# 使用HtmlAgilityPack解析提取HTML内容

写在前面 HtmlAgilityPack是一个HTML解析类库&#xff0c;日常用法就是爬虫获取到内容后&#xff0c;先用XPath获取目标节点&#xff0c;再用正则进行匹配&#xff1b;使用XPath的目的主要是将目标节点或内容限定在一个较小的范围&#xff0c;如果一上来就用正则那效率肯定不…

python——进程常用功能

Python的multiprocessing模块提供了强大的并行处理能力&#xff0c;以下是几个功能的详细解释&#xff1a; join(): 在multiprocessing中&#xff0c;join方法用于阻塞主进程直到指定的进程终止。这对于确保所有子进程在程序结束前完成其工作是很有用的。deamon(): 在multipro…

讲一讲redis的使用

Redis&#xff08;Remote Dictionary Server&#xff09;是一个开源的内存数据库系统&#xff0c;它提供了高性能、支持多种数据结构的存储和操作&#xff0c;被广泛应用于缓存、消息队列、计数器、实时分析等场景。以下是Redis的使用详解&#xff0c;涵盖了基本概念、数据结构…

目标检测常用评价指标

1 基本概念 1.1 IOU(Intersection over Union) 1.2 TP TN FP FN 2. 各种率 3. PR曲线 4. mAP的计算 4.1 AP的计算 4.2 mAP 4.3 mAP0.5和mAP0.5:0.95 1.1 IOU(Intersection over Union) 1.2 TP TN FP FN TP(Truth Positive)&#xff1a; 预测正类&#xff0c;实际正类&#x…

2022CVPR(PoseC3D):Revisiting Skeleton-based Action Recognition

Revisiting Skeleton-based Action Recognition 摘要1、引言2、相关工作3、框架3.1. 姿势提取的良好实践3.2.从2D姿势到3D热图体积3.3.基于骨架的动作识别的3D-CNN 4、实验4.2.姿势提取4.3. 3D热图体积的预处理4.4.与GCN的比较4.5. RGBPose-SlowFast4.6.与最先进的比较 5、结论…

糟了,数据库崩了,又好像没崩

前言 2023 年某一天周末&#xff0c;新手程序员小明因为领导安排的一个活来到公司加班&#xff0c;小明三下五除二&#xff0c;按照领导要求写了一个跑批的数据落库任务在测试环境执行 &#xff0c;突然间公司停电了&#xff0c;小明大惊&#xff0c;“糟了&#xff0c;MySQL …

wordpress建站优化加速教程-Redis加速

这篇文章适合宝塔面板&#xff0c;在宝塔面板安装 Redis 实现网站加速&#xff08; Redis是一个高性能的key-value数据库(PHP连接redis&#xff0c;需PHP设置中安装redis扩展) &#xff09;。对在word press网站有着明显的加速效果。关于Redis具体说明请自己百度&#xff0c;…

30岁左右的简历模板精选7篇

30岁左右是职业发展的关键时期&#xff0c;一份出色的简历能带来更多机会。本文精选了7篇适合30岁左右求职者的专业简历案例&#xff0c;无论您是寻找晋升、转行还是新的职业挑战&#xff0c;都能从中借鉴灵感&#xff0c;打造一份令人印象深刻的简历。 30岁左右的简历模板下载…

Git 配置文件(.gitignore)

前言 在使用 Git 分布式版本控制系统的时候&#xff0c;有些文件如&#xff1a;数据库的一些配置文件&#xff0c;我们不想让这类文件在远程仓库让 Git 来管理&#xff0c;不想让别人看到&#xff0c;此时就可以自己在 Git 仓库目录下创建 / 在远程仓库创建的时候就配置好 .git…

队列顺序存储(详解)

队列是一种常见的数据结构&#xff0c;它是一种先进先出&#xff08;First-In-First-Out, FIFO&#xff09;的线性表。在队列中&#xff0c;数据元素按照插入的顺序排列&#xff0c;最先插入的元素在队列的前面&#xff0c;最后插入的元素在队列的后面。类比生活中排队购物的情…

调试GMS应用,报错“此设备未获得play保护机制认证”问题解决

不少同学在调试GMS相关应用时&#xff0c;需登录Google账号&#xff0c;有时会弹出如下通知。 Google登录界面也会出现如下提示 这个报错的原因是设备未通过Google认证&#xff0c;google服务器未配置荣耀设备的型号白名单导致 国内网页有一些指导方法在鸿蒙\荣耀的设备上消除这…

语言模型文本处理基石:Tokenizer简明概述

编者按&#xff1a;近年来&#xff0c;人工智能技术飞速发展&#xff0c;尤其是大型语言模型的问世&#xff0c;让 AI 写作、聊天等能力有了质的飞跃。如何更好地理解和利用这些生成式 AI&#xff0c;成为许多开发者和用户关心的问题。 今天&#xff0c;我们推出的这篇文章有助…

Linux环境下 make/makefile、文件时间属性 详解!!!

1.项目自动化构建工具make/makefile 1.为什么要有make/makefile 我们先写一个简单的代码&#xff0c;然后编译生成一个可执行程序&#xff0c;下面的内容我们需要知道gcc识和编译链接的一些知识&#xff0c;不清楚的朋友们可以点这里http://t.csdnimg.cn/0QvL8 我们知道要想生…

Python爬虫:通过js逆向分析某翻译网站的原理

Python爬虫&#xff1a;通过js逆向分析某翻译网站的原理 1. 网站实现原理2. 抓取接口3. 参考代码和运行结果 1. 网站实现原理 首先&#xff0c;说一下爬取的网站&#xff1a;百度翻译。网站实现翻译的效果是通过接口实现的&#xff0c;也就是各位听到的ajax技术(只需要更换对应…

Spring | Spring的基本应用

目录: 1.什么是Spring&#xff1f;2.Spring框架的优点3.Spring的体系结构 (重点★★★) :3.1 Core Container (核心容器) ★★★Beans模块 (★★★) : BeanFactoryCore核心模块 (★★★) : IOCContext上下文模块 (★★★) : ApplicationContextContext-support模块 (★★★)SpE…

Mongoose 开源库--http协议 header 报头解析

一、http 协议 header 报头相关 API 获取http header的值 struct mg_str *mg_http_get_header(struct mg_http_message *hm, const char *name);参数&#xff1a; hm - HTTP message to look for header name - Header name返回值&#xff1a; HTTP header value or NULL i…

Docker下安装MySQL

如果在Docker下直接拉取MySQL并运行镜像&#xff0c;由于没有指定字符编码集&#xff0c;可能会存在插入中文出现乱码的情况&#xff0c;并且当容器删除后&#xff0c;容器里面存在的数据会丢失&#xff0c;所以在运行容器时应该使用数据卷进行挂载&#xff0c;按照如下步骤操作…

智慧城市包括哪些内容?有哪些智慧城市物联网方案?

数字城市、智慧城市的发展&#xff0c;离不开对公共基础设施的数字化、智慧化改造升级。通过融合边缘计算、5G、物联网、数字孪生、人工智能等新一代信息技术&#xff0c;助力传统公共基础设施提升增强全流程数据能力、计算能力、服务能力&#xff0c;从而不断丰富公共基础设施…

Kotlin:内置函数let、also、with、run、apply

前言 在Kotlin中&#xff0c;有一些用于扩展 & 方便开发者编码的内置函数&#xff0c;能大大提高开发者的开发效率。今天&#xff0c;我将主要讲解的是&#xff1a; let函数also函数with函数run函数apply函数 基础知识&#xff1a;接口回调中Lambda使用 在Kotlin中可使用…

IM通信技术快速入门:短轮询、长轮询、SSE、WebSocket

文章目录 前言即时通讯常用技术 短轮询&#xff08;Short Polling&#xff09;实现原理优点缺点 长轮询(Long Polling)实现原理改进点基于iframe的长轮询实现原理总结 Server-Sent Events&#xff08;SSE&#xff09;实现原理浏览器对 SSE 的支持情况SSE vs WebSocket总结 WebS…