NỘI DUNG BÀI HỌC

✳️ Verify Response sử dụng hàm then() của REST Assured
✳️ Verify Response sử dụng class Assert của TestNG Framework
✳️ Sử dụng thư viện JsonPath để đọc JSON body

✅ Verify Response sử dụng hàm then() của REST Assured

Chúng ta lấy đối tượng của Response để chấm gọi trực tiếp hàm then() sau đó gọi tiếp các hàm hỗ trợ sẵn như trong code mẫu bên dưới:

@Test
public void testVerifyResponseUseThenMethod() {
    RequestSpecification request = given();
    request.baseUri("https://api.anhtester.com/api")
        .accept("application/json");

    int id = 1; //ID của book. Gắn vào sau path url luôn

    Response response = request.when().get("/book/" + id);
    response.prettyPrint();

    //Verify kết quả từ response với hàm then()
    response.then().statusCode(200);
    response.then().contentType("application/json");
    //Đối với body thì cần điền cấu trúc theo xpath từ json
    //Hàm equalTo thuộc thư viện org.hamcrest.Matchers
    response.then().body("response.name", containsString("Phương Nam"));
    response.then().body("response.price", equalTo(12000));
    //Dùng vị trí index để lấy thứ tự phần tử trong JSON body. Tính từ 0
    response.then().body("response.image[0].path", containsString("public/images/1avh0VncWc"));
}

Để so sánh kết quả thì chúng ta sử dụng thư viện hamcrest để gọi các hàm hỗ trợ so sánh:

import static org.hamcrest.Matchers.containsString;
import static org.hamcrest.Matchers.equalTo;
  • Hàm equalTo() để so sánh bằng
  • Hàm containsString() để so sánh chứa với giá trị là chuỗi

 

✅ Verify Response sử dụng class Assert của TestNG Framework

Chúng ta có thể gọi trực tiếp class Assert của TestNG để sử dụng các hàm assert hỗ trợ, cụ thể là 2 hàm chính assertTrueassertEquals.

@Test
public void testVerifyResponseUseAssertTestNG() {
    RequestSpecification request = given();
    request.baseUri("https://api.anhtester.com/api")
        .accept("application/json");

    int id = 1; //ID của book. Gắn vào sau path url luôn

    Response response = request.when().get("/book/" + id);
    response.prettyPrint();

    //Verify kết quả từ response với Assert trong TestNG
    //Dùng class Assert chấm gọi 2 hàm chính là assertEquals và assertTrue
    Assert.assertEquals(response.getStatusCode(), 200, "Status Code chưa đúng.");
    Assert.assertEquals(response.getContentType(), "application/json", "Content Type chưa đúng.");

    //Khi lấy kết quả trong body thì cần dùng đối tượng class ResponseBody để lấy hết về kiểu String
    //Khi đó chỉ có thể dùng hàm contains để so sánh chứa, vì không lấy được từng giá trị của từng key
    ResponseBody body = response.getBody();
    Assert.assertEquals(body.asString().contains("Success"), true, "Message Success không tồn tại.");

    //Muốn lấy giá trị từng key trong JSON body để compare chính xác thì 
    //phải dùng hàm then() hoặc thư viện JsonPath
}


🔆 Các hàm assert cơ bản thường dùng:

  • assertEquals(actual, expected)

Dùng để so sánh bằng nhau 2 phần tử có cùng TYPE. Xin nhắc lại, chỉ so sánh 2 phần tử có cùng Type. Method này có thể so sánh rất nhiều loại: dữ liệu nguyên thủy như int, long, double, char, boolean; String; Object; Collections; Maps…
Lưu ý: cái gì phần tử thực tế (actual), ta đặt ở vị trí argument 1. Cái nào là phần tử ta mong đợi (expected), ta đặt ở argument 2.

  • assertNotEquals(actual, expected)

Tương tự như phần trên, chỉ khác là so sánh KHÔNG bằng nhau.

  • assertTrue(boolean condition)

Ta dùng trong trường hợp, ta mong đợi kết quả trả về là true. Nó tương đương với việc sử dụng assertEquals(actual, expected) khi actual và expected có TYPE là boolean.

  • assertFalse(boolean condition)

Ta dùng trong trường hợp, ta mong đợi kết quả trả về là false.

  • assertNull(Object)

Ta sử dụng trong trường hợp ta mong đợi rằng cái Object ta đang nhắm tới là Null.

  • assertNotNull(Object)

Ta sử dụng trong trường hợp ta mong đợi rằng cái Object ta đang nhắm tới là Not Null.

✅ Sử dụng thư viện JsonPath để đọc JSON body

Thư viện JsonPath thuộc của REST Assured luôn. Và có cả thư viện rời nên các bạn dùng sao cũng được. Nên dùng cái có sẵn để thuận tiện.

import io.restassured.path.json.JsonPath;


Giả sử API trả về JSON Body như này:

{
    "message": "Success",
    "response": {
        "id": 1,
        "name": "Đất Rừng Phương Nam",
        "category_id": 1,
        "price": 12000,
        "release_date": "2023/10/29",
        "status": 1,
        "image": [
            {
                "id": 1,
                "path": "public/images/1avh0VncWchVJd1SrYpcgLTU4NccDVW6Ck8ixmW3.png"
            },
            {
                "id": 3,
                "path": "public/images/TwSX1W1RgW26ppX3fhDtxVcLV7tsJAooDtxJWBP7.png"
            }
        ]
    }
}

Cái field "name" nằm trong field "response" nên chúng ta cần sử dụng thư viện JsonPath để đọc được cấu trúc.

Để sử dụng thì các bạn cần khởi tạo đối tượng class JsonPath như sau:

//Muốn lấy giá trị từng key trong JSON body để compare chính xác thì dùng JsonPath
JsonPath jsonPath = response.jsonPath(); //Lưu hết body vào đối tượng jsonPath

//Truy xuất giá trị theo key hoặc đường dẫn xpath theo cấp bậc
String name = jsonPath.get("response.name");
System.out.println("Name: " + name);


Để truy xuất giá trị thì chúng ta gọi hàm get() và truyền đường dẫn xpath theo từng cấp bậc field trong JSON.

Nếu có nhiều phần tử trong mảng thì chỉ định vị trí sau chính field object chứa mảng đó. Index bắt đầu tính từ 0.

Ví dụ muốn lấy đường dẫn hình ảnh thứ 2 của field "image" thì các bạn ghi như sau:

//Lấy đường dẫn path thứ 2 trong mảng của object "image"
//Index bắt đầu tính từ 0
String imagePath2 = jsonPath.get("response.image[1].path");
System.out.println(imagePath2);

 

 

Code kết hợp Assert trong TestNG và JsonPath:

@Test
public void testVerifyResponseUseAssertTestNG() {
    RequestSpecification request = given();
    request.baseUri("https://api.anhtester.com/api")
        .accept("application/json");

    int id = 1; //ID của book. Gắn vào sau path url luôn

    Response response = request.when().get("/book/" + id);
    response.prettyPrint();

    //Verify kết quả từ response với Assert trong TestNG
    //Dùng class Assert chấm gọi 2 hàm chính là assertEquals và assertTrue
    Assert.assertEquals(response.getStatusCode(), 200, "Status Code chưa đúng.");
    Assert.assertEquals(response.getContentType(), "application/json", "Content Type chưa đúng.");

    //Muốn lấy giá trị từng key trong JSON body để compare chính xác thì dùng JsonPath
    JsonPath jsonPath = response.jsonPath(); //Lưu hết body vào đối tượng jsonPath

    //Truy xuất giá trị theo key hoặc đường dẫn xpath theo cấp bậc
    String name = jsonPath.get("response.name");
    System.out.println("Name: " + name);
    //Dùng Assert của TestNG để verify
    Assert.assertEquals(name.contains("Phương Nam"), true, "Name không tồn tại.");
    //Khi lấy trực tiếp giá trị từ jsonPath thì cần toString
    //và phải chuyển số về sạng chuỗi để so sánh
    Assert.assertEquals(jsonPath.get("response.price").toString(), "12000", "Price không đúng.");

    //Lấy đường dẫn path thứ 2 trong mảng của object "image"
    //Index bắt đầu tính từ 0
    String imagePath2 = jsonPath.get("response.image[1].path");
    System.out.println(imagePath2);
    Assert.assertTrue(imagePath2.contains("public/images/TwSX1W1"), "Không đúng hình ảnh thứ 2.");
}


Trong Assert của TestNG không có hàm verify contains nên là chúng ta dùng assertTrue để kiểm tra kết quả contains từ hàm hỗ trợ của Java.

Teacher

Teacher

Anh Tester

Software Quality Engineer

Đường dẫu khó chân vẫn cần bước đi
Đời dẫu khổ tâm vẫn cần nghĩ thấu

Cộng đồng Automation Testing Việt Nam:

🌱 Telegram Automation Testing:   Cộng đồng Automation Testing
🌱 
Facebook Group Automation: Cộng đồng Automation Testing Việt Nam
🌱 
Facebook Fanpage: Cộng đồng Automation Testing Việt Nam - Selenium
🌱 Telegram
Manual Testing:   Cộng đồng Manual Testing
🌱 
Facebook Group Manual: Cộng đồng Manual Testing Việt Nam

Chia sẻ khóa học lên trang

Bạn có thể đăng khóa học của chính bạn lên trang Anh Tester để kiếm tiền

Danh sách bài học