目录
接口测试框架Restassured介绍
市场上的主流的接口测试框架
- Postman:提供了类似RestAssured的功能,包括请求发送、断言和响应处理等。
- Apache HttpClient:一个用于发送HTTP请求的Java库,提供了更底层的控制和定制化。
- JUnit:虽然JUnit主要用于单元测试,但它可以与RestAssured等库集成,用于编写针对API接口的集成测试。
- MockMvc:是Spring框架下的一个模拟框架,用于模拟Web请求和响应
接口测试框架【Restassured】
- 一个基于Java的轻量级接口测试框架,主要用于简化基于HTTP协议的接口测试,简单易用、功能强大、可扩展性好
- 官网:http://rest-assured.io
- 优点
- 简单易用,RestAssured提供了简单易用的API,可以轻松地编写测试代码。
- 功能强大,支持多种请求方法、断言和验证响应内容、状态码、响应时间等特性
- 可扩展性好,RestAssured可以与TestNG、JUnit等测试框架完美集成
- 支持多种数据格式处理,RestAssured可以处理JSON和XML格式的数据
- 支持结构化解析和多种解析方式,支持xpath/jsonpath/gpath等解析方式
- 对Spring的支持比较全面,方便使用Spring框架的开发者
- 缺点
- 依赖性强:RestAssured依赖于Java和HTTP协议,对于非Java或非HTTP协议的接口可能不太适用
- 需要配置测试环境:在使用RestAssured进行接口自动化测试之前,需要搭建相应的测试环境,包括服务器、数据库等。
- 非0基础上手:虽然RestAssured提供了简单易用的API,但对于初学者来说,仍然需要一定的学习成本才能掌握。
SpringBoot3.X整合
xml
复制代码
<dependency>
<groupId>io.rest-assured</groupId>
<artifactId>rest-assured</artifactId>
</dependency>
<dependency>
<groupId>io.rest-assured</groupId>
<artifactId>rest-assured-all</artifactId>
</dependency>
<dependency>
<groupId>io.rest-assured</groupId>
<artifactId>spring-web-test-client</artifactId>
</dependency>
快速开始
- given:设置测试预设,包括请求头、请求参数、请求体、cookie等
- when:所要执行的操作,配置发起请求的网址(GET / POST 请求)
- then:解析结果、断言
java
复制代码
@SpringBootTest
public class AssuredTest {
@Test
public void testBase() {
RestAssured.given()
.param("id", 1)
.when()
.get("http://127.0.0.1:8082/api/v1/test/detail")
.then()
.log()
.all()
.statusCode(200);
}
}
Restassured框架常用方法
基础语法格式
- RestAssured的语法采用简洁的链式调用方式
- 以
given()开始,设置测试预设,包括请求头、请求参数、请求体、cookie等;
- 然后使用
when()指定请求的URL(GET、POST等请求)
- 最后使用
then()进行断言和解析响应结果
参数配置
- 请求头参数:使用
header()方法设置请求头信息,例如"header("Content-Type", "application/json")"。
- 请求参数
- 对于GET请求,使用"param()"方法设置URL参数,例如"param("key", "value")";
- 对于POST请求,可以使用"body()"方法设置请求体内容
- 文件上传
- 提供
multiPart() 的方法可以指定文件(file)、字节数组(byte-array)、输入流或者是上传文件
示例
- GET 请求
- log()可以向控制台输出返回的信息
- log().all() 可以返回所有响应中的数据
java
复制代码
@Test
public void testBase() {
RestAssured.given()
.queryParam("id", 1)
.when()
.get("http://127.0.0.1:8082/api/v1/test/detail")
.then()
.log().all()
.statusCode(200);
}
java
复制代码
@Test
public void testPostForm(){
RestAssured.given()
.formParam("mail", "1320801376@sina.com")
.formParam("pwd","123456")
.when()
.post("http://127.0.0.1:8082/api/v1/test/login_form")
.then()
.log().all()
.statusCode(200);
}
java
复制代码
@Test
public void testPostJsonHeader(){
Map<String,String> params = new HashMap<>();
params.put("title","山海经传奇");
RestAssured.given()
.header("token","7a9b7dcbba2443c5a80fbfa62da63e69")
//.header("Content-Type","application/json")
.contentType(ContentType.JSON)
.body(JsonUtil.obj2Json(params))
.when()
.post("http://127.0.0.1:8082/api/v1/test/buy")
.then()
.log()
.all()
.statusCode(200);
java
复制代码
@Test
public void testFile(){
RestAssured.given()
.multiPart(new File("/Users/xdclass/Desktop/测试jmx/id.csv"))
.when()
.post("http://127.0.0.1:8082/api/v1/test/upload")
.then()
.log().all()
.statusCode(200);
}
断言与解析
响应断言
- 使用
statusCode()方法指定期望的响应状态码,例如statusCode(200);
- 还可以使用
body()方法对响应内容进行断言,例如body("key", equalTo("value"))
| 类型 |
断言方法 |
含义 |
| 状态码 |
statusCode() |
响应状态码 |
| 响应头 |
header() |
响应头信息 |
| 内容 |
body() |
内容匹配 |
内置结果解析
- 自带GPath解析
- 是来自groovy 编程语言的广泛使用的 XML 和 JSON 解析器 GPath可以处理html、xml、json
- 跟JSONpath的区别就是不需要从$开始写了,GPATH直接从JSON消息的第一层数据开始
- 通过
extract().response() 将响应结果保存到 Response 类型的变量,使用Gpath提取响应中的某一个具体的数据
- 提取JSON:
res.jsonPath().get("XXX.XXX.XXX");
- 提取xml:
res.xmlPath().get("XXX.XXX.XXX");
- 提取HTML:
res.htmlPath().get("XXX.XXX.XXX");
- JSON解析
- 支持对JSON格式的响应数据进行解析,可以使用
jsonPath()方法指定JSON路径进行查询和断言。
- XML解析
- 支持对XML格式的响应数据进行解析,可以使用
xmlPath()方法指定XML路径进行查询和断言。
示例
断言测试
java
复制代码
@Test
public void testAssert(){
Map<String,String> params = new HashMap<>();
params.put("title","山海经传奇");
RestAssured.given()
.header("token","7a9b7dcbba2443c5a80fbfa62da63e69")
.header("Content-Type","application/json")
.body(JsonUtil.obj2Json(params))
.when()
.post("http://127.0.0.1:8082/api/v1/test/buy")
.then()
.log()
.all()
.statusCode(200)
.body("code", equalTo(1));
}
结果解析
java
复制代码
@Test
public void testResponse(){
Map<String,String> params = new HashMap<>();
params.put("title","山海经传奇");
Response response = RestAssured.given()
.header("token", "7a9b7dcbba2443c5a80fbfa62da63e69")
//.header("Content-Type","application/json")
.contentType(ContentType.JSON)
.body(JsonUtil.obj2Json(params))
.log().headers()//打印请求头
.log().body()//打印请求体
.when()
.post("http://127.0.0.1:8082/api/v1/test/buy")
.then()
.log()
.all()
.statusCode(200).extract().response();
Object data = response.jsonPath().get("data");
System.out.println(data);
}