利器 | Java 接口自动化测试首选方案:REST Assured 实践 ,java接口自动化 _相关内容
本文是关于java接口自动化-Java 接口自动化测试
在 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.133 Accept=*/* 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);
运行结果:
关于REST Assured,这里仅仅算是初步认识。认识它的语法结构和功能,对于更多丰富的用法还需要慢慢探索研究,特别是断言的部分,是测试工程师最常用最终要的功能之一。REST Assured提供的完整断言手段,在后续文章中我们一起探讨。
步骤2:生成密钥
步骤3:调用Java接口
在Android App中接入HTML5滑块验证
发布 SOFARPC 服务
智能流量测试Dubbo服务
智能流量测试Spring Cloud服务
智能流量测试服务
基于弹性网卡操作完成事件实现业务自动化处理
SDK下载
产品对比
Spring集成
运行安全命令示例
Java SDK
Java SDK
Java SDK使用说明
Java SDK
账号集成
Java SDK
开发HSF应用(Pandora Boot)
开发HSF应用(Pandora Boot)
Instance Logview示例
机器人流程自动化RPA
事件概述
启动规则
获取视频播放凭证
删除分组
删除规则
停止规则
查询呼叫状态
查询分组详情
获取实例状态
查询规则信息
查询异常事件列表
查询转码配置
获取磁盘信息
修改分组信息
查询分组中设备列表
删除审核回调
查询审核回调URL
以上就是小编为大家整理的java接口自动化-Java 接口自动化测试
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。
发表评论
暂时没有评论,来抢沙发吧~