Cách test RESTful API trong Spring Boot
Ứng dụng của bạn đã được xây dựng trên nền tảng Spring Boot và sử dụng các API RESTful để cung cấp các dịch vụ cho người dùng. Nhưng làm thế nào để đảm bảo rằng ứng dụng của bạn hoạt động đúng như mong đợi?
Trong bài viết này, chúng tôi sẽ giới thiệu về cách test ứng dụng RESTful API trong Spring Boot và cung cấp cho bạn các công cụ và kỹ thuật cần thiết để thực hiện việc test một cách hiệu quả.
1. Giới thiệu RESTful API và test RESTful API
Trước khi đi tìm hiểu về các cách để test ứng dụng RESTful API trong Spring Boot, bạn có thể tìm hiểu về hai khái niệm Spring Boot và RESTful API qua hai bài viế về Spring Boot và RESTful API ở đây nhé!!!
RESTful API là một phương pháp để thiết kế các API cho các ứng dụng web và di động. Nó được xây dựng trên nền tảng của HTTP, sử dụng các phương thức HTTP như GET, POST, PUT và DELETE để quản lý các tài nguyên. Spring Boot là một framework phát triển ứng dụng web trong ngôn ngữ Java, cung cấp cho các lập trình viên một cách tiếp cận nhanh chóng và dễ dàng để xây dựng ứng dụng web.
Bài viết này được đăng tại [free tuts .net]
Tuy nhiên, việc test ứng dụng RESTful API trong Spring Boot là rất quan trọng để đảm bảo rằng ứng dụng của bạn hoạt động đúng như mong muốn. Trong bài viết này, chúng ta sẽ tìm hiểu về các kỹ thuật và công cụ để test ứng dụng RESTful API trong Spring Boot.
2. Các kỹ thuật test ứng dụng RESTful API trong Spring Boot
Unit Test
Unit Test là kỹ thuật test một phần mềm trong đó các đơn vị nhỏ nhất của phần mềm được test độc lập. Trong trường hợp của ứng dụng RESTful API trong Spring Boot, các đơn vị nhỏ nhất là các phương thức của API. Unit Test sử dụng các frameworks như JUnit để tạo ra các test case và kiểm tra các phương thức đó.
Ví dụ: Đoạn mã sau đây sử dụng JUnit để test một phương thức GET của ứng dụng RESTful API trong Spring Boot:
@RunWith(SpringRunner.class) @SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT) public class UserControllerTest { @Autowired private TestRestTemplate restTemplate; @Test public void testGetUserById() { ResponseEntity<User> response = restTemplate.getForEntity("/users/1", User.class); User user = response.getBody(); assertEquals(HttpStatus.OK, response.getStatusCode()); assertEquals("John Doe", user.getName()); } }
Trong ví dụ này, chúng ta sử dụng TestRestTemplate để gửi một request HTTP GET đến API với đường dẫn /users/1 và kiểm tra kết quả trả về có phải là một đối tượng User với tên là "John Doe" hay không.
Integration Test
Integration Test là kỹ thuật test phần mềm để kiểm tra tính hợp nhất giữa các phần khác nhau của hệ thống. Trong trường hợp của ứng dụng RESTful API trong Spring Boot, Integration Test sử dụng một instance thực tế của ứng dụng để gửi các request HTTP đến API và kiểm tra kết quả trả về.
Ví dụ: Đoạn mã sau đây sử dụng thư viện Spring MVC Test để thực hiện Integration Test trên ứng dụng RESTful API trong Spring Boot:
@RunWith(SpringRunner.class) @SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT) @AutoConfigureMockMvc public class UserControllerIntegrationTest { @Autowired private MockMvc mockMvc; @Test public void testGetUserById() throws Exception { MvcResult result = mockMvc.perform(get("/users/1")) .andExpect(status().isOk()) .andExpect(jsonPath("$.name").value("John Doe")) .andReturn(); String content = result.getResponse().getContentAsString(); User user = new ObjectMapper().readValue(content, User.class); assertNotNull(user); } }
Trong ví dụ này, chúng ta sử dụng MockMvc để tạo ra một instance của ứng dụng Spring Boot và gửi một request HTTP GET đến API với đường dẫn /users/1. Sau đó, chúng ta sử dụng các phương thức andExpect() để kiểm tra kết quả trả về có phải là một đối tượng User với tên là "John Doe" hay không. Cuối cùng, chúng ta sử dụng ObjectMapper để chuyển đổi kết quả trả về từ định dạng JSON sang đối tượng User.
End-to-End Test
End-to-End Test là kỹ thuật test phần mềm để kiểm tra tính đúng đắn và hoạt động của toàn bộ hệ thống. Trong trường hợp của ứng dụng RESTful API trong Spring Boot, End-to-End Test sử dụng một instance thực tế của ứng dụng và mô phỏng các hành động của người dùng để kiểm tra tính đúng đắn và hoạt động của toàn bộ hệ thống.
Ví dụ: Đoạn mã sau đây sử dụng thư viện Selenium để thực hiện End-to-End Test trên ứng dụng RESTful API trong Spring Boot:
@RunWith(SpringRunner.class) @SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT) public class UserControllerEndToEndTest { @LocalServerPort private int port; private WebDriver driver; @Before public void setUp() { driver = new ChromeDriver(); } @After public void tearDown() { driver.quit(); } @Test public void testGetUserById() throws Exception { driver.get("http://localhost:" + port + "/users/1"); WebElement nameElement = driver.findElement(By.id("name")); assertEquals("John Doe", nameElement.getText()); } }
Trong ví dụ này, chúng ta sử dụng WebDriver để tạo ra một instance của trình duyệt Chrome và gửi một request HTTP GET đến API với đường dẫn /users/1 thông qua URL http://localhost:{port}/users/1, trong đó {port} là giá trị của @LocalServerPort. Sau đó, chúng ta sử dụng phương thức findElement() để tìm kiếm phần tử HTML có id là "name" và sử dụng phương thức getText() để lấy giá trị của phần tử đó. Cuối cùng, chúng ta sử dụng assertEquals() để kiểm tra giá trị lấy được có phải là "John Doe" hay không.
Lưu ý rằng để thực hiện End-to-End Test, chúng ta cần phải cài đặt và cấu hình một trình duyệt web như Chrome, Firefox hoặc Safari.
3. Các công cụ hỗ trợ test ứng dụng RESTful API trong Spring Boot
Trong phần này, chúng ta sẽ tìm hiểu về các công cụ hỗ trợ test ứng dụng RESTful API trong Spring Boot.
JUnit
1.1 Giới thiệu về JUnit
JUnit là một framework kiểm thử phổ biến trong Java, được sử dụng để viết và thực thi Unit Test. JUnit có thể được sử dụng để test các class, method và phương thức của ứng dụng.
1.2 Sử dụng JUnit trong việc test ứng dụng RESTful API trong Spring Boot
Để sử dụng JUnit trong việc test ứng dụng RESTful API trong Spring Boot, chúng ta cần thực hiện các bước sau:
Bước 1: Thêm JUnit vào dependencies của ứng dụng Spring Boot trong file pom.xml.
<dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> <scope>test</scope> </dependency>
Bước 2: Tạo một Test Class để viết các Unit Test cho phương thức trong ứng dụng. Chúng ta sử dụng các Annotation của JUnit như @Test để đánh dấu các phương thức test và @Before để đánh dấu phương thức sẽ được thực thi trước khi các phương thức test khác.
Ví dụ:
@RunWith(SpringRunner.class) @SpringBootTest(classes = DemoApplication.class) public class UserControllerTest { private MockMvc mockMvc; @Autowired private WebApplicationContext wac; @Before public void setup() { this.mockMvc = MockMvcBuilders.webAppContextSetup(this.wac).build(); } @Test public void testGetAllUsers() throws Exception { this.mockMvc.perform(get("/users")) .andExpect(status().isOk()); } }
Trong ví dụ trên, chúng ta sử dụng MockMvc của Spring để kiểm thử API. @RunWith(SpringRunner.class) đánh dấu Test Class sử dụng Runner là SpringRunner và @SpringBootTest(classes = DemoApplication.class) cho phép chúng ta tải các Bean của ứng dụng trong Context của Spring để sử dụng trong Test.
Mockito
2.1 Giới thiệu về Mockito
Mockito là một thư viện giả lập đối tượng trong Java, cho phép chúng ta kiểm tra các phương thức của đối tượng mà không cần phải tạo ra đối tượng thực sự. Mockito thường được sử dụng trong Integration Test để kiểm tra tích hợp giữa các thành phần khác nhau của ứng dụng.
2.2 Sử dụng Mockito trong việc test ứng dụng RESTful API trong Spring Boot
Để sử dụng Mockito trong việc test ứng dụng RESTful API trong Spring Boot, chúng ta cần thực hiện các bước sau:
Bước 1: Thêm Mockito vào dependencies của ứng dụng Spring Boot trong file pom.xml.
<dependency> <groupId>org.mockito</groupId> <artifactId>mockito-core</artifactId> <version>2.28.2</version> <scope>test</scope> </dependency>
Bước 2: Tạo một Test Class để viết các Unit Test cho phương thức trong ứng dụng. Chúng ta sử dụng các Annotation của JUnit như @Test để đánh dấu các phương thức test và @Mock để đánh dấu các đối tượng cần giả lập.
Ví dụ:
@RunWith(SpringRunner.class) @SpringBootTest(classes = DemoApplication.class) public class UserServiceTest { @Mock private UserRepository userRepository; @InjectMocks private UserService userService; @Before public void setUp() { MockitoAnnotations.initMocks(this); } @Test public void testGetAllUsers() { when(userRepository.findAll()).thenReturn(Arrays.asList(new User("user1"), new User("user2"))); List<User> userList = userService.getAllUsers(); assertEquals(userList.size(), 2); assertEquals(userList.get(0).getName(), "user1"); assertEquals(userList.get(1).getName(), "user2"); } }
Trong ví dụ trên, chúng ta sử dụng @Mock để giả lập đối tượng UserRepository và @InjectMocks để giả lập đối tượng UserService. Trong phương thức testGetAllUsers, chúng ta sử dụng when(userRepository.findAll()).thenReturn(Arrays.asList(new User("user1"), new User("user2")))
để giả lập phương thức findAll() của đối tượng UserRepository trả về một danh sách gồm 2 User. Sau đó, chúng ta gọi phương thức getAllUsers()
của đối tượng UserService để kiểm tra kết quả trả về.
RestAssured
3.1 Giới thiệu về RestAssured
RestAssured là một thư viện kiểm thử API được sử dụng trong Java. RestAssured cung cấp các API dễ sử dụng để kiểm tra API RESTful, giúp chúng ta thực hiện các Unit Test và Integration Test cho ứng dụng.
3.2 Sử dụng RestAssured trong việc test ứng dụng RESTful API trong Spring Boot
Để sử dụng RestAssured trong việc test ứng dụng RESTful API trong Spring Boot, chúng ta cần thực hiện các bước sau:
Bước 1: Thêm RestAssured vào dependencies của ứng dụng Spring Boot trong file pom.xml.
<dependency> <groupId>io.rest-assured</groupId> <artifactId>rest-assured</artifactId> <version>4.3.3</version> <scope>test</scope> </dependency>
Bước 2: Tạo một Test Class để viết các Unit Test cho phương thức trong ứng dụng. Chúng ta sử dụng các API của RestAssured để gọi các API RESTful
Ví dụ:
@RunWith(SpringRunner.class) @SpringBootTest(classes = DemoApplication.class, webEnvironment = SpringBootTest.WebEnvironment.DEFINED_PORT) public class UserControllerTest { private static final String BASE_URL = "http://localhost:8080/api/users"; @Test public void testGetAllUsers() { given().when().get(BASE_URL).then().statusCode(200); } @Test public void testGetUserById() { given().pathParam("id", 1).when().get(BASE_URL + "/{id}").then().statusCode(200); } @Test public void testCreateUser() { given().contentType("application/json").body(new User("user1")).when().post(BASE_URL).then().statusCode(201); } @Test public void testUpdateUser() { given().contentType("application/json").body(new User("user1")).when().put(BASE_URL + "/1").then().statusCode(200); } @Test public void testDeleteUser() { given().pathParam("id", 1).when().delete(BASE_URL + "/{id}").then().statusCode(200); } }
Trong ví dụ trên, chúng ta sử dụng given() để chỉ định các thông tin về phương thức HTTP (GET, POST, PUT, DELETE), body của request (nếu có), và path param hoặc query param (nếu có). Sau đó, chúng ta sử dụng then() để xác nhận kết quả trả về từ phương thức RESTful. Trong các phương thức test, chúng ta sử dụng các phương thức của RestAssured như statusCode() để kiểm tra mã trạng thái của phản hồi từ server.
4. Các câu hỏi thường gặp
Tại sao chúng ta cần phải test ứng dụng RESTful API trong Spring Boot?
Việc test giúp đảm bảo rằng ứng dụng của bạn hoạt động như mong đợi và đáp ứng được yêu cầu của người dùng. Việc thực hiện các Unit Test và Integration Test giúp đảm bảo chất lượng của ứng dụng và giảm thiểu các lỗi không mong muốn.
Các công cụ nào có thể được sử dụng để test ứng dụng RESTful API trong Spring Boot?
Các công cụ phổ biến được sử dụng để test ứng dụng RESTful API trong Spring Boot là JUnit, Mockito và RestAssured.
Các loại test nào có thể được thực hiện trên ứng dụng RESTful API trong Spring Boot?
Có hai loại test chính: Unit Test và Integration Test. Trong đó, Unit Test thực hiện kiểm tra một phần nhỏ của ứng dụng, trong khi Integration Test thực hiện kiểm tra toàn bộ ứng dụng.
Làm thế nào để chọn các trường hợp test phù hợp khi test ứng dụng RESTful API trong Spring Boot?
Bạn nên tập trung vào các trường hợp sử dụng chính của ứng dụng của bạn và các trường hợp biên, cũng như các trường hợp lỗi phổ biến mà người dùng có thể gặp phải khi sử dụng ứng dụng.
Làm thế nào để xác định kết quả của một test khi test ứng dụng RESTful API trong Spring Boot?
Bạn có thể xác định kết quả của một test bằng cách kiểm tra mã trạng thái của phản hồi từ server, kiểm tra nội dung của phản hồi, kiểm tra định dạng phản hồi và các tiêu chí khác.
5. Kết bài viết
Trong bài viết này, mình đã giới thiệu về cách test ứng dụng RESTful API trong Spring Boot và cung cấp các ví dụ về cách sử dụng các công cụ phổ biến như JUnit, Mockito và RestAssured để thực hiện việc test. Hy vọng rằng bài viết này đã giúp bạn hiểu rõ hơn về việc test ứng dụng RESTful API và cung cấp cho bạn các kiến thức cần thiết để tiếp cận việc test một cách hiệu quả.