Requirement: Test API create a new student
POST request có body như phía dưới và assert kết quả (message: “Student added” và status code là 201)
{ "id":1, "firstName":"Vernon", "lastName":"Harper", "email":"egestas.rhoncus.Proin@massaQuisqueporttitor.org", "programme":"Financial Analysis", "courses":[ "Accounting", "Statistics" ] }
Nội dung bài viết
I. Cách tạo POST request
Tạo Post request bằng Rest-Assured:
Response res = given() .contentType(ContentType.JSON) .when() .body(student) .post();
- Vì body ở phần yêu cầu là 1 Object Json nên khi gửi request POST, cần phải viết rõ contentType là
application/json
- Trong phần body, mình cần add vào 1 Object Student. Theo yêu cầu cần gửi 1 Object json mà code mình viết bằng Java, do đó mình phải có 1 cách nào đó để chuyển từ Java –> Json. Ta phải add thêm 1 thư viện có tên Jackson. Thực ra thì Rest-Assured có thể hỗ trợ nhiều thư viện Object Mapping khác nhau, ví dụ như Jackson, Jackson2, Gson or Johnzon. Mình add Jackson vào trong pom.xml
<dependency> <groupid>com.fasterxml.jackson.core</groupid> <artifactid>jackson-databind</artifactid> <version>2.9.8</version> </dependency>
- Cuối cùng, ta sử dụng post() để set Method là POST.
II. Cách tạo body
Việc của chúng ta cần làm chỉ là tạo ra 1 POJO Java có cùng cấu trúc với Object Json theo yêu cầu là xong. Nếu ai chưa biết thì POJO là Plain Old Java Object, nôm na, nó có nghĩa là 1 Object Java thông thường, sẽ không được extends hoặc implement cái gì cả. Bạn sẽ phải add Jackson vào trong pom.xml
Việc tạo ra Object Java thì rất đơn giản, chỉ cần tạo 1 Class có các fields giống với Object Json là xong. Ở đây ta sẽ thấy như sau:
- id là số, nên ta set Data type là int
- firstName là String nên Data type là String
- …
- courses là 1 array của String nên Data type là List<String>
Lưu ý: Để Object Mapping không bị lỗi thì Object Java sẽ phải có đủ getter và setter.
Bạn có 2 cách để xử lý vấn đề này:
- Sử dụng auto-generate getter/setter từ Intellij. Alt + Insert > Getter and Setter
- Vì 1 Object mà có nhiều fields thì việc add thêm getter/setter làm cho code trông dài và rất lằng nhằng, do đó mình sử dụng 1 thư viện có tên là lombok để có thể auto-geneate getter/setter lúc runtime.
- Add library lombok vào pom.xml
<dependency> <groupid>org.projectlombok</groupid> <artifactid>lombok</artifactid> <version>1.18.10</version> <scope>provided</scope> </dependency>
Chốt lại file pom.xml sẽ như sau:
<dependencies> <dependency> <groupid>io.rest-assured</groupid> <artifactid>rest-assured</artifactid> <version>3.3.0</version> <scope>test</scope> </dependency> <dependency> <groupid>org.junit.jupiter</groupid> <artifactid>junit-jupiter-api</artifactid> <version>5.5.2</version> <scope>test</scope> </dependency> <dependency> <groupid>com.fasterxml.jackson.core</groupid> <artifactid>jackson-databind</artifactid> <version>2.9.8</version> </dependency> <dependency> <groupid>org.projectlombok</groupid> <artifactid>lombok</artifactid> <version>1.18.10</version> <scope>provided</scope> </dependency> </dependencies>
Lưu ý: Sau khi bạn đã làm hết những việc trên mà lombok vẫn báo error thì hãy restart lại Intellij và thực hiện Maven/reimport
III. Viết Test
Mệt quá, viết mãi không hết bài (cry)
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 java.util.ArrayList; import java.util.List; import static io.restassured.RestAssured.given; import static org.hamcrest.CoreMatchers.equalTo; class PostNewStudentTest { @BeforeAll static void init() { RestAssured.baseURI = "http://localhost"; RestAssured.basePath = "/student"; RestAssured.port = 8080; } @Test void postNewStudent() { List<String> courses = new ArrayList<>(); courses.add("Math"); courses.add("Economics"); Student student = new Student(); student.setId(101); student.setFirstName("Giang"); student.setLastName("Nguyen"); student.setEmail("giang.nguyen@gc.com"); student.setProgramme("Computer Science"); student.setCourses(courses); Response res = given() .contentType(ContentType.JSON) .when() .body(student) .post(); //res.prettyPrint(); res.then().statusCode(201).body("msg", equalTo("Student added")); } }
- Mình khởi tạo Object Student rồi set giá trị cho các fields như bình thường
- Sau đó mình sử dụng body() để asset kết quả. Đây là message trả về sau khi add student.
{ "msg": "Student added" }
Có thể bạn sẽ thắc mắc là cái equalTo()
kia ở đâu ra, thì nó là 1 function của Hamcrest, 1 library để chuyên thực hiện việc assert. Cái library này đã được include trong Rest-Assured nên bạn không cần phải add nó vào pom.xml. Việc sử dụng Hamcrest như thế nào thì mình sẽ viết dần dần vào các bài sau.
IV. Kết luận
Cảm thấy viết được 1 cái post request bằng Rest-Assured cũng loằng ngoằng nhỉ phải không ace. Đấy là cảm giác ban đầu thôi, sau sẽ viết nhanh như gió (ý là nhanh như chém gió. :v). Chốt lại, trình tự của 1 Post request phải làm là:
- Tạo ra Object
- Set giá trị cho các fields của Object đó
- Call API
- Check response sau khi gọi API
[…] [Bài 4] Request POST sử dụng Rest-Assured This entry was posted in API Testing, Rest-assured and tagged API testing, rest-asscured by Giang Nguyen. Bookmark the permalink. […]
Cảm ơn chia sẻ của b, cho mình hỏi phần này có thể hiểu như là viết automation cho API phải k b
Bạn hiểu như thế cũng được. Automation test chỉ việc tự động run và tự động check kết quả và đây là phần automation viết bằng code.
[…] ← Previous […]
[…] 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 […]
[…] src > main > Models: nơi chứa các Java Object, dùng cho việc mapping sang Json / xml Object. Đọc thêm bài 4. […]