如何确保API 的稳定性与正确性?你只需要这一招

news2024/11/11 4:53:34

一、什么是rest-assured

现在,越来越多的 Web 应用转向了RESTful的架构,很多产品和应用暴露给用户的往往就是一组 REST API,这 样有一个好处,用户可以根据需要,调用不同的 API,整合出自己的应用出来。从这个角度来讲,Web 开发的成本会越来越低,人们不必再维护自己的信息孤岛,而是使用 REST API 这种组合模式。

1080×804 37.6 KB

那么,作为 REST API 的提供者,如何确保 API 的稳定性与正确性呢?全面系统的测试是必不可少的。Java 程 序员常常借助于 JUnit 来测试自己的 REST API,不,应该这样说,Java 程序员常常借助于JUnit 来测试 REST API的实现!从某种角度来说,这是一种“白盒测试”,Java 程序员清楚地知道正在测试的是哪个类、哪个方 法,而不是从用户的角度出发,测试的是哪个REST API。

1080×654 45.9 KB

Rest-Assured 是一套由 Java 实现的 REST API测试框架,它是一个轻量级的REST API 客户端,可以直接编写代码向服务器端发起 HTTP请求,并验证返回结果;它的语法非常简洁,是一种专为测试 REST API 而设计的 DSL。使用 Rest-Assured 测试 REST API,就和真正的用户使用 REST API 一样,只不过 Rest-Assured 让这一切变得自动化了。

1073×733 33.5 KB

二、模拟get请求

雪球网是一个股票投资网站,你可以使用网站的搜索功能来查询股票信息,比如我们想查询sougou的信息,下 面利用了charles分析工具来查看请求和回答:

这是一个Get请求,返回的内容格式如下:

现在,我们使用 Rest-Assured 来编写一个简单的测试程序调用相同的Get请求:

  • 第一步,我们要判断这是什么格式数据:json

  • 第二步,确定请求地址:从charles的结果中获取y为https://xueqiu.com/stock/search.json

1064×275 24.7 KB

第三步,填写表单:从chrome浏览器检查结果中查询request的query信息是code:sougou

我们的代码也很简单:

返回的结果却很残酷:

1080×274 38.9 KB

与登陆账号,刷新页面有关的话,我首先想到了cookie,网站都用cookie来保存账号相关信息,于是加入 cookie:

返回结果正确,你问我惊不惊喜,老实回答,不惊喜。因为我搞不明白为什么一个查询需要cookie验证,如果 不加cookie,返回的信息却是没有登陆!

899×974 49.2 KB

显然,我的cookie并不包含登陆信息,因为我压根就没有登陆,当然这是网站的设计,与rest-assured无关。

1080×474 70 KB

更进一步

怎么区别xml与json

答:你看就知道了嘛,xml长这个样子

json长这个样子

given,when,then分别是什么

965×707 22.4 KB

答:given用于放置需要的参数,比如上面例子中,我将访问参数:code和cookie放到了given里;when用于填 写要访问的url;then进行断言,来来判断结果是否正确。

三、模拟post请求

有的时候,我们想提交表单,这种情况下使用get会非常被动,于是post登场了。

下面是代码。

我相信此时你的内心是这样的。

别着急,下面我会讲清楚…

在我大万维网世界中,TCP就像汽车,我们用TCP来运输数据,它很可靠,从来不会发生丢件少件的现象。但是 如果路上跑的全是看起来一模一样的汽车,那这个世界看起来是一团混乱,非常紧急的警车可能被前面的汽车拦堵在路上,整个交通系统一定会瘫痪。

1080×806 102 KB

为了避免这种情况发生,交通规则HTTP诞生了。HTTP给汽车运输设定了好几个服务类别,有GET, POST, PUT, DELETE等等,HTTP规定,当执行GET请求的时候,要给汽车贴上GET的标签(设置method为GET),而且要求 把传送的数据放在车顶上(url中)以方便记录。如果是POST请求,就要在车上贴上POST的标签,并把货物放 在车厢里。当然,你也可以在GET的时候往车厢内偷偷藏点货物,但是这是很不光彩;也可以在POST的时候在车顶上也放一些数据,让人觉得傻乎乎的。HTTP只是个行为准则,而TCP才是GET和POST怎么实现的基本。

1080×818 110 KB

四、使用断言

使用equalTo

在前面,我们使用了equalTo判断值是否是“搜狗”:

它的作用显而易见:判断值是否相同。比如下面的例子

如果你想验证lottoId是否等于5,你可以这样做:

使用hasItems

906×677 29 KB

你可以用再次equalTo(),对winnerId[0]用一次,对winnerId[1]用一次。

992×714 29.9 KB

哈哈,当然不是。你可以使用hasItems,它是这么使用的:

从根开始定位

1067×701 30.2 KB

额…请教王师傅。

1080×608 27.8 KB

比如下面的代码,我们可以这么验证:

使用find

1000×673 25.7 KB

1024×641 27.2 KB

答对了,请一定要记住xml和json的区别,不要混谈,那么你能编写一个测试来验证杂货(groceries)的类别是 否包含巧克力(Chocolate)和咖啡(Coffe)吗?

1051×684 23.2 KB

这确实达到了我的要求,但代码明显有很多bug,如果我更改了category的位置,像下面这样,你的代码就不 适用了,我不难为你了,请王师傅来解答吧:

1080×688 35.2 KB

find的用法展示的很清楚,不需要我多讲,当然还有一点要注意,你可以这么使用find:

**是个特殊用法,它从xml文档根部开始,进行深度搜索,直到找到符合我们需要的项。

989×740 34 KB

使用findAll

1047×647 29.3 KB

现在我手头只有20块钱,我只能买两本书,我更喜欢世纪的谚语和白鲸记,现在的任务是:挑选出格低于10的书籍,并且标题是“世纪的谚语(Sayings of the Century)”和“白鲸记(Moby Dick)”

1023×666 27.8 KB

对的,这时候应该使用findAll,可以粗鲁的认为多个find的叠加。findAll可以筛选出一批符合要求的数据,而 find只能筛选出一个符合要求的数据,这就像是我们只能挑出一个人领取一等奖,但有很多人可以拿参与奖, 两个方法都有自己的用武之地。

1080×512 23.2 KB

下面的代码展示了findAll的用法:

五、提取想要的值

有时候,我们并不想验证是否正确,我们只想取出这个值以进行下一步处理,比如我想取出next的链接:/title?page=2,这种情况怎么办呢?

下面的代码判断内容是不是JSON,并且标题是My Title的话,就返回href链接/title?page=2,这个值被存放在nextTitleLink中,以供我们以后使用。

880×561 24.4 KB

892×470 19.9 KB

当然,有两点需要注意:

  • 返回类型是Response,我们可以用Response.xxx来二次提取想要的值。

  • extract().后面是response()方法,不要写错了。

六、更改默认值

rest-assured有很多默认值,也正因为如此,需要我们的填的参数可以很少,也可以很多,就像画画一样,可以很精致,也可以很简洁。

1080×775 40.7 KB

修改端口

rest-assured发起请求时,默认使用的host为localhost,端口为8080,如果你想使用不同的端口,你可以这样做:

或者是这样

或者

修改baseURI和basePath

你也可能改变默认的baseURI、basePath

这就意味着,类似 get("/hello") 这样的一个请求,其实完整的请求为:http://myhost.com:80/resource/hello , 并且使用基础授权认证"username" and “password”。

其他

其他的默认值可以参考下面:

重置

你也可以重置为标准的baseURL(localhost)、basePath(空)、标准端口port(8080)、标准根路径root path(" "),默 认的认证scheme(none)以及URL编码(true),通过下面的方法重置:

七、specification

在不同的测试用例当中,我们可能会有重复的响应断言或者是请求参数,那么我们可以将重复的这一部分提取出来定义一个规范或者模板,这样的话在后续的测试用例当中就可以使用这个规范模板了。

1032×1248 58.3 KB

为了达到这个效果,我们可以使用RequestSpecBuilder或 ResponseSpecBuilder来实现,它们之间的区别 是,前者用在请求中,后者则用在div中。

ResponseSpecification重用

例如,你想在多个测试用例中,都使用这样的断言:判断响应状态码是否为200,并且Json数组"x.y"的大小是否 等于2。你可以定义一个ResponseSpecBuilder来实现这个功能:

在这个例子中,需要重用的两个断言数据被定义在"responseSpec",并且与另外一个div断言合并,组成了这 个测试用例中全部的断言,那么这个测试用例需要全部断言都通过用例结果才会通过,一旦其中一个断言失 败,则测试用例的测试结果为失败。

RequestSpecification重用

同样,假如你想在多个测试用例中重用请求数据,可以通过下面的代码来实现:

这里的请求数据被合并在"requestSpec"中,所以这个请求包含了两个参数(“parameter1"和"parameter2”)以及一 个头部(“header1”)。

总结

本文就rest-assured的基本功能进行举例说明,其中例子大多来自于官方文档,同时我也建议大家多去阅读该开 发文档,其中有很多我们没有讲到的东西。

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

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

相关文章

Linux常用命令——scp命令

在线Linux命令查询工具(http://www.lzltool.com/LinuxCommand) scp 加密的方式在本地主机和远程主机之间复制文件 补充说明 scp命令用于在Linux下进行远程拷贝文件的命令,和它类似的命令有cp,不过cp只是在本机进行拷贝不能跨服务器,而且s…

C++基础入门丨7. 指针——一文搞懂指针

操作系统:Windows 10 IDE:Visual Studio 2019 文章目录1 什么是指针2 指针变量的定义和使用3 指针所占用的空间4 空指针和野指针5 const修饰指针6 指针和数组7 指针和函数8 指针、函数、数组1 什么是指针 我们知道每一个变量都有一个内存位置&#xff0…

【ESLint】ESLint的安装配置及vscode插件

一、什么是ESLintESLint是可组装的JavaScript和JSX检查工具。工作中常用,所以最好有所了解。可以在官网中查询相关规则:ESLint - Pluggable JavaScript linter - ESLint中文二、ESLint的安装配置在创建自定义vue项目时,要勾选CSS Pre-process…

SpringCloud 微服务工具集

SpringCloud 微服务工具集 v1.1 微服务架构集大成者,云计算最佳业务实践。 版本: Hoxton SR6 1.什么是微服务 官网: https://www.martinfowler.com/articles/microservices.html In short, the microservice architectural (架构)style is…

32种EMC标准电路分享-电路接口防护-标准参考电路

30种EMC标准电路01 AC24V接口EMC设计标准电路02 AC110V-220VEMC设计标准电路03 AC380V接口EMC设计标准电路04 AV接口EMC设计标准电路05 CAN接口EMC设计标准电路06 DC12V接口EMC设计标准电路07 DC24V接口EMC设计标准电路08 DC48接口EMC设计标准电路09 DC110V接口EMC设计标准电路…

Blender 物理属性 (四)流体

文章目录流体简介.域.创建域.直接创建.通过物体创建.域的属性.设置.液体(域类型为液体时).扩散.网格.气体(域类型为气体时).消融.噪波.视图显示.缓存.流.创建水.创建火与烟.流来源.初始速度.渲染火与烟.效果器.流体简介. 1 流体用…

这些好用的办公软件分享给你

软件一:备忘录 现在大部分手机备忘录都提供语音记录功能,可以实时录音并转换成文本内容记录下来,使用起来还是比较方便的,但是要注意它支持转换的时长是有限制的哦! 操作步骤:打开手机备忘录,…

【宝塔】【Windows】【Blessing-Skin】【我的世界】用宝塔Windows搭建皮肤站

文章目录前言所需环境相关链接安装宝塔安装步骤访问宝塔同意协议安装环境安装WNMP添加站点开始安装皮肤站配置网站配置Nginx URL重写规则(即 伪静态)配置PHP安装皮肤站一些小调整安装插件常见问题 - 插件市场严重错误添加认证服务器结尾前言 为什么不用…

数影周报:LOL源代码遭黑客拍卖,阿里杭州西溪全球总部2023年底前全面建成

本周看点:《英雄联盟》游戏源代码遭黑客拍卖;消息称Salesforce 将任命三位新独立董事;2022年下架移动应用程序420款;抖音超市上线;戴尔以约1亿美元收购以色列初创公司Cloudify......数据安全那些事《英雄联盟》游戏源代…

【Pytorch项目实战】之自然语言处理:RNN、LSTM、GRU、Transformer

文章目录自然语言处理算法一:循环神经网络(Recurrent Natural Network,RNN)算法二:长短时记忆神经网络(Long Short-Term Memory,LSTM)算法三:门控循环单元神经网络&#…

基于android的新闻阅读系统

需求信息: 从模块的角度将APP的主要内容划分为登录模块、新闻模块、留言模块、报道模块、关注模块、语音模块这六个功能模块,完成以下功能: (1)登录模块 当用户打开应用程序后,如果直接登录,由于…

ElasticSearch - DSL查询语法

目录 DSL查询分类 全文检索查询 精确查询 地理查询 复合查询 相关性算分 算分函数查询 BooleanQuery DSL查询分类 Elasticsearch提供了基于JSON的DSL(Domain Specific Language)来定义查询常见的查询类型包括: 查询所有:查询出所有的数据&#x…

Rust库交叉编译以及在Android与iOS中使用

本篇是关于交叉编译Rust库,生成Android和iOS的二进制文件(so与a文件),以及简单的集成使用。 1.环境 系统:macOS 13.0 M1 Pro,Windows 10 Python: 3.9.6 Rust: 1.66.1 NDK: 21.4.7075529 这里就不具体说…

收藏贴!新手到底应该购买Salesforce专业版还是企业版?

Salesforce专业版(Professional Edition)是一个适用于小型企业的工具,它具有完整Salesforce套件的许多功能,但也有一些明显的限制。本篇文章将具体阐明Salesforce专业版是什么,它的优势以及其与企业版(Ente…

SQL Server 2008如何创建定期自动备份任务

我们知道,利用SQL Server 2008数据库可以实现数据库的定期自动备份。方法是用SQL SERVER 2008自带的维护计划创建一个计划对数据库进行备份,下面我们将SQL SERVER 2008定期自动备份的方法分享给大家。 首先需要启动SQL Server Agent服务,这个…

Python实现vlog生成器

Python实现vlog生成器 vlog,全称为Video blog,意为影音博客,也有翻译为微录。 本文将尝试用Python基于Moviepy从一个文本文件中自动生成一个视频格式的vlog,实现的功能如下: 将文件的第一行标题生成视频的片头将文件…

C++——红黑树

目录 红黑树介绍 红黑树实现 节点的插入 完整代码 红黑树介绍 红黑树,是一种二叉搜索树,但在每个结点上增加一个存储位表示结点的颜色,可以是Red或Black。 通过对任何一条从根到叶子的路径上各个结点着色方式的限制,红黑树确…

5 使用pytorch实现线性回归

文章目录前提的python的知识补充基本流程准备数据构造计算图loss以及oprimizer循环训练课程代码课程来源: 链接课程内容参考: 链接以及(强烈推荐)Birandaの前提的python的知识补充 pytorch 之 call, init,forward pytorch系列nn.…

Python进行因子分析

1 因子分析 1.1 定义 因子分析法(Factor Analysis)是一种利用降维的思想,从研究原始变量相关矩阵内部的依赖关系出发,把一些具有错综复杂关系的变量归结为少数几个综合因子的一种多变量统计分析方法。其优势在于不仅可以在减少大量指标分析的工作量的同…

尚硅谷hello scala-配置idea2022.1.2版本创建scala2.11.8版本maven文件

0_前置说明 软件版本 idea2022.1.2 scala2.11.8 java1.8.0_144 尚硅谷资源下载 关注b站尚硅谷 idea资源 百度网盘:https://pan.baidu.com/s/1Gbavx34OfF29LZqJ8dc85g?pwdyyds 提取码: yyds B站直达:​https://www.bilibili.com/video/BV1CK411d7a…