Ở bài viết trước, tôi đã giới thiệu với các bạn cách test REST API trong Jersey project. Giả sử bây giờ chúng ta cần sử dụng API của bên thứ 3 (không phải source code trong jersey project của chúng ta), khi đó ta không thể sử dụng Jersey Test. Khi đó, chúng ta cần một thư viện khác có thể giúp chúng ta gửi một request thật để verfiy kết quả trả về.
Trong bài này tôi sẽ giới thiệu với các bạn một thư viện rất mạnh mẽ để test web service, đó chính là REST Assured. Nó cho phép chúng ta gửi một HTTP request thật và verify trên kết quả trả về một cách dễ dàng. Chẳng hạn chúng ta có một request http://localhost:8080/lotto/{id} và server trả về response JSON như sau:
Test REST Web Service
Khi đó chúng ta dễ dàng sử dụng REST Assured để verify mọi thứ từ response trên như sau:
Test REST Web Service
Mọi thứ trông thật đơn giản phải không nào? Bây giờ, chúng ta hãy bắt đầu cài đặt thư viện cần thiết và viết một vài test case cho REST API sử dụng REST Assured.
Cài đặt REST Assured
Để sử dụng REST Assured chúng ta đơn giản chỉ việc thêm dependency sau trong file pom.xml.
Bước này chỉ là giả định bên thứ ba cung cấp cho chúng ta các API để sử dụng, nếu các bạn đã có sẵn REST API, các bạn có thể đi đến bước kế tiếp “Test REST API sử dụng REST Assured”.
Để dễ hiểu, tôi sử dụng lại service đã tạo ở bài trước để hướng dẫn các bạn viết JUnit Test cho REST API với REST Assured.
package com.gpcoder.api;import javax.ws.rs.Consumes;import javax.ws.rs.FormParam;import javax.ws.rs.POST;import javax.ws.rs.Path;import javax.ws.rs.Produces;import javax.ws.rs.core.MediaType;import javax.ws.rs.core.Response;import com.gpcoder.helper.JwTokenHelper;import com.gpcoder.model.User;import com.gpcoder.service.UserService;@Path("/auth")publicclassAuthService{@POST@Produces(MediaType.APPLICATION_JSON)@Consumes(MediaType.APPLICATION_FORM_URLENCODED)publicResponse authenticateUser(@FormParam("username")String username,@FormParam("password")String password){// Authenticate the user using the credentials providedUserService userService =newUserService();User user = userService.getUser(username);if(user ==null||!user.getPassword().equals(password)){returnResponse.status(Response.Status.FORBIDDEN)// 403 Forbidden.entity("Wrong username or password")// the response entity.build();}// Issue a token for the userString token =JwTokenHelper.createJWT(user);// Return the token on the responsereturnResponse.ok(token).build();}}
Do các API cần phải được chứng thực user trước khi sử dụng, nên chúng ta cần chứng thực trước để nhận một Token (JWT), sau đó gửi chúng vào header ở mỗi request.
getBearerToken() : gửi request authentication để lấy token (JWT).
testGetById_Way1() : sử dụng để test GET /api/orders/{id}, trong ví dụ này tôi sẽ verify trực tiếp response thông qua phương thức body của REST Assured.
testGetById_Way2() : sử dụng để test GET /api/orders/{id}, trong ví dụ này tôi sẽ tạo một POJO object để nhận response và verify kết quả thông qua các phương thức của JUnit.
testCreate() : sử dụng để test POST /api/orders
testUpdate() : sử dụng để test PUT /api/orders/{id}
testDelete() : sử dụng để test DELETE /api/orders/{id}
Lưu ý: Phải start server REST API lên trước khi chạy Unit Test.
Như bạn thấy, REST Assured hỗ trợ cú pháp rất quen thuộc từ Behavior-Driven Development (BDD) khi viết Unit Test là Given/ When/ Then. Nhờ vậy mà Unit test của chúng ta rất dễ đọc và dễ kiểm tra tất cả mọi thứ (setup, execution, and verification) với chỉ vài dòng code.
Given: Thiết lập các điều kiện cần thiết: khởi tạo các đối tượng, xác định tài nguyên cần thiết, xây dựng các dữ liệu giả, …
When: Triệu gọi các phương thức cần kiểm tra.
Then: Kiểm tra sự hoạt động đúng đắn của các phương thức.
Trên đây là một số ví dụ cơ bản về viết Unit Test cho REST web server sử dụng thư viện REST Assured, còn rất nhiều phương thức khác hỗ trợ chúng ta viết test dễ dàng hơn và nhanh chóng hơn, các bạn hãy tham khảo thêm trên document của REST Assured.