Requirement: Xóa Student theo id
Solution: Thông thường để test chức năng delete (cả API hoặc UI) thì cũng nên tạo ra trước rồi xóa, thay vì xóa luôn những cái đang có. Trong TH này mình cũng làm tương tự, mình sẽ gọi API create new Student trước, sau đó sẽ gọi API delete Student.
Nội dung bài viết
I. Cách tạo Student
Trong bài số 4, mình đã giới thiệu cách để tạo ra 1 Object Student, tuy nhiên là chúng ta mất khá nhiều công sức để tạo ra được 1 Object như vậy.
Bây giờ, mình sẽ sửa để sao cho mỗi lần khởi tạo 1 Object là đã có chứa đầy đủ thông tin luôn, có id, firstName, lastName…Sau này mình cần sửa field nào, chỉ cần override lại đúng field đó thôi.
Quay trở lại với class Student, mình sẽ viết thêm như sau:
package model; import com.github.javafaker.Faker; import lombok.Data; import java.util.ArrayList; import java.util.List; @Data public class Student { private int id; private String firstName; private String lastName; private String email; private String programme; private List<string> courses; private Student(){ Faker faker = new Faker(); this.id = 101; this.firstName = faker.name().firstName(); this.lastName = faker.name().lastName(); this.email = faker.internet().emailAddress(); this.programme = "Test"; this.courses = new ArrayList<>(); courses.add(faker.educator().course()); courses.add(faker.educator().course()); } public static Student getInstance(){ return new Student(); } }
Ở đây, có 3 điểm đáng lưu ý:
- Sử dụng Faker để generate fake data, mình đã viết hướng dẫn ở đây. Bạn không nên khai báo Faker như 1 field của Object vì như thế khi Jackson convert từ POJO –> JSON sẽ bị lỗi.
- Sử dụng getInstance() thay vì public Constructor để sau này mình cần sửa ở Object thì mình không phải sửa những lại những chỗ mình khởi tạo object. Giả sử mình sử dụng public Constructor Student(int id), hôm sau mình sửa thành Student(int id, String firstName) thì mình phải đi sửa lại tất cả những chỗ nào mình đã sử dụng Student(int id), rất mất thời gian.
- Mình sử dụng private Constructor để việc khởi tạo Object Student chỉ có 1 cách duy nhất là sử dụng method getInstance().
Hãy nhớ add Faker vào file pom.xml
<dependency> <groupid>com.github.javafaker</groupid> <artifactid>javafaker</artifactid> <version>0.18</version> </dependency>
II. Viết Test
package giangtester; import io.restassured.RestAssured; import io.restassured.http.ContentType; import io.restassured.response.Response; import model.Student; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Test; import static io.restassured.RestAssured.given; class DELETEStudentTest { @BeforeAll static void init() { RestAssured.baseURI = "http://localhost"; RestAssured.basePath = "/student"; RestAssured.port = 8080; } @Test void deleteAnExistingStudent() { // Arrange: Setup data Student student = Student.getInstance(); given().log().all().contentType(ContentType.JSON) .when().body(student).post(); // Act: Call API delete student Response res = given() .contentType(ContentType.JSON) .when() .delete("/{id}", student.getId()); // Assert res.then().statusCode(204); } }
Ở đây có 2 thứ cần lưu tâm:
- Mình sử dụng
given().log().all()
để log toàn bộ các thông tin của request. Nếu bạn muốn log response thì sẽ dùngthen().log().all()
- Rest-Assured cho phép sử dụng
{varName}
với path nên mình có thể dùngdelete("/{id}", student.getId())
—>{id}
chính làstudent.getId()
Thôi hết rồi, chào các bạn 😀
[…] ← Previous Next → […]
Có thể có 1 bài cụ thể về teardown xóa không ạ, tại mình mới bắt đầu học mà tìm chưa ra
Ý bạn là bạn sẽ gửi request để delete ở phần teardown (after tests) đúng ko?
Bạn chỉ cần gọi request DELETE ở @AfterMethod/@AfterClass TestNG hoặc @AfterEach/@AfterAll JUnit5 là được thôi.