一、rest-assured介绍
rest-assured是github上一个开源项目。
地址:https://github.com/rest-assured/rest-assured
作者言:
Testing and validation of REST services in Java is harder than in dynamic languages such as Ruby and Groovy. REST Assured brings the simplicity of using these languages into the Java domain.
优点:
简约的接口测试DSL
支持xml json的结构化解析
支持xpath jsonpath gpath等多种解析方式
对spring的支持比较全面
二、restassured接口测试步骤
- IDEA创建maven项目
- 添加依赖 restassured junit
- 编写用例
- 添加断言
- 调试
三、demo演练
在IDEA中新建一个maven项目,then……
- pom.xml文件中添加依赖:
<dependencies>
<dependency>
<groupId>io.rest-assured</groupId>
<artifactId>rest-assured</artifactId>
<version>3.3.0</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
</dependencies>
- src/test/java下new一个RestDemo.class
开源wiki中说需要Static imports一下几个包。即静态导入:
import static io.restassured.RestAssured.given;
import static io.restassured.matcher.RestAssuredMatchers.*;
import static org.hamcrest.Matchers.*;
- 最简单的代码:
public class RestDemo {
@Test
public void testGetHtml(){
given().get("http://www.baidu.com").then().statusCode(200);
}
}
表示发送一个get请求,url是http://www.baidu.com,then()
是断言,statusCode(200)
是响应状态码等于200。
- 打印log
public class RestDemo {
@Test
public void testGetHtml(){
given().log().all().get("http://www.baidu.com").then().log().all().statusCode(200);
}
log().all()
:打印所有log,可以查看有请求和响应的信息
可以使用这样的格式写:
//百度搜索Mp3
@Test
public void testMp3(){
given()
.get("http://www.baidu.com/s?wd=mp3")
.then().log().all().statusCode(200);
}
- restassured最期望的格式:
@Test
public void testMp3(){
given()
.queryParam("wd","mp3")
.when()
.get("http://www.baidu.com/s")
.then()
.log().all()
.statusCode(200);
}
}
given()
:一次网络请求所需要的条件都写在这里,头信息、query参数
when()
:触发条件
then()
:断言
-
demo演练:
(1)抓取真实接口,以xueqiu.com搜索接口为例
(2)new一个Xueqiu.class文件
public class Xueqiu {
@Test
public void testSearch() {
given()
.queryParam("code", "sogo")
.when()
.get("https://xueqiu.com/stock/search.json")
.then()
.log().all()
.statusCode(200);
}
}
(3)run一下,提示错误:
(4)打印log,查找错误:
通过与f12抓的包对比,发现Cookie没有值:
复制抓到的Cookie值
现在请求可以正常发送,也有结果返回了,根据结果修改我们的断言。
(5)调整断言:断言stocks下面的name值为搜狗:
.body("stocks.name",hasItems("搜狗"));
stocks.name
:根节点.子节点
.body()
可以无限的写下去image.png
当实际结果不符合断言会怎样呢?
假如我们把断言改成“sogo”,让其实际结果不符合预期
.body("stocks.code",hasItems("sogo"))
7.demo演练代码
import org.junit.Test;
import static io.restassured.RestAssured.given;
import static org.hamcrest.Matchers.hasItems;
public class Xueqiu {
@Test
public void testSearch() {
//given开头表示输入数据
given().log().all()
//query请求参数
.queryParam("code", "sogo")
//头信息
.header("Cookie","_ga=GA1.2.506579530.1552574503; device_id=0158c91c7ecd8e4d248a54002af6d8ae; aliyungf_tc=AQAAAIatGzFrQgoAJGDMeOsikkxtPFqv; xq_a_token=682c39a460645dafb1ff41f67e0efccba8b0f118; xq_a_token.sig=Bg9acTC-woVSsS6DZvdAtd40CQU; xq_r_token=798a7cab8cd606f61a09fbac15374f1172b00607; xq_r_token.sig=sHSWFNmu_GqEUOK9A-6umfNgFcU; _gid=GA1.2.841306833.1553178554; Hm_lvt_1db88642e346389874251b5a1eded6e3=1552574504,1552736056,1553178554; u=881553178554746; _gat=1; Hm_lpvt_1db88642e346389874251b5a1eded6e3=1553180196")
//when表示触发条件
.when()
.get("https://xueqiu.com/stock/search.json")
//then对结果断言
.then()
//打印log
.log().all()
//断言状态码
.statusCode(200)
//字段断言
.body("stocks.name",hasItems("搜狗"))
.body("stocks.code",hasItems("sogo"));
}
}
网友评论