使用rest-assured进行接口测试

本帖已被设为精华帖!,

前言

第一次在社区发主题帖,还是挺~紧张的(雾)。
说一下发帖的原因,由于偶然机会,得知了rest-assured这个项目,据说很棒的样子,我就屁颠屁颠到Github上,先把项目fork过来再说,不过研究源码可能是有生之年了(〃ω〃)。
正好我们组在使用Java脚本进行接口测试,会需要写一些公共方法来验证接口返回的json节点神马的,当然保证状态码200肯定是前提。之前使用的是net.sf.json,随便贴几行代码,Object、Array、String、JSONObject神马的互相转换取值,讲道理挺容易被绕晕的。。。
使用rest-assured进行接口测试

而且,给同事讲解的时候也比较尴尬(抛出一个异常的眼神你们自己体会),有时候我们为了提升效率,还是不喜欢这种绕的做法。看rest-assured的用户手册时,首先看的就是节点取值验证部分,然后我o゜▽゜)o,总之非常高兴就是了。

正文

接下来我就依据文档写了一些demo,在这里分享下自己的经验,没啥厉害的,看看热闹就行~
首先,我使用idea新建了一个maven项目,添加了以下依赖:

<dependency>
<groupId>io.rest-assured</groupId>
<artifactId>rest-assured</artifactId>
<version>3.0.1</version>
<scope>test</scope>
</dependency>

<dependency>
<groupId>io.rest-assured</groupId>
<artifactId>json-schema-validator</artifactId>
<version>3.0.1</version>
<scope>test</scope>
</dependency>

<dependency>
<groupId>io.rest-assured</groupId>
<artifactId>spring-mock-mvc</artifactId>
<version>3.0.1</version>
<scope>test</scope>
</dependency>

<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>RELEASE</version>
</dependency>

<dependency>
<groupId>org.codehaus.groovy</groupId>
<artifactId>groovy-all</artifactId>
<version>1.8.1</version>
<scope>provided</scope>
</dependency>

然后,写一个测试类,官方推荐我们在使用的时候,静态导入以下:

import static io.restassured.RestAssured.*;
import static io.restassured.matcher.RestAssuredMatchers.*;
import static io.restassured.path.json.JsonPath.from;
import static org.hamcrest.Matchers.*;
import static io.restassured.module.jsv.JsonSchemaValidator.*;

接下来就是我在接口测试中验证的常见逻辑了,实战time,Go!

1.HTTP状态码

@Test
public void test1() {
Response response = get("url");//发起get请求,并获取响应
if (response.getStatusCode() == 200) {//如果响应码等于200
///
}
}

先使用get方法发起请求(支持HTTP和HTTPS,不需要我们手动调用不同的方法类啦),获得响应后就需要我们做进一步的处理。

2.节点值验证

比如对这样一串json,

{
"result": {
"cardtablist": [
{
"id": 1,
"name": "服务",
"taburl": "",
"type": "0"
},
{
"id": 2,
"name": "金融",
"taburl": "https://demo/",
"type": "1"
}
]
},
"returncode": 0,
"message": "ok"
}

我们可以简单写一下:

response.then().body("returncode", equalTo(0));//判断returncode是否等于
response.then().body("result.cardtablist", hasSize(2));//判断cardtablist数组的长度是否等于2
response.then().body("result.cardtablist[0].id", equalTo(1));//判断cardtablist数组第一个元素下,id字段值是否等于1
response.then().body("result.cardtablist[0].id", lessThan(2));//判断cardtablist数组第一个元素下,id字段值是否小于2
response.then().body("result.cardtablist[0].id", greaterThan(0));//判断cardtablist数组第一个元素下,id字段值是否大于0
response.then().body("result.cardtablist[0].name", not(""));//判断cardtablist第一个数组元素中name字段值不为“”
response.then().body("result.cardtablist[0].name.length()", greaterThan(10));//判断cardtablist第一个数组元素中name字段值长度大于10
List<String> dspnameStr = from(jsonStr).getList("result.adlist.findAll { it.ishavead == 1 }.dspname");//得到所有的ishavead=1的adlist数组元素,并获取其中dspname的值,放在一个集合里

3.格式化打印json

我觉得这个功能挺赞啊,省得打开浏览器去http://json.cn/做格式化。

response.getBody().prettyPrint();//格式化打印JSON数据

当然,控制台打印的json字符串不带颜色,这就不要挑剔了。

4.参数化

given().param("p1", "0").param("p2", "1").get("http://server/demo");

这里把参数拿出来单独赋值,最终会拼接成形如http://server/demo?p1=0&p2=1的链接并进行访问。

5.响应时间

when().get("https://server/demo?p1=0&p2=1").then().time(lessThan(100L),TimeUnit.MILLISECONDS);//判断响应时间是否少于预期值。

6.JSON Schema Validation

这个功能我也挺喜欢的,可以通过自己编写json指定要验证的结构字段(比如取值范围限定、字符串整型数组类型、必要字段是否存在等),具体内容有兴趣的同学可以自学一下。此处只展示API的调用:

get("https://server/demo?p1=0&p2=1").then().assertThat().body(matchesJsonSchemaInClasspath("test.json"));

这里我把写好的test.json文件放在idea自动生成的src/main/resources路径下,里面简单写了下:

{
"$schema": "http://json-schema.org/draft-04/schema#",
"title": "Product set",
"type": "object",
"properties": {
"result": {
"type": "object"
},
"returncode": {
"type": "integer"
},
"message": {
"type": "integer"
}
},
"required": [
"result",
"returncode",
"message"
]
}

这里验证点有:保证返回result、returncode、message字段,并对每个字段的value进行类型限定。
暂时写到这吧(其实是我暂时就只看了一小部分),某校长还等着吐槽我QAQ。

心好累(:3」∠)

另外,我的打赏二维码只是开个玩笑,别当真。。。

* 注:本文来自网络投稿,不代表本站立场,如若侵犯版权,请及时知会删除