在 REST Assured 的官方 GitHub 上有这样一句简短的描述: Java DSL for easy testing of REST services 简约的 REST 服务测试 Java DSL

REST Assured 官方的 README 第一句话对进行了一个优点的概述,总的意思表达的就是简单好用。那么 REST Assured 有哪些优点,又该如何使用呢?

用 Java 做接口自动化测试首选 REST Assured,具体原因如下:

  • 开源
    • 简约的接口测试 DSL
    • 支持 xml json 的结构化解析
    • 支持 xpath jsonpath gpath 等多种解析方式
    • 对 spring 的支持比较全面
      添加 maven 依赖
<dependency><groupId>io.rest-assured</groupId><artifactId>rest-assured</artifactId><version>4.0.0</version><scope>test</scope></dependency>

我们对接口进行测试一般由三步曲:传参、发请求、响应结果断言,REST Assured给我们提供了清晰的三步曲,以given、when、then的结构来实现,基本写法如下:

//使用参数
given().param("key1", "value1").param("key2", "value2").when().post("/somewhere").then().body(containsString("OK"))
//使用X-Path (XML only)
given().params("firstName", "John", "lastName", "Doe").when().post("/greetMe").then().body(hasXPath("/greeting/firstName[text()='John']"))

请求体body如下

{"password": "elcrD28ZSLLtR0VLs/jERA\u003d\u003d\n","grant_type": "password","scope": "server","userType": 1,"username": "xxx"}

Request Header 如下:

Headers:    Authorization=Basic c3lzdGVtxxxRlbQ==Host=47.103.xxx.133Accept=*/*Content-Type=application/json; charset=ISO-8859-1

我们发送请求经常需要带有参数,使用 given() 就可以实现,当时当我们使用 given() 的时候发现其中有很多传参方法如下:

没错,在传参的方法中包含了 param、pathParam、queryParam 和 formParam,下面来研究下这几个传参方法的区别

  • param
    • 通常我们都会使用 given().param 方法来传参,REST Assured 会根据 HTTP 方法自动尝试确定哪种参数类型(即查询或表单参数),如果是 GET,则查询参数将自动使用,如果使用 POST,则将使用表单参数;
  • queryParam 和 formParam
    • 有时候在 PUT 或 POST 请求中,需要区分查询参数和表单参数时,就需要使用queryParam 和 formParam 方法了,具体写法如下:
given().formParam("formParamName", "value1").queryParam("queryParamName", "value2").when().post("/something")
  • pathParam
  • 使用given时指定请求路径的参数,这个方法很少用到,或者说我本人几乎没用到过(可能我的修行还不够,踩坑还太少~);具体写法如下:
given().pathParam("OAuth", "oauth").pathParam("accessToken", "token").when(). post("/auth/{OAuth}/{accessToken}").then()...
  • header/headers
  • 经常还需要在请求头中带入参数,这个时候就可以使用header或headers方法,写法如下:
given().header("Authorization","Basic c3lzdGVtOxxxbQ==").header("Host","47.xxx.xxx.133")
  • 或者用headers将多个参数写在一起:
  • given()
  •    .headers("Authorization","Basic c3lzdGVtxxx3RlbQ==","Host","47.xxx.xxx.133")
    
- cookie
- 有时候需要在请求中带入cookie,restassured提供了cookie方法来实现:
- ```
- given()
-       .cookie("c_a","aaaaaa")
-       .cookie("c_b","bbbbbb"). ..
  • contentType
  • 经常还会设置contentType,最常见的就是application/json了,写法如下:
given().contentType("application/json"). ..
//或者
given().contentType(ContentType.JSON). ..
  • body
  • 在POST, PUT 或 DELETE请求中,我们经常还需要带上请求体body,写法如下:
  • given().body(“{\n” +
  •             "\t\"password\": \"elcrD28xxxR0VLs/jERA\\u003d\\u003d\\n\",\n" +
    
  •             "\t\"grant_type\": \"password\",\n" +
    
  •             "\t\"scope\": \"server\",\n" +
    
  •             "\t\"userType\": 1,\n" +
    
  •             "\t\"username\": \"xxx\"\n" +
    
  •             "}")
    
也可以用request更为明确的指出是请求body:

given().request().body(“{\n” +
“\t"password”: “elcrD28xxxR0VLs/jERA\u003d\u003d\n”,\n" +
“\t"grant_type”: “password”,\n" +
“\t"scope”: “server”,\n" +
“\t"userType”: 1,\n" +
“\t"username”: “xxx”\n" +
“}”)

- 没有参数
- 如果我们没有参数需要传递,也可以省略掉given():

get(“/lotto”).then().assertThat().body(“lotto.lottoId”, equalTo(5));

- proxy
- 有时候我们需要进行接口的调试,抓包是最常用的一种方式,rest-assured 提供了 proxy 方法,可以设置代理,写法如下:

given().proxy(“127.0.0.1”,8888). …

实际运行结果: - when主要用来触发请求,在when后面接着请求URL:

given().when().post(“http://47.103.xxx.133/auth/oauth/token”). …

- 前面在 given 中我们设置了很多请求参数,在 when 中也可以设置,只不过要注意的是在请求之前设置;这也比较好理解,如果再请求之后的话,参数都设置怎么发请求呢?

given()
.when()
.contentType(ContentType.JSON)
.headers(“Authorization”,“Basic c3lzxxx3RlbQ==”,“Host”,“47.xxx.xxx.133”)
.request().body(“{\n” +
“\t"password”: “elcrD28ZSLLtR0VLs/jERA\u003d\u003d\n”,\n" +
“\t"grant_type”: “password”,\n" +
“\t"scope”: “server”,\n" +
“\t"userType”: 1,\n" +
“\t"username”: “qinzhen”\n" +
“}”)
.post(“http://47.xxx.xxx.133/auth/oauth/token”)
. …

- 断言-then().body()
- then().body() 可以对响应结果进行断言,在 body 中写入断言:
- ```
- .. post("http://47.xxx.xxx.133/auth/oauth/token")
-    .then().statusCode(200).body("code",equalTo(1));

其中statusCode(200)是对状态码的断言,判断状态码是否为200; body(“code”,equalTo(1))是对返回体中的 code 进行断言,要求返回 code值为1 。

实操演示:
我们将上述的 given、when、then 结合起来看一下实际运行效果,这里在运行之前再提一个功能,我们可以在 when 和 then 后面加上.log().all(),这样在运行过程中就可以把请求和响应的信息都打印出来:


  • 获取响应-then().extract().body().path(“code”)
  • 我们可以在 then 后面利用 .extract().body() 来获取我们想要 body 的返回值,它们也可以直接接在断言后面,写法如下:
  • … .then()
  •     .log().all().statusCode(200).body("code",equalTo(1))
    
  •     .extract().body().path("code");
    
实操演示:
演示前再来看一个新的功能,上面我们再写请求体 body 时时这样的: 

body(“{\n” +
“\t"password”: “elcrD28ZxxxVLs/jERA\u003d\u003d\n”,\n" +
“\t"grant_type”: “password”,\n" +
“\t"scope”: “server”,\n" +
“\t"userType”: 1,\n" +
“\t"username”: “qinzhen”\n" +
“}”)

看起来有点丑,改造一下;rest-assured 为我们提供了一个利用 HashMap 来创建json 文件的方法,先把要传的字段放入 hashmap 中,然后用 contentType 指明JSON 就可以了,具体写法如下:

HashMap map = new HashMap();
map.put(“password”,“elcrD28ZSLLtR0VLs/jERA\u003d\u003d\n”);
map.put(“grant_type”,“password”);
map.put(“scope”,“server”);
map.put(“userType”,1);
map.put(“username”,“xxx”);
given()
.headers(“Authorization”,“Basic c3lzdGVtxxxlbQ==”,“Host”,“47.xxx.xxx.133”)
.contentType(JSON)
.body(map). …

现在进行完整的请求,获取返回值 code 并打印:

HashMap map = new HashMap();
map.put(“password”,“elcrD28ZSLLtR0VLs/jERA\u003d\u003d\n”);
map.put(“grant_type”,“password”);
map.put(“scope”,“server”);
map.put(“userType”,1);
map.put(“username”,“xxx”);
Integer code =
given()
.headers(“Authorization”,“Basic c3lzdGVtxxxlbQ==”,“Host”,“47.xxx.xxx.133”)
.contentType(JSON)
.body(map).
when()
.log().all().post(“http://47.xxx.xxx.133/auth/oauth/token”).
then()
.log().all().statusCode(200).body(“code”,equalTo(1))
.extract().body().path(“code”);
System.out.println(“返回code的值是:”+code);

运行结果:![](https://img-blog.csdnimg.cn/img_convert/b21f719a9873c7ba0fbc382eef68edb6.png)
关于REST Assured,这里仅仅算是初步认识。认识它的语法结构和功能,对于更多丰富的用法还需要慢慢探索研究,特别是断言的部分,是测试工程师最常用最终要的功能之一。REST Assured提供的完整断言手段,在后续文章中我们一起探讨。对于想系统进阶提升测试开发技能的同学,推荐霍格沃兹测试学院出品的 《测试开发从入门到高级实战》系统进阶班课程。4 个月由浅入深,强化集训,测试大咖通过 8+ 企业级项目实战演练,带你一站式掌握 BAT 一线测试开发工程师必备核心技能(对标阿里巴巴P6+,挑战年薪50W+)!学员直推 BAT 名企测试经理,普遍涨薪 50%+!![](https://img-blog.csdnimg.cn/img_convert/4c52e69768629427c619cc5215e764a7.png)
### 测试开发实战干货 | BAT 内推职位 | 大咖公开课[原文链接](https://mp.weixin.qq.com/s?__biz=MzU3NDM4ODEzMg==&mid=2247486810&idx=1&sn=4aa41547a92e761699b99928bc132442&chksm=fd326f91ca45e68713627d612d29fecabf1e1f4c5657a19f72dce47c16b695c1dfbe16ce2a02#rd) [获取更多技术文章分享](https://qrcode.ceba.ceshiren.com/link?name=article&project_id=qrcode&from=csdn2&timestamp=1650513454)

利器 | Java 接口自动化测试首选方案:REST Assured 实践 (一)相关推荐

  1. java接口自动化测试-导入xslx模板进行批量检索

    java接口自动化测试-导入xslx模板进行批量检索!!! 如有需要私信我 编写Excel类进行封装参数 ----不间隔直接7-8-9联查 间隔中查找根据添加数组进行查找 建议封装类进行后期调用

  2. 手把手教你搭建java接口自动化测试框架(四):断言、生成测试报告

    手把手教你搭建java接口自动化测试框架(四):断言.生成测试报告 上一集说到post和Get请求,请求后得到的响应(即接口返回值)是我们想要的吗 比如网站上get接口文档说明 : "dat ...

  3. Java接口自动化测试框架学习

    Java接口自动化测试框架学习 高级软件测试,性能测试,功能测试,自动化测试,接口测试,移动端测试,手机测试,WEB测试,渗透测试,测试用例设计,黑盒测试,白盒测试,UFT高级测试,Android测试 ...

  4. 面面俱到的Java接口自动化测试实战

    第1章 接口自动化测试整体认知 了解什么是接口和为什么要做接口测试.并且知道接口自动化测试应该学习哪些技术以及接口自动化测试的落地过程. 1-1 导学章节 1-2 什么是接口 1-3 为什么要做接口测 ...

  5. java接口自动化测试的搭建_java接口自动化(一) - 接口自动化测试整体认知 - 开山篇(超详解)...

    简介 了解什么是接口和为什么要做接口测试.并且知道接口自动化测试应该学习哪些技术以及接口自动化测试的落地过程.其实这些基本上在python接口自动化的文章中已经详细的介绍过了,不清楚的可以过去看看.了 ...

  6. Java接口自动化测试(2)接口测试与UI测试的区别

    自动化测试金字塔结构 就是酱婶的.对自动化测试金字塔结构的解读可以分为以下几个方面: 越下层投入应当越多,这是金字塔结构主要提出的观点,认为单元测试的稳定性和投入保证了产品质量: 越下层效率会越高,因 ...

  7. Java接口自动化之Maven工具使用

    VOL 190 30 2020-12 今天距2021年1天 这是ITester软件测试小栈第190次推文 点击上方蓝字"ITester软件测试小栈"关注我,每周一.三.五早上 08 ...

  8. 前端调用后端接口 xhr 只看到一次 实际调用两次_持续演进的接口自动化测试方案...

    点击关注"有赞coder" 获取更多技术干货哦- 作者:Henry 部门:美业测试 前言 接口自动化测试是个老生常谈的话题,基本上每个测试团队都会涉及,市面上大部分文章会从如何设计 ...

  9. HTTP 异步接口自动化测试方案

    背景: 随着互联网应用技术复杂性不断提高,高效的测试技术和工具逐渐成为高质量应用的必要保证. HTTP 接口即基于 HTTP 协议.可远程访问的接口,是分布式应用系统的一种技术实现. HTTP 协议则 ...

最新文章

  1. IIS7.5 错误代码0x8007007e HTTP 错误 500.19
  2. 【网络基础】URI 和 URL 的纠缠
  3. 开始使用asp.net ajax的控件工具包AJAX Control Toolkit
  4. android 启动service报错,Android小经验
  5. STM32 通用定时器基本原理
  6. 一步步编写操作系统 29 cpu缓存简介
  7. SQL SERVER备份脚本
  8. 配置了tomcat,更改了默认端口为8070,还是访问不了
  9. CodeForces 621C 数学概率期望计算
  10. gradle Could not resolve 依赖包
  11. OllyDbg学习---深入理解消息驱动原理(2)
  12. JAVA8之 日期时间时区之 ZoneId[ZoneOffset, ZoneRegion] 笔记
  13. 互联网早报:腾讯推出“电子签平台” 用微信就能开出具备法律效力的电子收据
  14. GNN-Retro 逆合成路线规划
  15. 年月日时天干地支推算(农历、公历)
  16. 狐妖小红娘手游服务器维护,狐妖小红娘手游官网-腾讯游戏
  17. android 查看系统数据库
  18. Mac下Charles踩坑记录
  19. Matlab牛顿迭代法求方程的根(GUI)
  20. 安卓装逼技巧:QQ空间变iPhone8客户端

热门文章

  1. 他是清华姚班的天才少年,17 科满分传奇,32 岁斩获“诺贝尔风向标”斯隆奖...
  2. linux下shell命令之hwclock
  3. win8dnf计算机内存不足,Win8电脑内存不足解决方法介绍
  4. 黄健翔激情解说--修改版
  5. Lustre—配置和管理磁盘配额
  6. codeblocks改变主题背景颜色
  7. 自制MyEclipse豆沙绿主题
  8. Matlab R2017b 自动驾驶工具箱学习笔记(2)_Tutorials_Visual Perception Using Monocular Camera
  9. 花呗利息计算器_花呗利息是多少?花呗利息怎么算
  10. 右键删除或新增 Open Folder as Intellij IDEA Project