当前位置: 主页 > JAVA语言

java接口自动化测试框架-java接口返回值是接口

发布时间:2023-02-09 16:19   浏览次数:次   作者:佚名

图片

本文是霍格沃茨测试学院优秀学生的课程学习笔记。 想一起系统进阶的同学,文末加群交流。

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);

运行结果:

图片