NỘI DUNG BÀI HỌC
✳️ 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 assertTrue và assertEquals.
@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.