NỘI DUNG BÀI HỌC
✳️ Sử dụng cú pháp Request với Params và Header
✳️ Sử dụng cú pháp Response với phương thức GET
✅ Hàm Given() When() Then() trong REST Assured
Trong REST Assured hỗ trợ chúng ta 3 hàm chính given() when() then()
để thể hiện code theo kiến trúc BDD. Mỗi hàm sẽ có ý nghĩa riêng của nó để đảm bảo được nhu cầu kiểm thử tự động API theo kiểu RESTful. Và chúng ta sẽ sử dụng những hàm này để thiết kế code test automation cho API sau này.
Ví dụ sử dụng 3 hàm given when then để send một request và validate response:given()
: để khai báo phần sau nó là một sự chuẩn bị trước khi send request, như chỉ định URI, khai báo Header, khai báo Params,...when()
: để khai báo phần sau nó là một hành động trực tiếp để send request, như chỉ định body đầu vào, chỉ định phương thức trong REST,...then()
: để khai báo phần sau nó là một kết quả trả về và có thể validate kết quả trả về đó, như kiểm tra status code, kiểm tra body kết quả,...
Cách viết là chúng ta sẽ sử dụng một cú pháp viết liền nhau giữa given when và then thông qua dấu chấm nối liền nhau như mẫu trên.
Ví dụ khi hàm then() validate kết quả và nhận thấy bị sai, không đúng status code như mẫu sau:
✅ Sử dụng cú pháp Request với Params và Header
Như ví dụ trên từ hàm given when then thì các bạn cũng thấy rất đơn giản để send một request API. Cụ thể chúng ta sử dụng hàm given() để khai báo một URI (HTTP URI) để send request đến URL đầy đủ. (URI + PATH endpoint)
Ngoài ra còn có thể khai báo thêm các Params và Header cho sự chuẩn bị trước khi send request.
Ví dụ chúng ta muốn get all users: https://api.anhtester.com/swagger/index.html#/User%20Management/getUsers
Từ tài liệu trên thì chúng ta có thể biết được yêu cầu cho hàm get all users là:
- Dùng phương thức GET để send request
- Dùng URL là https://api.anhtester.com/api/users nghĩa là lúc bấy giờ cái URI là https://api.anhtester.com/api còn cái path endpoint là /users. Chổ này trong REST Assured sẽ hỗ trợ đầy đủ để chúng ta khai báo từng phần.
- Cần chỉ định thêm phần Header là accept: application/json
🔆 Request với Header
Chúng ta sẽ khai báo trong code với REST Assured như sau:
//Khai báo đối tượng request để thiết lập điều kiện đầu vào
//Dùng given() chỉ thị sự thiết lập sẵn điều kiện
RequestSpecification request = given();
request.baseUri("https://api.anhtester.com/api")
.basePath("/users")
.header("accept", "application/json");
Trong chổ khai báo hàm header thì các bạn có thể sử dụng trực tiếp hàm accept để chỉ định thẳng giá trị application/json
//Khai báo đối tượng request để thiết lập điều kiện đầu vào
//Dùng given() chỉ thị sự thiết lập sẵn điều kiện
RequestSpecification request = given();
request.baseUri("https://api.anhtester.com/api")
.basePath("/users")
//.header("accept", "application/json")
.accept("application/json");
Tuy nhiên dùng header thấy chuyên nghiệp hơn và đáp ứng được cho nhiều trường hợp.
Các bạn có thể dùng nhanh đoạn code đầy đủ dưới đây để send request dùng hàm GET cho trường hợp trên:
@Test
public void testGetAllUsers() {
//Khai báo đối tượng request để thiết lập điều kiện đầu vào
//Dùng given() chỉ thị sự thiết lập sẵn điều kiện
RequestSpecification request = given();
request.baseUri("https://api.anhtester.com/api")
.basePath("/users")
//.header("accept", "application/json")
.accept("application/json");
//Khai báo đối tượng response để nhận giá trị trả về từ hàm when() làm gì đó
//Cụ thể thì chúng ta dùng phương thức GET với hàm get() một endpoint
Response response = request.when().get();
//In ra giá trị của response nhận về
//prettyPrint() là in với nội dung body đã format đẹp mắt
response.prettyPrint();
}
Thư viện dùng:
import io.restassured.specification.RequestSpecification;
import static io.restassured.RestAssured.given;
import io.restassured.response.Response;
🔆 Request với Parameter
Trong trường hợp chúng ta send request có thêm tham số đầu vào như docs API https://api.anhtester.com/swagger/index.html#/User%20Management/getUserByName
Thì chúng ta cần gọi thêm hàm queryParam
để truyền tham số vào.
//Khai báo đối tượng request để thiết lập điều kiện đầu vào
//Dùng given() chỉ thị sự thiết lập sẵn điều kiện
RequestSpecification request = given();
request.baseUri("https://api.anhtester.com/api")
.basePath("/user")
.accept("application/json");
//Khai báo tham số đầu vào với hàm queryParam
request.queryParam("username", "anhtester");
Ví dụ trên có 1 tham số, trường hợp khác có thêm tham số thì các bạn cứ chấm viết tiếp phía sau nhé.
request.queryParam("username", "anhtester")
.queryParam("param1", 10)
.queryParam("param2", "java");
Sau đây là code đầy đủ để các bạn send request cho hàm get user by username:
@Test
public void testUserByUserName() {
//Khai báo đối tượng request để thiết lập điều kiện đầu vào
//Dùng given() chỉ thị sự thiết lập sẵn điều kiện
RequestSpecification request = given();
request.baseUri("https://api.anhtester.com/api")
.basePath("/user")
.accept("application/json");
//Khai báo tham số đầu vào với hàm queryParam
request.queryParam("username", "anhtester");
Response response = request.when().get();
response.prettyPrint();
}
✅ Sử dụng cú pháp Response với phương thức GET
Khi khai báo cú pháp Response thì chúng ta sẽ sử dụng đối tượng class Response được REST Assured hỗ trợ sẵn cùng hàm when() then()
để nhận và kiểm tra kết quả.
Lấy ví dụ hàm get user by username trên nhé.
@Test
public void testGetUserByUserName() {
//Khai báo đối tượng request để thiết lập điều kiện đầu vào
//Dùng given() chỉ thị sự thiết lập sẵn điều kiện
RequestSpecification request = given();
request.baseUri("https://api.anhtester.com/api")
.basePath("/user")
.accept("application/json");
//Khai báo tham số đầu vào với hàm queryParam
request.queryParam("username", "anhtester");
//Khai báo đối tượng response để nhận giá trị trả về từ hàm when() làm gì đó
//Cụ thể thì chúng ta dùng phương thức GET với hàm get() một endpoint
Response response = request.when().get();
//In ra giá trị của response nhận về
//prettyPrint() là in với nội dung body đã format đẹp mắt
response.prettyPrint();
}
Các hàm RESTful API trong REST Assured:
- get() : tương ứng phương thức GET
- post() : tương ứng phương thức POST
- put() : tương ứng phương thức PUT
- patch() : tương ứng phương thức PATCH
- delete() : tương ứng phương thức DELETE
- head() : tương ứng phương thức HEAD
- options() : tương ứng phương thức OPTIONS
Để muốn nhận kết quả từ Response thì chúng ta gán giá trị từ request trực tiếp cho đối tượng response như đoạn code trên. Áp dụng cho tất cả các phương thức REST khác nêu trên.
@Test
public void testGetUserByUserName02() {
RequestSpecification request = given();
request.baseUri("https://api.anhtester.com/api")
//.basePath("/user")
.accept("application/json");
request.queryParam("username", "anhtester");
//Có thể truyền Path vào trực tiếp phương thức test RESTful
Response response = request.when().get("/user");
response.prettyPrint();
}
🔆 Verify kết quả từ Response với hàm then()
Khi kiểm tra kết quả thì chúng ta lấy đối tượng response chấm hàm then()
để có được các hàm xây dựng sẵn từ REST Assured để hỗ trợ kiểm tra các dạng trả về như status code, content-type, body,...
@Test
public void testVerifyResultFromResponse() {
RequestSpecification request = given();
request.baseUri("https://api.anhtester.com/api")
.accept("application/json");
request.queryParam("username", "anhtester");
Response response = request.when().get("/user");
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.username", equalTo("anhtester"));
}
Khi so sánh kết quả trong body thì kiểu trả về là JSON nên chúng ta cần chấm gọi đối tượng trong JSON theo cấp bậc của nó.
Dùng các hàm hỗ trợ so sánh từ thư viện org.hamcrest.Matchers
như equalTo, contains,...
import static org.hamcrest.Matchers.equalTo;
import static org.hamcrest.Matchers.contains;
Phần kiểm tra kết quả chúng ta sẽ được học kĩ ở bài sau. Sử dụng thêm thư viện Assert
từ TestNG và cả hamcrest
Các bạn có thể dùng thử hàm get() để kiểm thử cho các chức năng nào mà yêu cầu phương thức GET trên tài liệu API mà An đã xây dựng nhé.
https://api.anhtester.com/swagger/index.html