Rest Assured là một trong những thư viện được dùng nhiều nhất trong API Automation testing. Trong tutorial này mình sẽ hướng dẫn các bạn về các khái niệm như là Rest API, API Testing, API Automation Testing,…
Bạn đang xem: Rest assured là gì
API là gì?
API là viết tắt của (Application Programming Interface) – Giao diện lập trình ứng dụng, nó là một tập hợp các functions mà có thể được truy cập bởi các ứng dụng khác. Do đó, nó như là một giao diện giữa các hệ thống phần mềm khác nhau và thiết lập sự tương tác và trao đổi dữ liệu của chúng.
API Testing là gì?
Trong nền công nghiệp phát triển phần mềm hiện đại, rất nhiều các ứng dụng / hệ thống được thiết kế dựa trên mô hình 3 lớp (3-tier architecture model).
Ba lớp đó là:
Presentation Tier – Tầng tương tác trực tiếp với người dùng, dùng để hiển thị các thành phần giao diện để tương tác với người dùng như tiếp nhận thông tin, thông báo lỗiLogic Tier – Tầng logic, tầng này cũng có thể được gọi là business tier, nhiệm vụ của tầng này là đảm nhận và xử lí các business của hệ thống. Tầng này cũng làm nhiệm vụ di chuyển, xử lí thông tin giữa 2 tầng Presentation và Data TierData Tier – nơi lưu trữ và trích xuất dữ liệu từ các hệ quản trị CSDL hay các file trong hệ thống. Cho phép tầng Business logic thực hiện các truy vấn dữ liệu.
3 layers kể trên sẽ giao tiếp với nhau thông qua các dịch vụ (services) mà mỗi layer cung cấp để tạo nên ứng dụng, lớp này cũng không cần biết bên trong lớp kia làm gì mà chỉ cần biết lớp kia cung cấp dịch vụ gì cho mình và sử dụng nó mà thôi.
Lớp Logic bao gồm tất cả các bussiness logic của hệ thống, nó phức tạp hơn tất cả các lớp còn lại, do đó việc thực hiện kiểm thử trên lớp này là rất cần thiết. Việc kiểm thử trên lớp bussiness logic này được gọi là API Testing.
Xem thêm: Tổ Dân Phố Tiếng Anh Là Gì, Khu Phố Tiếng Anh Là Gì
Đối với UI Testing, chúng ta test dựa trên các hành vi của người dùng như nhập dữ liệu qua bàn phím, thực hiện click một button nào đó trên screen,… thì đối với API Testing, chúng ta thực hiện gửi các request và check xem output từ API trả về cho chúng ta xem hệ thống trả về có đúng như chúng ta mong muốn hay không. Dữ liệu mà API trả về cho chúng ta có thể là JSON với RESTful API hoặc là XML với SOAP.
Để hiểu thêm về REST và SOAP thì các bạn có thể tham khảo bài viếtChọn web service tốt nhất
REST Assured là gì
Rest-assured (RestA) là 1 thư viện Java DSL được xây dựng trên nền HTTP Builder (thư viện tạo HTTP request), cho phép thực hiện gửi request và kiểm tra response. Nói đơn giản là một thư viện được xây dựng sẵn để việc thực hiện kiểm thử API trở nên dễ dàng hơn. Thực tế, có rất nhiều thư viện mà chúng ta có thể dùng, nhưng kinh nghiệm cho thấy, Rest Assured dễ dùng hơn hết, nhiều chức năng hơn, và đặc biệt là nó có một cộng đồng hỗ trợ rất lớn.
REST API testing với REST Assured
Lý thuyết nhiều rồi, chúng ta sẽ thực hiện thực hiện api testing qua ví dụ thực tế sau 😀
Dự án A được đảm nhận xây dựng một hệ thống tìm kiếm video cho khách hàng JP, ngoài việc xây dựng 1 website tìm kiếm thì khách hàng còn mong muốn public API của hệ thống ra ngoài. Vậy là tester trong dự án lại phải đảm nhận vai trò test các api endpoint mà hệ thống sẽ public.
Đề bài đặt ra cho tester như sau:
Test case 1: Search video với từ khoá cho trước, giới hạn số video trả về là 4 videos.Từ khoá: API TestingParameter:{tukhoa}: Từ khoá của video mong muốn search{soluongvideo}: Số lượng video mong muốn trả về, trong test case mong muốn là 4URL Endpoint: http://api.5min.com/search/{tukhoa}/videos.json?num_of_videos={soluongvideo}Kết quả mong muốn: Trả về kết quả dưới dạng JSON, trong đó có link dẫn đến các videos, tiêu đề và mô tả của các video đóĐiều kiện để test case pass:Trong kết quả trả về phải có HTTP Status CodeKết quả trả về phải chứa từ khoá tìm kiếmChỉ có tối đa 4 videos được trả vềCác video trả về không trùng lặp nhauTest case 2: Search video với id của video, nhưng lần này sẽ trả về thông tin chi tiết của video đó và các video liên quan đến video đó (kiểu như suggestion video ở youtube vậy), cũng giới hạn số lượng các video liên quan trả về là 4Parameter:{ video_id }: Từ khoá của video mong muốn search{soluongvideo}: Số lượng video mong muốn trả về, trong test case mong muốn là 4URL Endpoint: http://api.5min.com/video/list/info.json?video_ids={video_id}&num_related_return={soluongvideo}Kết quả mong muốn: Trả về kết quả dưới dạng JSON, trong đó có thông tin chi tiết về video đó và các video liên quanĐiều kiện để test case pass:Trong kết quả trả về phải có HTTP Status CodeKết quả trả về phải liên quan tới video được tìm kiếmChỉ có tối đa 4 videos được trả vềCác video liên quan được trả về không trùng lặp nhau
Vậy, giải pháp của anh tester là gì? Hãy cùng mình sang phần tiếp theo nhé
REST API testing với REST Assured – (cont.)
Để giải quyết bài toán đưa ra ở trên, tester phải xây dựng 1 framework và tích hợp Rest Assured làm thư viện để testing API. Framework tester xây dựng cũng phải đáp ứng tiêu chí Re-usability để có thể test cho các api endpoint khác mà không phải mất công viết lại code.
Xem thêm: Ki Là Gì – Nghĩa Của Từ Ki
Bây giờ chúng ta bắt đầu !!
1. Xây dựng Project structure.
Đầu tiên, chúng ta sẽ khởi tạo 1 Maven project, và setup các thư mục như bên dưới:
Utils folder sẽ chứa 2 class là HelperMethods và RestUtilHelperMethods: Class này sẽ gồm các helpers có thể reusalbeRestUtil: class này sẽ bao gồm các methods liên quan đến thư viện Rest AssuredTrong thư mục ApiTests sẽ có 2 class là Example1Test và Example2Test, đây là 2 classes chứa các test cases và các assertionsTrong thư mục TestSuite sẽ có class AllApiTest, đây là class Test Runner của chúng ta, class này sẽ đảm nhận việc run tất cả các test cases
2. Cài đặt các dependencies
Chúng ta sẽ add cái dependencies sau vào pom.xml.Junit Library: Cái này là test frameworkHamcrest library: thư viện dành cho các method assertionJayway Rest Assured: Đây là Rest assured, thư viện mà chúng ta nhắc đến nãy giờ trong bài viết :DCấu trúc file pom.xml của chúng ta sẽ như bên dưới:
4.0.0 com.5min.apitest 5min-apitest 1.0-SNAPSHOT org.hamcrest hamcrest-all 1.3 org.hamcrest hamcrest-junit 2.0.0.0 junit junit 4.12 com.jayway.restassured json-schema-validator 2.8.0 com.jayway.restassured rest-assured 2.8.0 AllApiTests true org.apache.maven.plugins maven-surefire-plugin 2.19.1 **/AllApiTest.class 3. Sau khi add xong các dependencies thì chúng ta sẽ bắt tay vào code
RestUtil.java
Đây là class giúp chúng ta viết các common methods để giúp chúng ta tiện sử dụng sau này
package Utils;import com.jayway.restassured.RestAssured;import com.jayway.restassured.http.ContentType;import com.jayway.restassured.path.json.JsonPath;import com.jayway.restassured.response.Response;import static com.jayway.restassured.RestAssured.*;public class RestUtil { //Global Setup Variables public static String path; //Rest request path /* ***Sets Base URI*** Before starting the test, we should set the RestAssured.baseURI */ public static void setBaseURI (String baseURI){ RestAssured.baseURI = baseURI; } /* ***Sets base path*** Before starting the test, we should set the RestAssured.basePath */ public static void setBasePath(String basePathTerm){ RestAssured.basePath = basePathTerm; } /* ***Reset Base URI (after test)*** After the test, we should reset the RestAssured.baseURI */ public static void resetBaseURI (){ RestAssured.baseURI = null; } /* ***Reset base path (after test)*** After the test, we should reset the RestAssured.basePath */ public static void resetBasePath(){ RestAssured.basePath = null; } /* ***Sets ContentType*** We should set content type as JSON or XML before starting the test */ public static void setContentType (ContentType Type){ given().contentType(Type); } /* ***search query path of first example*** It is equal to “barack obama/videos.json?num_of_videos=4” */ public static void createSearchQueryPath(String searchTerm, String jsonPathTerm, String param, String paramValue) { path = searchTerm + “/” + jsonPathTerm + “?” + param + “=” + paramValue; } /* ***Returns response*** We send “path” as a parameter to the Rest Assured”a “get” method and “get” method returns response of API */ public static Response getResponse() { //System.out.print(“path: ” + path +”n”); return get(path); } /* ***Returns JsonPath object*** * First convert the API”s response to String type with “asString()” method. * Then, send this String formatted json response to the JsonPath class and return the JsonPath */ public static JsonPath getJsonPath (Response res) { String json = res.asString(); //System.out.print(“returned json: ” + json +”n”); return new JsonPath(json); }}HelperMethods.javaĐây cũng là một class chứa các common functions để chúng ta có thể sử dụng lại trong 2 classes Example1Test và Example2Test
package Utils;import com.jayway.restassured.path.json.JsonPath;import com.jayway.restassured.response.Response;import java.util.*;import static org.junit.Assert.assertEquals;public class HelperMethods { /* Verify the http response status returned. Check Status Code is 200? We can use Rest Assured library”s response”s getStatusCode method */ public static void checkStatusIs200 (Response res) { assertEquals(“Status Check Failed!”, 200, res.getStatusCode()); } /* Get Video Ids (For example 1) We can use get method of Rest Assured library”s JsonPath Class”s get method Part of a response is shown below: “items”: “jp.get(“items.id”);” this will return all id”s under “items” tag. */ public static ArrayList getVideoIdList (JsonPath jp) { ArrayList videoIdList = jp.get(“items.id”); return videoIdList; } /* Get Related Video Ids (For example 2) Structure of response is shown below: items: “related”: > I have to convert above result in this format: In order to split first element of “relatedVideosList” and assign it to a new ArrayList (as splittedRelatedVideoList) I did below operation. */ ArrayList splittedRelatedVideoList = (ArrayList) relatedVideoList.get(0); return splittedRelatedVideoList; } //Merge videoIdList and relatedVideoIdList as mergedVideoList public static ArrayList mergeLists (ArrayList videoList, ArrayList relatedVideoList){ ArrayList mergedVideoList = new ArrayList(videoList); mergedVideoList.addAll(relatedVideoList); return mergedVideoList; } //Find Duplicate Videos public static boolean findDuplicateVideos (List videoIdList) { for (int i=0; i 1){ System.out.println(“This video id is duplicated: ” + videoIdList.get(i)); return false; } } return true; }}Example1Test.java – Example2Test.javaĐây là 2 class quan trọng nhất, classes này chứa các assertions để kiểm thử các kết quả trả về từ api
Example1Test.java
package ApiTests; import Utils.*;import com.jayway.restassured.http.ContentType;import com.jayway.restassured.path.json.JsonPath;import com.jayway.restassured.response.Response;import org.junit.*;import org.junit.runners.MethodSorters;import static org.junit.Assert.assertTrue;
Chuyên mục: Hỏi Đáp