使用REST-Assured对API接口进行自动化测试
说明:本文只是一个getStart示例,关键在于让自己(新手)能快速地对REST-Assured自动化测试有个大概的认识,下面开始。
参考资料:
使用 Rest-Assured 测试 REST API
使用 REST-Assured 测试 REST API 的进阶技巧和最佳实践
1.准备
- eclipse、jdk、maven
- 新建好一个maven项目
- 下载并安装RestClient客户端
2.目标
- 对豆瓣API进行自动化测试
3.开始编码
1)修改pom.xml
<dependency>
<groupId>com.jayway.restassured</groupId>
<artifactId>rest-assured</artifactId>
<version>2.8.0</version>
</dependency>
<dependency>
<groupId>org.hamcrest</groupId>
<artifactId>hamcrest-core</artifactId>
<version>1.3</version>
</dependency>
2)查看豆瓣的开发者文档
找到搜索图书的API,显示为GET https://api.douban.com/v2/book/:id
那么只需要找到某个图书的id替换URL中的:id
即可。
为了测试需要,我们打开上面要求下载好的RestClient客户端,输入http://api.douban.com/v2/book/1220562
,选择访问方法为GET,前往访问,会获得如下的Json返回信息:
{
"rating": {
"max": 10,
"numRaters": 348,
"average": "7.0",
"min": 0
},
"subtitle": "",
"author": [
"[日] 片山恭一"
],
"pubdate": "2005-1",
"tags": [
{
"count": 136,
"name": "片山恭一",
"title": "片山恭一"
},
{
"count": 63,
"name": "日本",
"title": "日本"
},
{
"count": 61,
"name": "日本文学",
"title": "日本文学"
},
{
"count": 38,
"name": "小说",
"title": "小说"
},
{
"count": 32,
"name": "满月之夜白鲸现",
"title": "满月之夜白鲸现"
},
{
"count": 15,
"name": "爱情",
"title": "爱情"
},
{
"count": 8,
"name": "純愛",
"title": "純愛"
},
{
"count": 8,
"name": "外国文学",
"title": "外国文学"
}
],
"origin_title": "",
"image": "http://img3.douban.com/mpic/s1747553.jpg",
"binding": "平装",
"translator": [
"豫人"
],
"catalog": "
",
"pages": "180",
"images": {
"small": "http://img3.douban.com/spic/s1747553.jpg",
"large": "http://img3.douban.com/lpic/s1747553.jpg",
"medium": "http://img3.douban.com/mpic/s1747553.jpg"
},
"alt": "http://book.douban.com/subject/1220562/",
"id": "1220562",
"publisher": "青岛出版社",
"isbn10": "7543632608",
"isbn13": "9787543632608",
"title": "满月之夜白鲸现",
"url": "http://api.douban.com/v2/book/1220562",
"alt_title": "",
"author_intro": "",
"summary": "那一年,是听莫扎特、钓鲈鱼和家庭破裂的一年。说到家庭破裂,母亲怪自己当初没有找到好男人,父亲则认为当时是被狐狸精迷住了眼,失常的是母亲,但出问题的是父亲……。",
"price": "15.00元"
}
注意,RestClient返回的Json不太容易看得清楚,可以选择Json在线转换工具进行格式化。以上返回信息就是格式化后的。
3)创建Java类取名为ExampleForDoubanAPI.java
import com.jayway.restassured.RestAssured;
import com.jayway.restassured.response.ValidatableResponse;
import static com.jayway.restassured.module.jsv.JsonSchemaValidator.matchesJsonSchemaInClasspath;
import static com.jayway.restassured.RestAssured.*;
import static org.hamcrest.Matchers.*;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
public class ExampleForDoubanAPI {
@Before
public void before() {
RestAssured.baseURI = "http://api.douban.com/v2/book";
RestAssured.port = 80;
}
@Test
//URL为http://api.douban.com/v2/book/1220562
//判断Json中的返回信息title
public void testGetBook() {
get("/1220562").then().body("title", equalTo("满月之夜白鲸现"));
}
@Test
//URL为http://api.douban.com/v2/book/search?q=java8
//判断Json中的返回信息关键字为“java8”的书本的数目
public void testSearchBook() {
given().param("q", "java8").when().get("/search").then().body("count", equalTo(2));
}
@Test
//解析JSON
public void testParseJson() {
ValidatableResponse resp = get("/1220562").then();
//判断返回Json数据的title
resp.body("title", equalTo("满月之夜白鲸现"));
//判断二级属性rating.max的值
resp.body("rating.max", equalTo(10));
//调用数组的方法判断数组的大小
resp.body("tags.size()", is(8));
//判断数组第一个对象的值
resp.body("tags[0].name", equalTo("片山恭一"));
//判断数组中是否有该元素
resp.body("author", hasItems("[日] 片山恭一"));
}
@After
public void after() {
}
}
如上三个测试用例都可以运行成功。
4)使用Json Schema验证返回数据
- 一个个参数的去验证,测试用例会非常多,代码也会很冗长。如果我们使用 Json schema 去验证的话,就会大大减少用例和代码数量。
- Json schema 描述了 Json 的数据格式,是一种元数据,它非常简单易读。只要返回的Json符合Json Schema的要求,就可以通过测试。
- 对于简单的 Json 返回体,我们可以根据需求来自己创建 Json Schema,但是对于复杂的返回体,这个过程也挺累人的。为了方便起见,我可以用Json Schema 生成工具。
- 对于如上
http://api.douban.com/v2/book/1220562
返回的Json可以生成相应的Json Schema。此处略去。将它拷贝出来,放到新文件douban.json中去。 - 将douban.json放到Maven工程的
src/main/resources
源文件夹下面即可。 - 增加pom.xml中需要的jar包并在
ExampleForDoubanAPI.java
中增加测试用例。
<dependency>
<groupId>com.jayway.restassured</groupId>
<artifactId>json-schema-validator</artifactId>
<version>2.8.0</version>
</dependency>
//使用Json Schema验证返回数据
@Test
public void testJsonScheme() {
expect().statusCode(200).given().auth().preemptive().basic("", "")
.headers("Accept", "application/JSON").when().get("http://api.douban.com/v2/book/1220562")
.then().assertThat().body(matchesJsonSchemaInClasspath("douban.json"));
}
验证可以测试成功。
4.总结
API自动化测试总体来说要比UI自动化测试简单一些,本例子中只是用GET方法进行简单地测试介绍,还有更多的课题,比如PUT,POST,DELETE等方法的测试,还有需要在HTTP协议的header和body中增加参数,以及session,cookie等。