jck28-lucio-json响应体断言

目录

  • 响应体介绍
  • JSON 响应体断言

课程目标

  1. 掌握接口响应体的概念。
  2. 掌握如何对 JSON 类型的响应体完成断言

思考

在断言的过程中,如果只对响应状态码断言可以完成对用例的测试吗?

响应体介绍

  • 服务器端响应客户端请求后返回的数据体。
  • 接口响应体的格式通常为 JSON、XML、HTML 等。

为什么要对响应体断言

  1. 验证响应体返回字段信息是否符合预期的业务需求。
  2. 验证响应体字段的数据类型、数据格式。
  3. 提高测试效率。

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 响应体断言

  1. 直接断言: then().body()
  2. 提取后断言: 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
    • 自行编写解析算法

演练环境