第一次在社区发主题帖,还是挺~紧张的(雾)。
说一下发帖的原因,由于偶然机会,得知了 rest-assured 这个项目,据说很棒的样子,我就屁颠屁颠到 Github 上,先把项目 fork 过来再说,不过研究源码可能是有生之年了 (〃ω〃)。
正好我们组在使用 Java 脚本进行接口测试,会需要写一些公共方法来验证接口返回的 json 节点神马的,当然保证状态码 200 肯定是前提。之前使用的是 net.sf.json,随便贴几行代码,Object、Array、String、JSONObject 神马的互相转换取值,讲道理挺容易被绕晕的。。。
而且,给同事讲解的时候也比较尴尬(抛出一个异常的眼神你们自己体会),有时候我们为了提升效率,还是不喜欢这种绕的做法。看 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!
@Test
public void test1() {
Response response = get("url");//发起get请求,并获取响应
if (response.getStatusCode() == 200) {//如果响应码等于200
///
}
}
先使用 get 方法发起请求(支持 HTTP 和 HTTPS,不需要我们手动调用不同的方法类啦),获得响应后就需要我们做进一步的处理。
比如对这样一串 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的值,放在一个集合里
我觉得这个功能挺赞啊,省得打开浏览器去http://json.cn/做格式化。
response.getBody().prettyPrint();//格式化打印JSON数据
当然,控制台打印的 json 字符串不带颜色,这就不要挑剔了。
given().param("p1", "0").param("p2", "1").get("http://server/demo");
这里把参数拿出来单独赋值,最终会拼接成形如http://server/demo?p1=0&p2=1的链接并进行访问。
when().get("https://server/demo?p1=0&p2=1").then().time(lessThan(100L),TimeUnit.MILLISECONDS);//判断响应时间是否少于预期值。
这个功能我也挺喜欢的,可以通过自己编写 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」∠)
另外,我的打赏二维码只是开个玩笑,别当真。。。