目录
- 响应体介绍
- JSON 响应体断言
课程目标
- 掌握接口响应体的概念。
- 掌握如何对 JSON 类型的响应体完成断言
思考
在断言的过程中,如果只对响应状态码断言可以完成对用例的测试吗?
响应体介绍
- 服务器端响应客户端请求后返回的数据体。
- 接口响应体的格式通常为 JSON、XML、HTML 等。
为什么要对响应体断言
- 验证响应体返回字段信息是否符合预期的业务需求。
- 验证响应体字段的数据类型、数据格式。
- 提高测试效率。
JSON 接口响应体示例
// JSON 接口响应体示例
{
“status”: “success”,
“data”: {
“name”: “John Doe”,
“age”: 30,
“email”: “john.doe@example.com”,
“address”: {
“street”: “123 Main St”,
“city”: “Anytown”,
“state”: “CA”,
“zip”: “12345”
}
}
}
JSON 响应体断言
- 直接断言:
then().body()
。 - 提取后断言:
then().extract().path();
直接断言
then().body()
:
- 结合 hamcrest 使用。
-
body("想要提取的信息", 预期结果操作)
。 - 使用 gpath 语法提取(了解)
public class TestAssertionBody {
// 断言是否相等
@Test
void jsonBody(){
given()
.when()
.get("https://httpbin.hogwarts.ceshiren.com/get") // 发起GET请求
.then()
.log().all() // 打印响应结果
// 结合hamcrest响应体断言
.body("origin", equalTo("113.89.246.184")); //
}
// 断言是否相等
@Test
void doubleBody(){
given()
.when()
.get("https://httpbin.hogwarts.ceshiren.com/get") // 发起GET请求
.then()
.log().all() // 打印响应结果
// 结合hamcrest响应体断言
.body("headers.Host", equalTo("httpbin.hogwarts.ceshiren.com")); //
}
// 断言元素是否包含。
@Test
void extractArray(){
String jsonData = "{\"username\":\"hogwarts\",\"password\":\"test12345\",\"code\":[1,2,3]}";
given()
.body(jsonData)
.when()
.post("https://httpbin.hogwarts.ceshiren.com/post")
.then()
.log().all()
.body("json.code", hasItem(1));
}
}
常用 hamcrest 示例
应用场景 | 对应方法 |
---|---|
是否相等 | equalTo() |
是否包含 | hasItems() |
注意: 这些静态方法都来自于 org.hamcrest.Matchers
|
|
![image | 800x210](upload://gLSEPhXNOxPK2Vl0FgQa4iM1Hi4.jpeg) |
提取后断言
-
then().extract().path()
:-
extract()
: 提取方法,返回值为Response
。 -
path()
: 从返回值中提取想要的信息(使用 gpath 语法)。
-
public class TestBody {
// 响应嵌套提取。
@Test
void extractJson(){
String jsonData = "{\"username\":\"hogwarts\",\"password\":\"test12345\",\"code\":[1,2,3]}";
ArrayList data = given()
.body(jsonData)
.when()
.post("https://httpbin.hogwarts.ceshiren.com/post")
.then()
.log().all()
.extract().path("json.code");
System.out.println(data);
}
// 提取数组中的元素。
@Test
void extractArray(){
String jsonData = "{\"username\":\"hogwarts\",\"password\":\"test12345\",\"code\":[1,2,3]}";
Integer data = given()
.body(jsonData)
.when()
.post("https://httpbin.hogwarts.ceshiren.com/post")
.then()
.log().all()
.extract().path("json.code[0]");
System.out.println(data);
}
}
复杂断言
- 若碰到复杂断言应该如何处理?
- jsonpath
- jsonschema
- 自行编写解析算法