涉县网站设计/广东百度seo
1 . 初识 REST Assured
在 REST Assured 的官方 GitHub 上有这样一句简短的描述: Java DSL for easy testing of REST services 简约的 REST 服务测试 Java DSL
1.1 优点:
REST Assured 官方的 README 第一句话对进行了一个优点的概述,总的意思表达的就是简单好用。那么 REST Assured 有哪些优点,又该如何使用呢?
用 Java 做接口自动化测试首选 REST Assured,具体原因如下:
开源
简约的接口测试 DSL
支持 xml json 的结构化解析
支持 xpath jsonpath gpath 等多种解析方式
对 spring 的支持比较全面
功能很齐全,部分我自己也还没有具体用到,了解到了方向,需要时随时查找学习
2. 如何使用
添加 maven 依赖
<dependency><groupId>io.rest-assured</groupId><artifactId>rest-assured</artifactId><version>4.0.0</version><scope>test</scope>
</dependency>
2.1 基本三步曲
我们对接口进行测试一般由三步曲:传参、发请求、响应结果断言,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']"))
2.2 分步拆解
前提:现有一个post请求的登录接口。
http://47.103.xxx.133/auth/oauth/token,
请求体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
分步拆解一
Givern
我们发送请求经常需要带有参数,使用 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主要用来触发请求,在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
then后面可以跟断言,也可以获取响应值
断言-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 。
注:这里的equalTo使用的是hamcrest断言,不了解的小伙伴可参考另外一篇文章:Junit原生断言和hamcrest断言的区别及使用
实操演示:
我们将上述的 given、when、then 结合起来看一下实际运行效果,这里在运行之前再提一个功能,我们可以在 when 和 then 后面加上.log().all(),这样在运行过程中就可以把请求和响应的信息都打印出来:
获取响应-then().extract().body().path(“code”)
我们可以在 then 后面利用 .extract().body() 来获取我们想要 body 的返回值,它们也可以直接接在断言后面,写法如下:
注意这里的body() 不要和请求体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);
运行结果:
推荐学习
关于REST Assured,这里仅仅算是初步认识。认识它的语法结构和功能,对于更多丰富的用法还需要慢慢探索研究,特别是断言的部分,是测试工程师最常用最终要的功能之一。REST Assured提供的完整断言手段,在后续文章中我们一起探讨。
最后感谢每一个认真阅读我文章的人,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走:
这些资料,对于【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴上万个测试工程师们走过最艰难的路程,希望也能帮助到你!
相关文章:

测试开发 | Java 接口自动化测试首选方案:REST Assured 实践
1 . 初识 REST Assured 在 REST Assured 的官方 GitHub 上有这样一句简短的描述: Java DSL for easy testing of REST services 简约的 REST 服务测试 Java DSL 1.1 优点: REST Assured 官方的 README 第一句话对进行了一个优点的概述,总的…...

vue3:13、Vue3.3新特性-defineModel
旧版本的语法 新版本语法...

如何理解C++中的void*
1.什么是void* 首先void*中的void代表一个任意的数据类型,"星号"代表一个指针,所以其就是一个任意数据类型的指针。 其实就是一个未指定跳跃力的指针。 那void*的跳跃力又什么时候指定?在需要使用的时候指定就可以了,…...

MVC,MVP,MVVM的理解和区别
MVC MVC ,早期的开发架构,在安卓里,用res代表V,activity代表Controller层,Model层完成数据请求,更新操作,activity完成view的绑定,以及业务逻辑的编写,更新view…...

【TypeScript】一直提示 :无法重新声明块范围变量
【TypeScript】一直提示 :无法重新声明块范围变量 问题描述:在VSCode中编写ts代码时,编写保存完之后,通过tsc 文件名.ts编译就会看到变量名下面出现了红色的波浪线,提示的内容是无法重新声明块范围变量。 解决方法&am…...

【python自动化】七月PytestAutoApi开源框架学习笔记(一)
前言 本篇内容为学习七月大佬开源框架PytestAutoApi记录的相关知识点,供大家学习探讨 项目地址:https://gitee.com/yu_xiao_qi/pytest-auto-api2 阅读本文前,请先对该框架有一个整体学习,请认真阅读作者的README.md文件。 本文…...

Python学习 -- logging模块
logging 模块是 Python 中用于记录日志的标准库,它提供了丰富的功能,可以帮助开发者进行日志记录和管理。以下是关于logging模块的详细使用方式,包括日志级别、处理流程、Logger 类、Handler 类、Filter 类、Formatter 类以及模块中常用函数等…...

【socket】getaddrinfo、getsockname、getpeername对比
这三个函数都是在网络编程中用来获取地址信息的,但是它们的使用场景和功能有所不同。getaddrinfo(): 这个函数主要用于将一个主机名(或者 IP 地址)和端口号转换成适用于 socket() 函数的一个或多个套接字地址结构。它能够处理 IPv4 和 IPv6 地…...

【MySQL】表的增删改查(进阶)
表的增删改查(进阶) 一. 数据库约束1. 约束类型2. NULL约束3. UNIQUE:唯一约束4. DEFAULT:默认值约束5. PRIMARY KEY:主键约束6. FOREIGN KEY:外键约束7. CHECK约束 二. 表的设计1. 一对一2. 一对多3. 多对…...

关于安卓13中Android/data目录下的文件夹只能查看无法进行删改的问题
前言 因为升级了安卓13,然后有个app需要恢复数据,打算和以前一样直接删除Android/data下对应目录再添加,结果不行,以下是结合网上以及自己手机情况来做的一种解决方案。 解决 准备: 待恢复app(包名com.…...

Vulnhub: Masashi: 1靶机
kali:192.168.111.111 靶机:192.168.111.236 信息收集 端口扫描 nmap -A -sC -v -sV -T5 -p- --scripthttp-enum 192.168.111.236查看80端口的robots.txt提示三个文件 snmpwalk.txt内容,tftp服务在1337端口 sshfolder.txt内容,…...

校园二手物品交易系统微信小程序设计
系统简介 本网最大的特点就功能全面,结构简单,角色功能明确。其不同角色实现以下基本功能。 服务端 后台首页:可以直接跳转到后台首页。 用户信息管理:管理所有申请通过的用户。 商品信息管理:管理校园二手物品中…...

Pixillion Pro for Mac:将您的图像转换为艺术佳作
Pixillion for Mac有着非常强大的图像转换功能和简单的使用方法,帮助你快速完成大批量图像转换的工作,支持一键转换jpeg、jpg、bmp、png、gif、raf、heic等各种格式的图像文件,同时pixillion mac激活版还提供了图像旋转、添加水印、调整图像大…...

【上海迪士尼度假区】技术解决方案
开源平台地址Giteehttps://gitee.com/issavior/disney 技术解决方案 1. 背景2. 技术架构3. 业务架构3.1 架构图3.2 说明 4. 技术能力4.1 自研中间件4.2 定制化中间件 5. 领域模型6. 数据模型7. 交易链路8. 状态机8. 接口文档 1. 背景 上海迪士尼度假区已运营近10年,…...

每日刷题-2
目录 一、选择题 二、编程题 1、倒置字符串 2、排序子序列 3、字符串中找出连续最长的数字串 4、数组中出现次数超过一半的数字 一、选择题 1、 题目解析: 二维数组初始化的一般形式是: 数据类型 数组名[常量表达式1][常量表达式2] {初始化数据}; 其…...

AOSP内置搜狗输入并设置默认输入法
前期准备 AOSP分支:aosp13_r7 系统版本:Ubuntu 22.04.1 LTS 工具:手,vscode,winscp(因为我是用的服务器编译) 下载搜狗输入法 思路: 1.集成搜狗输入法到aosp 2.删除系统输入法 3.设置搜狗输入法为默…...

ICCV 2023|通过慢学习和分类器对齐在预训练模型上进行持续学习
点击蓝字 关注我们 AI TIME欢迎每一位AI爱好者的加入! 作者介绍 张耕维 悉尼科技大学在读博士生,研究方向为持续学习 报告题目 通过慢学习和分类器对齐在预训练模型上进行持续学习 内容简介 持续学习研究的目标在于提高模型利用顺序到达的数据进行学习的…...

蓝桥杯打卡Day5
文章目录 日志排序重复者 一、日志排序IO链接 本题思路:本题就是根据就是排序的知识点,在sort内部可以使用仿函数来改变此时排序规则。 #include <bits/stdc.h>const int N10010; int n; std::string logs[N];int main() {std::ios::sync_with_stdio(false)…...

QT for andriod
QT for andriod 开发 apk软件,因为一些特殊的原因,在这里简单的记录一哈自己开发apk的流程和心得。 首先说明我采用的环境有哪些? 1、QT的版本,个人建议5.15.2的版本及以上,我是用的5.15.2。 2、andriod studio 可以…...

【广州华锐互动】AR技术在配电系统运维中的应用
随着科技的不断发展,AR(增强现实)技术逐渐走进了我们的生活。在电力行业,AR技术的应用也为巡检工作带来了许多新突破,提高了巡检效率和安全性。本文将从以下几个方面探讨AR配电系统运维系统的新突破。 首先,AR技术可以实现虚拟巡检…...

TiDB 一栈式综合交易查询解决方案获“金鼎奖”优秀金融科技解决方案奖
日前,2023“金鼎奖”评选结果揭晓, 平凯星辰(北京)科技有限公司研发的 TiDB 一栈式综合交易查询解决方案获“金鼎奖”优秀金融科技解决方案奖 , 该方案已成功运用于 多家国有大行、城商行和头部保险企业 。 此次获奖再…...

《网络是怎样连接的》(六)
本文主要取材于 《网络是怎样连接的》 第六章。 目录 6.1 服务器概览 6.2 服务器的接收操作 6.3 Web服务器程序解释请求消息并作出响应 6.4 浏览器接收响应消息并显示内容 简述:本文主要内容是解释 网络包到达服务器之后,如何给客户端响应的。 服务…...

2023年高教社杯数学建模国赛 赛题浅析
2023年国赛如期而至,为了方便大家尽快确定选题,这里将对赛题进行浅析,以分析赛题的主要难点、出题思路以及选择之后可能遇到的难点进行说明,方便大家尽快确定选题。 难度排序 B>A>C 选题人数 C>A>B (预估结果&…...

使用QT操作Excel 表格的常用方法
VBA 简介 Microsoft Office软件通常使用VBA来扩展Windows的应用程序功能,Visual Basic for Applications(VBA)是一种Visual Basic的一种宏语言。 在VBA的参考手册中就可以看到具体函数、属性的用法,Qt操作Excel主要通过 QAxObj…...

vue前后端端口不一致解决方案
在config index.js文件中 引入如下代码即可 const path require(path) const devEnv require(./dev.env) module.exports {dev: {// PathsassetsSubDirectory: static,assetsPublicPath: /,proxyTable: devEnv.OPEN_PROXY false ? {} : {/api: {target: http://localhos…...

springcloudSeata处理分布式事务之1.7.0
1.5.0之后版本发生了很大改变 1.seata安装 1.1官网地址 http://seata.io/zh-cn/ 1.2下载地址 https://github.com/seata/seata/releases 下载的是seata-server-1.7.0.zip 1.3seata相关配置的修改 seata-server-1.7.0\seata\conf下的application.yml进行修改 server:por…...

每日刷题|回溯法解决全排列问题
食用指南:本文为作者刷题中认为有必要记录的题目 前置知识:回溯法经典问题之组合 ♈️今日夜电波:爱人错过—告五人 1:11 ━━━━━━️💟──────── 4:52 …...

10-JVM调优工具详解
上一篇:09-JVM垃圾收集底层算法实现 前置启动程序 事先启动一个web应用程序,用jps查看其进程id,接着用各种jdk自带命令优化应用 1.Jmap 此命令可以用来查看内存信息,实例个数以及占用内存大小 jmap -histo 14660 #查看历史…...

东方博易oj——3119 - 约瑟夫问题2(链表)
文章目录 题目题目描述输入输出样例输入 输出标签 AC代码 题目 题目描述 约瑟夫问题:有 n n n只猴子,按顺时针方向围成一圈选大王(编号从 1 1 1到 n &#…...

C++,day0907
#include <iostream>using namespace std; struct stu { private:int num; private:double score[32];public:void setNum(){cout <<"请输入学生人数:";cin >>num;}void input(){cout<<"请输入学生的成绩:"<<endl;for(int i…...