接口测试 Rest-Assured 使用指南
作者:互联网
REST Assured 是一个轻量化接口测试框架,它支持发起POST,GET,PUT,DELETE,OPTIONS,PATCH和HEAD请求,并且可以用来验证和校对这些请求的响应信息。
1.配置Java环境,新建maven工程,导入jar包
<!-- rest assured-->
<dependency>
<groupId>io.rest-assured</groupId>
<artifactId>rest-assured</artifactId>
<version>4.3.1</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>io.rest-assured</groupId>
<artifactId>json-path</artifactId>
<version>4.3.1</version>
<scope>test</scope>
</dependency>
2.导入RestAssured(静态导入方法,以提高使用rest-assured的效率)
import io.restassured.RestAssured.*; import io.restassured.matcher.RestAssuredMatchers.*; import org.hamcrest.Matchers.*;
3.开始编写脚本,下边是一个有参数的post请求
@Test
void restGet(){
given()
.get("https://www.baidu.com/")
.then()
.statusCode(200)
.log().all();
}
实列一,验证以下接口返回的数据是否包含某个值
返回数据:
{
"description":"返回json接口",
"request":{
"uri":"/litty",
"method":"get"
},
"response":{
"json":{
"lotto":{
"lottoId":5,
"winning-numbers":[2,45,34,23,7,5,3],
"winners":[{
"winnerId":23,
"numbers":[2,45,34,23,3,5]
},{
"winnerId":54,
"numbers":[52,3,12,11,18,22]
}]
}
}
}
}
使用mococo模拟,进入到路径执行以下命令、
执行成功:
验证返回参数 int类型
equalTo()方法和 hasItems()方法是属于 Hamcrest matchers 的方法,所有我们需要静态导入 org.hamcrest.Matchers
@Test
void assertJson(){
given()
.get("http://127.0.0.1:8888/litty")
.then()
// import static org.hamcrest.Matchers.*;
.body("litty.littyId",equalTo(5));
}
@Test
void assertJsonFind(){
given()
.when()
.log().all().get("http://127.0.0.1:8888/litty")
.then()
.log().all()
// 我们可以在findAll方法中写筛选条件,例如我们想取winnerId的值在大于或等于30小于60之间的结果进行断言,具体写法如下:
.body("litty.winners.find{ winners -> winners.winnerId >= 30 && winners.winnerId < 60}.winnerId",equalTo(54));
}
@Test
void assertJsonA(){ // 验证数据是否包含 hasItem
given()
.get("http://127.0.0.1:8888/litty")
.then()
// import static org.hamcrest.Matchers.*;
.body("litty.littyId",hasItems(5,2));
}
验证返回参数 double类型
@Test
void assertJsonDouble(){
given()
.get("http://127.0.0.1:8888/price")
.then()
// import static org.hamcrest.Matchers.*;
.body("price",is(12.12f));
}
使用BigDecimal验证返回参数 double类型
使用rest-assured的JsonConfig来配置返回的所有的json数值都为BigDecimal类型:
(BigDecimal,用来对超过16位有效位的数进行精确的运算)、
[ {
"description":"以BigDecimal返回float和double类型",
"request":{
"uri":"/price",
"method":"get"
},
"response":{
"json":{
"price":12.12
}
}
}]
//Java在java.math包中提供的API类BigDecimal,用来对超过16位有效位的数进行精确的运算)
@Test
void assertJsonBigDecimal(){
given() .config(RestAssured.config().jsonConfig(jsonConfig().numberReturnType(io.restassured.path.json.config.JsonPathConfig.NumberReturnType.BIG_DECIMAL)))
.when()
.get("http://127.0.0.1:8889/price")
.then()
// import static org.hamcrest.Matchers.*;
.body("price", is(12.12f));
}
实列2.匿名JSON根节点验证
一个json文本并不一定有一个命名好的根节点属性,验证这种类型的json,这里有一个例子:
[1, 2, 3]
使用 $ 或者是 空字符串 来验证
实列3 JSON Schema validation
(Json Schema定义了一套词汇和规则,这套词汇和规则用来定义Json元数据,且元数据也是通过Json数据形式表达的。Json元数据定义了Json数据需要满足的规范,规范包括成员、结构、类型、约束等。)
自从 2.1.0 版本rest-assured开始支持Json Schema validation. 举个例子,在classpath中放置以下的schema文件(译者注:idea的话可以放在resources目录下),products-schema.json:
//schema验证(/products)这个请求是否符合规范:
@Test
void restSchemaDemo(){
given()
.get("http://localhost:8889/litty")
.then().assertThat()
.body(matchesJsonSchemaInClasspath("products-schema.json"));
}
JSON Schema Validation 设置项
@Test
void testSchemaSet(){
// 使用Francis Galiegue的json-schema-validator (fge) 库来进行验证。 如果您想配置使用基础fge库
JsonSchemaFactory jsonSchemaFactory = JsonSchemaFactory.newBuilder()
.setValidationConfiguration(ValidationConfiguration.newBuilder().setDefaultVersion(DRAFTV4).freeze()).freeze();
// When
get("http://localhost:8889/litty")
.then().assertThat()
.body(matchesJsonSchemaInClasspath("products-schema.json").using(jsonSchemaFactory));
}
实例4 xml解析
//todo xml解析
@Test
void testXml(){
with().formParams("firstName", "jack", "lastName", "lovey")
.when()
.post("http://localhost:8889/getxml")
.then()
.body("greeting.firstName", equalTo("jack"), "greeting.lastName", equalTo("lovey"));
//在请求中返还了一个基于firstname和lastname请求参数的greeting节点。您可以通过rest-assured轻易地展现和解析这个例子
}
//TODO xml XPATH校验
@Test
void testXmlXpath(){
proxy(8888); // charles 代理端口
with().formParams("firstName", "jack", "lastName", "lovey")
.when()
.post("http://localhost:8889/getxml")
.then()
// 第一种写法 .body(hasXPath("/greeting/firstName[text()='jack']"));
//第二种写法
.body(hasXPath("/greeting/firstName",containsString("ja")));
}}
Schema和DTD
XML响应体也可以验证为一个XML Schema (XSD)或DTD.
校验XSD是指:接口中返回xml响应体,针对xml生成xml schema,就是xsd后缀的文件,校验xsd文件和返回的xml响应体是否一致。
校验DTD是指:接口中返回的xml响应体中定义了DTD的文档规范,DTD文档是以dtd后缀的文件,校验dtd文件和返回的xml响应体的文档规范是否一致。
DTD文档是指在xml头中定义的DOCTYPE规范
moco文件:
xsd是xml schema definition,xml文档的结构定义。
moco的接口返回xml文档,对xml文档生成对应的xsd文档
//xsd 文档校验
@Test
void testXsd(){
File file = new File("H:\\ideawork\\seleniumCoding\\mockProject\\src\\main\\resources\\XSD\\assertxml.xml");
given()
.proxy(8888)
.when()
//assertxmlJSON
.get("http://localhost:8889/getresponsewithfile")
.then()
.assertThat() // 断言
.body(matchesXsd(file));////接口返回内容是xml,需要把xml转换成xml schema,然后生成一个文件,把文件传过来作为参数
}
标签:xml,body,Assured,get,void,Rest,json,Test,使用指南 来源: https://www.cnblogs.com/orangezhangzz/p/14148423.html