【软件测试】学习笔记-从0到1:API测试怎么做

这篇文章是API测试的基础,先从0到1设计一个API测试用例,通过这个测试用例,体会到最基本的API测试是如何进行的,并介绍几款常用的API测试工具。

API测试的基本步骤

通常来讲,无论采用什么API测试工具,API测试的基本步骤主要包括以下三大步骤:

  1. 准备测试数据(这是可选步骤,不一定所有API测试都需要这一步);
  2. 通过API测试工具,发起对被测API的request;
  3. 验证返回结果的response。

对API的测试往往是使用API测试工具,比如常见的命令行工具cURL、图形界面工具Postman或者SoapUI、API性能测试的JMeter等。

为了让你更好地理解API测试具体是怎么做的,并掌握常见API测试工具的使用,我会以基于主流Spring Boot框架开发的简单Restful API为例,分别介绍如何使用cURL和Postman对其进行最基本的功能测试,目的是让你对API测试有一个基本的感性认识。

基于Spring Boot构建的API

因为基于Spring Boot从0到1构建一个API,并不是本文的重点,为了不影响你对文章主要内容的把握,我直接采用了一个预先开发好的Account API为例展开讲解。你可以从GitHub - SpectoLabs/spring-cloud-contract-blog下载完整的代码。

这个Account API的功能非常简单,就是基于你提供的ID值创建一个Account对象,并返回这个新创建Account对象。

比如,如果你的请求是“account/ID008”,那么返回的response就应该是“{“id”:“ID008”,“type”:“friends”,“email”:“robin@api.io”}”。

这个Account API的功能逻辑实现非常简单,图1和图2列出了主要的代码逻辑。

图1中,代码的第21行说明了API的endpoint以及对应的操作是GET方法,第22行明确说明了GET方法具体的业务逻辑是由accountService.getById()方法实现的。

图1 RestController的实现

图2中,代码的第8行实现了accountService.getById()方法,具体逻辑就是返回一个以传入ID为ID的Account对象。

图2 具体业务逻辑的实现

推荐使用IntelliJ打开这个下载的项目,然后直接启动其中的account-service。启动成功后,account-service会运行在本地机器的8080端口。启动成功后的界面如图3所示。

图3 成功启动基于Spring Boot的Account API

使用cURL命令行工具进行测试

首先,你需要下载安装cURL,然后就可以通过以下命令发起Account API的调用。调用结束后的界面如图4所示。

curl -i -H "Accept: application/json" -X GET "http://127.0.0.1:8080/account/ID008"

图4 使用cURL测试Account API

这行命令中参数的含义如下:

  • 第一个参数“-i”,说明需要显示response的header信息;
  • 第二个参数“-H”,用于设定request中的header;
  • 第三个参数“-X”,用于指定执行的方法,这里使用了GET方法,其他常见的方法还有POST、PUT和DELETE等,如果不指定“-X”,那么默认的方法就是GET。
  • 最后“ http://127.0.0.1:8080/account/ID008 ”,指明了被测API的endpoint以及具体的ID值是“ID008”。

当使用cURL进行API测试时,常用参数还有两个:

  • “-d”:用于设定http参数,http参数可以直接加在URL的query string,也可以用“-d”带入参数。参数之间可以用“&”串接,或使用多个“-d”。
  • “-b”:当需要传递cookie时,用于指定cookie文件的路径。

需要注意的是这些参数都是大小写敏感的。

了解了这几个最常用的参数后,我再来分析一些最常用的cURL命令以及使用的场景,包括Session的场景和Cookie的场景。

第一,Session的场景

如果后端工程师使用session记录使用者登入信息,那么后端通常会传一个 session ID给前端。之后,前端在发给后端的requests的header中就需要设置此session ID,后端便会以此session ID识别出前端是属于具体哪个session,此时cURL的命令行如下所示:

curl -i -H "sessionid:XXXXXXXXXX" -X GET "http://XXX/api/demoAPI"

第二,Cookie的场景

如果是使用cookie,在认证成功后,后端会返回cookie给前端,前端可以把该cookie保存成为文件,当需要再次使用该cookie时,再用“-b cookie_File” 的方式在request中植入cookie即可正常使用。具体的cURL的命令行如下所示:

// 将cookie保存为文件
curl -i -X POST -d username=robin -d password=password123 -c ~/cookie.txt "http://XXX/auth"// 载入cookie到request中
curl -i -H "Accept:application/json" -X GET -b ~/cookie.txt "http://XXX/api/demoAPI"

最后,需要特别说明的是,cURL只能发起API调用,而其本身并不具备结果验证能力(结果验证由人完成),所以严格意义上说cURL并不属于测试工具的范畴。但是由于cURL足够轻量级,经常被很多开发人员和测试人员使用,所以我在这里做了简单的介绍。

接下来,我们再来看看如何使用目前主流的Postman完成API测试。

使用图形界面工具Postman进行测试

Postman是目前使用最广泛的Http请求模拟工具之一,常常被用于Web Service API的测试。

早期的Postman,是以Chrome浏览器的插件(plugin)形式存在的,最新版本的Postman已经是独立的应用了。我猜想是因为这个工具的应用日益广泛,所以才有了今天的独立版本。

你可以通过官方网站下载对应于Mac、Windows和Linux操作系统的不同版本,截止文章写作完成时,最新的Mac版本是6.2.2。

接下来,我就会以Mac 6.2.2版本为例,跟你分享如何用Postman完成你的API测试。如果你使用浏览器的plugin版本,或者是基于其他操作系统的版本,这都没问题,基本的操作和步骤都是一样的。

具体的操作,主要包括:

  1. 发起API调用;
  2. 添加结果验证;
  3. 保存测试用例;
  4. 基于Postman的测试代码自动生成。

第一步,发起API调用

我们的目标是对Account API做测试,所以这里你需要选择Postmant的“Request”模块。进入相应界面后,你需要按照图5的提示依次执行以下三步操作,发起Account API的调用。

  1. 在endpoint输入框中输入“http://127.0.0.1:8080/account/ID_008”;
  2. 选择“GET”方法;
  3. 点击“Send”按钮发起API调用。

图5 Postman发起Account API的测试

完成以上步骤后,界面如图6所示。我们看到返回的response默认以JSON文件的形式显示在下面的Body中。

图6 Postman执行GET后的界面

这样就完成了一次Account API的调用,是不是非常简单。但问题是,这只是一个API调用,并没有对调用结果进行自动化验证。接下来,我们就加上结果验证的部分,一起看看会有什么效果。

第二步,添加结果验证

在Postman中添加结果验证也非常方便,假定我们在Account API测试过程中有以下四个验证点:

  1. 请求的返回状态码(Status Code)应该是200;
  2. 请求的响应时间应该小于200 ms;
  3. 请求返回的response header中应该包含“Content-Type”参数;
  4. 请求返回的response body中,“type”的值应该是“friends”;

那么,接下来我们一起来看看如何使用Postman来添加这四个验证点。

为此,我们首先打开“Tests”界面,然后在右下角的“SNIPPETS”中依次点击:

  1. “Status code: Code is 200”
  2. “Response time is less than 200 ms”
  3. “Response headers:Content-Type header check”
  4. “Response body: JSON value check”

完成以上操作后,“Tests”中会自动生成验证代码,接着只要按照具体的测试要求,对这些生成的代码进行一些小修改就可以了。

在这个例子中,你只需修改需要验证的JSON键值对即可,即代码的第15行。修改完成后我们可以再次点击“Send”按钮发起测试。测试通过的界面如图7所示,最下面的“Test Results”显示四个测试全部通过。

图7 测试通过的界面

第三步,保存测试用例

测试通过后,我们往往希望可以把这个测试request保存下来,以方便后续使用,为此Postman提供了保存测试request的功能,并提供了Collection来分类管理保存多个测试request。

Collection是用来保存测试request的一个集合,Collection内部还可以建立目录结构以方便进一步的分类和管理。

这里我们点击“Save As”按钮,在弹出的对话框中可以建立Collection,并且可以命名测试request并将其保存到Collection中。

我建立了“API Test Demo”的Collection,并且将刚才的测试request命名为“AccountAPI”保存到这个Collection中。

以后再要使用这个测试request时,直接在Collection中打开它,即可使用。同时你如果申请注册了一个Postman账号,就可以很方便地在多个环境中共享这个Collection了。

第四步,基于Postman的测试代码自动生成

至此,你已经掌握了Postman最基本的使用方法,但还有一个问题没有解决。很多时候,你希望将你的测试request作为回归测试用例集成到CI/CD的流程中,这就要求可以通过命令行的方式执行你的测试。为了达到这个目的,目前有两种做法:

1. 将Postman中的测试request用自动化的方式直接转换成API测试的代码。 目前Postman已经支持这个功能了,可以将保存的测试request自动化转换成常见测试框架直接支持的代码,而且支持多语言。- 比如,基于Java的“OK HTTP”和“Unirest”,基于Python的“http.client”和“Requests”,基于NodeJS的“Native”“Request”和“Unirest”,基于JavaScript的“JQuery AJAX”和“XHR”等等。你可以点击如图8所示的“Code”按钮进入代码生成界面。

图8 自动生成API测试代码

2. 利用Newman工具直接执行Postman的Collection。 你需要先将Postman中的Collection导出为JSON文件,然后执行以下命令行。

newman run examples/sample-collection.json;

如何应对复杂场景的API测试?

我在前面分享的Restful API测试案例中,只涉及到了最基本的API的测试方法,而且测试场景也很比较简单(只是单个API的调用)。

但在实际项目中,除了这种单个API的测试场景外,还有很多复杂场景的API测试。所以,为了解决你在实际项目中可能会碰到的一些问题,我再和你聊聊目前一些常见的典型复杂场景,以及相应的测试思路和方法。

测试场景一:被测业务操作是由多个API调用协作完成

很多情况下,一个单一的前端操作可能会触发后端一系列的API调用,由于前端测试的相对不稳定性,或者由于性能测试的要求,你必须直接从后端通过模拟API的顺序调用来模拟测试过程。

这时,API的测试用例就不再是简单的单个API调用了,而是一系列API的调用,并且经常存在后一个API需要使用前一个API返回结果的情况,以及需要根据前一个API的返回结果决定后面应该调用哪个API的情况。

好在,我们已经实现了API的调用和结果解析的代码化,这也就意味着我们可以很灵活地直接用代码来处理这些场景了。 比如,通过代码将上个API调用返回的response中的某个值传递给下一个API,再比如根据上一个API的返回结果决定下一个应该调用哪个API等。

除此之外,我们还需要迫切解决的一个问题是:如何才能高效地获取单个前端操作所触发的API调用序列。

解决这个问题的核心思路是,通过网络监控的手段,捕获单个前端操作所触发的API调用序列。比如,通过类似于Fiddler之类的网络抓包工具,获取这个调用序列;又比如,目前很多互联网公司还在考虑基于用户行为日志,通过大数据手段来获取这个序列。

测试场景二:API测试过程中的第三方依赖

API之间是存在依赖关系的,比如你的被测对象是API A,但是API A的内部调用了API B,此时如果由于某种原因,API B在被测环境中处于不可用状态,那么API A的测试就会受到影响。

在单体架构下,通常只会在涉及到第三方API集成的场景中才会遇到这个问题,所以还不算严重。但是,在微服务架构下,API间相互耦合的依赖问题就会非常严重。

解决这个问题的核心思路是,启用Mock Server来代替真实的API。那么,Mock Server怎么才能真实有效地模拟被替代的API呢?这个问题,我会在分享《紧跟时代步伐:微服务模式下API测试要怎么做?》这个主题时,和你详细探讨。

测试场景三:异步API的测试

异步API是指,调用后会立即返回,但是实际任务并没有真正完成,而是需要稍后去查询或者回调(Callback)的API。

一直以来,异步API测试都是API测试中比较困难的部分。在我看来,对异步API的测试主要分为两个部分:一是,测试异步调用是否成功,二是,测试异步调用的业务逻辑处理是否正确。

  • 异步调用是否成功,这个还比较简单,主要检查返回值和后台工作线程是否被创建两个方面就可以了。
  • 但是,对异步调用业务逻辑的测试就比较复杂了,因为异步API通常发生在一些比较慢的操作上,比如数据库I/O、消息队列I/O等,此时测试往往需要去验证数据库中的值、消息队列中的值等,这就需要测试代码具有访问和操作数据库或者消息队列的能力。- 在实际工程项目中,这些能力一般会在测试框架级别提供,也就是说要求API测试框架中包含对应的工具类去访问和操作数据库或者消息队列等。

总结

通常情况下,无论你采用什么API测试工具,基本的测试步骤往往都是三步,即准备测试数据(并不是所有的API测试都需要这一步)、通过API测试工具发起对被测API的request、验证返回结果的response。

接下来,通过一个简单的Restful API测试为例,探讨了cURL和Postman这两个常用API测试工具的使用。

其中,cURL只具备发起API调用的功能,而不具备结果验证能力,所以严格地说它并不属于测试工具的范畴。Postman常常被用于Web Service API的测试具体的操作,测试流程主要包括:发起API调用、添加结果验证、保存测试用例、基于Postman的测试代码自动生成。

最后,为了应对实际工程项目中复杂的API测试场景,探讨了被测业务操作是由多个API调用协作完成、API测试过程中的第三方依赖、异步API的测试,这三个复杂场景下的测试思路和方法。

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

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

相关文章

用于生成信息提取的大型语言模型综述

论文地址:https://arxiv.org/pdf/2312.17617.pdf 代码仓库:https://github.com/quqxui/Awesome-LLM4IE-Papers 信息抽取(IE)旨在从纯自然语言文本中提取结构化知识(如实体、关系和事件)。最近&#xff0c…

第十一章 Cookie

第十一章 Cookie 1.什么是Cookie2.Cookie的创建3.Cookie的获取4.Cookie值的修改5.谷歌浏览器和火狐浏览器如何查看Cookie6.Cookie的存活设置7.Cookie的path属性8.Cookie练习之免用户名登入 1.什么是Cookie 2.Cookie的创建 下面我看看如何创建Cookie,如何让客户端保…

视频监控设备通过onvif协议接入到视频监控平台

目 录 一、什么是onvif规范 1、onvif的定义 2、onvif的优势 二、AS-V1000监控平台对onvif的支持程度 二、通过onvif接入视频监控设备 1、onvif维护主页面 2、设备发现 3、设备验证 4、设备录入系统 5、通道配置 6、权限分配 三、对onvif设备进行…

AD软件与其他EDA软件工程的问题汇总

1:如何在AD中使用eagle工程 在ad中打不开原理图,要使用导入功能,转化为ad的文件后,就可以打开了 2:打开旧版本的Protel文件 有时候新版本的AD打不开以前Protel的PCB文件,可以在DXP菜单下的Extension下进行配置(Configure&…

回归预测 | Matlab基于SMA+WOA+SFO-LSSVM多输入单输出回归预测

回归预测 | Matlab基于SMAWOASFO-LSSVM多输入单输出回归预测 目录 回归预测 | Matlab基于SMAWOASFO-LSSVM多输入单输出回归预测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 SMAWOASFO-LSSVM回归预测 基于黏菌算法鲸鱼算法向日葵算法优化LSSVM回归预测 其中包含三种改进…

国产系统-银河麒麟桌面版安装wps

0安装版本 系统版本 版本名称:银河麒麟桌面版操作系统V10(SP1) 软件版本 wps个人版2019 1双击安装 1.1卸载自带wps 为什么要卸载没有序列号,授权过期,不是免费的,通过先安装/在升级个人版跳过输入序列号问题等等原因 1.1.1当前自带的wps版本 1.1.2卸载 不卸载无法安装在…

[Kubernetes]9. K8s ingress讲解借助ingress配置http,https访问k8s集群应用

前面讲解了使用Helm部署mysql集群,这里来看看使用Ingress搭建负载均衡功能 1.介绍 功能类似 Nginx ,可以根据域名、路径把请求转发到不同的 Service , Ingress 为外部访问集群提供了一个 统一 入口, 避免 了 对外暴露集群端口 ,可以配置 https,http访问集群应用,接下来看看如…

React.Children.map 和 js 的 map 有什么区别?

JavaScript 中的 map 不会对为 null 或者 undefined 的数据进行处理,而 React.Children.map 中的 map 可以处理 React.Children 为 null 或者 undefined 的情况。 React 空节点:可以由null、undefined、false、true创建 import React from reactexport …

参数小,性能强!开源多模态模型—TinyGPT-V

安徽工程大学、南洋理工大学和理海大学的研究人员开源了多模态大模型——TinyGPT-V。 TinyGPT-V以微软开源的Phi-2作为基础大语言模型,同时使用了视觉模型EVA实现多模态能力。尽管TinyGPT-V只有28亿参数,但其性能可以媲美上百亿参数的模型。 此外&…

【Docker基础二】Docker安装Mysql8

下载镜像 安装mysql(版本:8.0.35) # 拉取镜像 docker pull mysql:8.0.35 # 查看镜像是否已经下载 docker images 创建挂载目录 # 宿主机上创建挂载目录 (可以不创建,docker run -v配置了挂载目录,docker会自动…

Nginx配置反向代理实例二

Mac 安装Nginx教程 Nginx配置反向代理实例一 提醒一下:下面实例讲解是在Mac系统演示的; 反向代理实例二实现的效果 使用nginx 反向代理,根据访问的地址跳转到不同端口的服务中 nginx 监听端口为81; 访问地址1:http:/…

2022-ECCV-Explaining Deepfake Detection by Analysing Image Matching

一、研究背景 1.大量工作将深度伪造检测作为一个二分类任务并取得了良好的性能。 2.理解模型如何在二分类标签的监督下学习伪造相关特征仍难是个艰巨的任务。 3.视觉概念:具有语义的人脸区域,如嘴、鼻子、眼睛。 二、研究目标 1.验证假设,并…

你了解计算机网络的发展历史吗?

1.什么是计算机网络 计算机网络是指将一群具有独立功能的计算机通过通信设备以及传输媒体被互联起来的,在通信软件的支持下,实现计算机间资源共享、信息交换或协同工作的系统。计算机网络是计算机技术与通信技术紧密结合的产物,两者的迅速发展…

深入理解 Flink(四)Flink Time+WaterMark+Window 深入分析

Flink Window 常见需求背景 需求描述 每隔 5 秒,计算最近 10 秒单词出现的次数 —— 滑动窗口 每隔 5 秒,计算最近 5 秒单词出现的次数 —— 滚动窗口 关于 Flink time 种类 TimeCharacteristic ProcessingTimeIngestionTimeEventTime WindowAssign…

Django(六)

员工管理系统(用户管理&#xff09; {% extends layout.html %}{% block content %}<div class"container"><div style"margin-bottom: 10px"><a class"btn btn-success" href"#"><span class"glyphicon gl…

ADOV路由和DSR路由matlab对比仿真

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.本算法原理 4.1 ADOV路由&#xff08;Ad hoc On-demand Distance Vector Routing&#xff09; 4.2 DSR路由&#xff08;Dynamic Source Routing&#xff09; 5.完整程序 1.程序功能描述 ADOV路由和DSR…

Vue3-44-Pinia- 安装步骤

介绍 本文介绍 在 vue3 中 安装 Pinia 的步骤 安装步骤 1、npm 安装 npm install pinia》 安装完成后可以看到 package.json 中添加了 pinia 的依赖信息 2、main.ts 中配置 // 引入 vue实例创建方法 import { createApp } from vue// 引入pinia import { createPinia } fro…

【AIGC】一组精美动物AI智能画法秘诀

如何使用AI绘画&#xff0c;从以下角度&#xff0c;依据表格内容梳理&#xff0c;表格如下&#xff1a; 外貌特征物种姿势特征描述场景风格技术描述小巧可爱幼小浣熊倚在桌子上具有人形特征中世纪酒馆电影风格照明8k分辨率细节精致毛茸茸手持咖啡杯Jean-Baptiste Monge的风格蓝…

C++ n皇后问题 || 深度优先搜索模版题

n− 皇后问题是指将 n 个皇后放在 nn 的国际象棋棋盘上&#xff0c;使得皇后不能相互攻击到&#xff0c;即任意两个皇后都不能处于同一行、同一列或同一斜线上。 现在给定整数 n &#xff0c;请你输出所有的满足条件的棋子摆法。 输入格式 共一行&#xff0c;包含整数 n 。 …

14.LVM管理

LVM管理 文章目录 LVM管理1. lvm的应用场景及其弊端2. 物理卷、卷组、逻辑卷3. lvm管理3.1 部署lvm3.2 卷组管理3.3 逻辑卷管理 1. lvm的应用场景及其弊端 应用场景&#xff1a; 随着公司的发展&#xff0c;数据增长较快&#xff0c;最初规划的磁盘容量不够用了 弊端&#xff1…