java接口自动化测试框架-java接口返回值是接口
图片
本文是霍格沃茨测试学院优秀学生的课程学习笔记。 想一起系统进阶的同学,文末加群交流。
1. 了解 REST Assured
图片
REST Assured的官方GitHub上有一个简短的描述:Java DSL for easy testing of REST services Simple REST service testing Java DSL
1.1 优点:
REST Assured官方README的第一句话就概括了它的优点,大意是简单易用。 那么 REST Assured 有哪些优势,又该如何使用呢?
图片
REST Assured是Java接口自动化测试的首选。 具体原因如下:
开源
简约接口测试 DSL
支持xml json的结构化解析
支持xpath jsonpath gpath等多种解析方式
更全面的spring支持
功能很齐全,有些还没有用过。 我知道方向,需要的时候可以随时搜索学习。
如何使用
图片
添加maven依赖
io.rest-assured 放心4.0.0测试
2.1 基本三部曲
我们的接口测试一般分为三个步骤:传递参数、发送请求、响应结果断言。 REST Assured为我们提供了一个清晰的三步流程,以given、when、then的结构来实现。 基本的写法如下:
// 使用参数
给定()。
参数(“key1”,“value1”)。
参数(“key2”,“value2”)。
什么时候()。
发布(“/某处”)。
然后()。
正文(包含字符串(“确定”))
//使用 X 路径(仅限 XML)
给定()。
参数(“名字”,“约翰”,“姓氏”,“母鹿”)。
什么时候()。
发布(“/问候我”)。
然后()。
body(hasXPath("/greeting/firstName[text()='John']"))
2.2 逐步拆解
前提:有post请求的登录界面。
,
请求正文如下
{
“密码”:“elcrD28ZSLLtR0VLs/jERA\u003d\u003d\n”,
"grant_type": "密码",
“范围”:“服务器”,
“用户类型”:1,
“用户名”:“xxx”
}
请求头如下:
标头:Authorization=Basic c3lzdGVtxxxRlbQ==
主机=47.103.xxx.133
接受=/
内容类型=应用程序/json; 字符集=ISO-8859-1
一步步拆解
吉文
我们经常需要发送带参数的请求java接口自动化测试框架java接口自动化测试框架,可以使用given()来实现。 我们在使用given()的时候,发现参数传递方式有很多,如下:
图片
没错,传递参数的方法有param、pathParam、queryParam和formParam。 下面我们研究一下这几种传参方式的区别
参数
通常我们使用 given().param 方法来传递参数。 REST Assured 会根据 HTTP 方法自动尝试确定哪种参数类型(即查询或表单参数)。 如果是 GET,查询参数将被自动使用。 如果使用 POST,则使用表单参数;
查询参数和表单参数
有时在PUT或POST请求中,需要区分查询参数和表单参数时,需要使用queryParam和formParam方法,具体写法如下:
给定()。
formParam("formParamName", "value1").
查询参数(“queryParamName”,“value2”)。
什么时候()。
发布(“/某事”)
路径参数
使用given时,指定请求路径的参数。 这个方法很少用到,或者说我自己几乎没用过(可能是我练习不够,坑太少了~); 具体写法如下:
给定()。
pathParam("OAuth", "oauth").
pathParam(“accessToken”,“令牌”)。
什么时候()。
post("/auth/{OAuth}/{accessToken}").
然后()。
……
标题/标题
经常需要在请求头中带入参数。 这时候可以使用header或者headers方法,写法如下:
给定()
.header("Authorization", "Basic c3lzdGVtOxxxbQ==")
.header("主机", "47.xxx.xxx.133")
或者使用 headers 将多个参数写在一起:
给定()
.headers("Authorization", "Basic c3lzdGVtxxx3RlbQ==", "Host", "47.xxx.xxx.133")
曲奇饼
有时需要在请求中带上cookie,restassured提供了cookie方法来实现:
给定()
.cookie("c_a", "aaaaaa")
.cookie(“c_b”,“bbbbbb”)。 ……
内容类型
经常设置contentType,最常见的是application/json,写法如下:
给定()。 内容类型(“应用程序/json”)。 ……
//或者
给定()。 内容类型(ContentType.JSON)。 ……
身体
在POST、PUT或DELETE请求中,我们往往需要带上请求体,写法如下:
given().body(“{\n” +
"\t"密码": "elcrD28xxxR0VLs/jERA\u003d\u003d\n",\n" +
"\t"grant_type": "密码",\n" +
"\t"范围": "服务器",\n" +
"\t"用户类型": 1,\n" +
"\t"用户名": "xxx"\n" +
"}")
也可以使用request更明确的指出请求体:
given().request().body("{\n" +
"\t"密码": "elcrD28xxxR0VLs/jERA\u003d\u003d\n",\n" +
"\t"grant_type": "密码",\n" +
"\t"范围": "服务器",\n" +
"\t"用户类型": 1,\n" +
"\t"用户名": "xxx"\n" +
"}")
无参数
如果我们没有要传递的参数,也可以省略 given() :
get("/lotto").then().assertThat().body("lotto.lottoId", equalTo(5));
代理人
有时我们需要调试接口。 抓包是最常用的方法。 rest-assured提供了proxy方法,可以设置代理。 写法如下:
given().proxy("127.0.0.1",8888). ……
实际运行结果:
图片] [图片
一步步拆解二
什么时候
when主要用来触发请求,when之后再请求url:
给出().when().post(“”)。 ……
我们在前面given中设置了很多请求参数,也可以在when中设置,但是需要注意的是在request之前设置; 这样也比较容易理解,如果在request之后,所有的参数都设置好之后怎么发送request呢?
给定()
。什么时候()
.contentType(ContentType.JSON)
.headers("Authorization", "Basic c3lzxxx3RlbQ==", "Host", "47.xxx.xxx.133")
.request().body("{\n" +
"\t"密码": "elcrD28ZSLLtR0VLs/jERA\u003d\u003d\n",\n" +
"\t"grant_type": "密码",\n" +
"\t"范围": "服务器",\n" +
"\t"用户类型": 1,\n" +
"\t"用户名": "秦臻"\n" +
"}")
。邮政(””)
. . .
分步拆解三
然后
然后可以跟一个断言,或者可以得到响应值
断言 - then().body()
then().body() 可以断言响应结果,并将断言写在正文中:
... 邮政(””)
.then().statusCode(200).body("code",equalTo(1));
其中statusCode(200)是对状态码的断言,判断状态码是否为200; body("code",equalTo(1)) 是对返回body中code的断言,要求返回code值为1。
注意:这里的 equalTo 使用了 hamcrest 断言。 不知道的朋友可以参考另一篇文章:Junit native assertion和hamcrest assertion的区别和使用
实际演示:
下面结合上面给出的,when,再来看实际的运行效果。 这是运行前的另一个功能。 我们可以在 when 和 then 后面加上 .log().all() ,这样在运行过程中可以打印出请求和响应信息:
图片] [图片
获取响应 - then().extract().body().path("code")
我们可以在then之后使用.extract().body()来获取我们想要的body的返回值,也可以直接在他们后面跟assertion,写法如下:
注意这里的body()不要与request body()和assertion body()混淆
…。然后()
.log().all().statusCode(200).body("code",equalTo(1))
.extract().body().path("代码");
实际演示:
演示前先来看一个新功能。 上面我们这样写请求体:
正文(“{\n” +
"\t"密码": "elcrD28ZxxxVLs/jERA\u003d\u003d\n",\n" +
"\t"grant_type": "密码",\n" +
"\t"范围": "服务器",\n" +
"\t"用户类型": 1,\n" +
"\t"用户名": "秦臻"\n" +
"}")
看起来有点丑,我们修改一下; rest-assured为我们提供了使用HashMap创建json文件的方法。 首先将需要传递的字段放入hashmap中,然后使用contentType表示JSON。 具体写法如下:
HashMap map = new HashMap();
map.put("密码","elcrD28ZSLLtR0VLs/jERA\u003d\u003d\n");
map.put("grant_type", "password");
地图。 放(“范围”,“服务器”);
地图。 put("用户类型",1);
地图。 put("用户名","xxx");
给定()
.headers("Authorization", "Basic c3lzdGVtxxxlbQ==", "Host", "47.xxx.xxx.133")
.contentType(JSON)
.body(地图)。 ……
现在发出一个完整的请求,获取返回码并打印出来:
HashMap map = new HashMap();
map.put("密码","elcrD28ZSLLtR0VLs/jERA\u003d\u003d\n");
map.put("grant_type", "password");
地图。 放(“范围”,“服务器”);
地图。 put("用户类型",1);
地图。 put("用户名","xxx");
整数代码 =
给定()
.headers("Authorization", "Basic c3lzdGVtxxxlbQ==", "Host", "47.xxx.xxx.133")
.contentType(JSON)
.body(地图)。
什么时候()
.log().all().post("").
然后()
.log().all().statusCode(200).body("code",equalTo(1))
.extract().body().path("代码");
System.out.println("返回码值为:"+code);
运行结果:
图片