Hướng dẫn đảm bảo REST để kiểm tra tự động hóa API (Ví dụ)

Yên tâm là gì?

Phần còn lại được đảm bảo cho phép bạn kiểm tra REST API bằng thư viện java và tích hợp tốt với Maven. Nó có các kỹ thuật khớp lệnh rất hiệu quả, do đó việc khẳng định kết quả mong đợi của bạn cũng khá đơn giản. Rest Assured có các phương pháp để lấy dữ liệu từ hầu hết mọi phần của yêu cầu và phản hồi bất kể cấu trúc JSON phức tạp như thế nào.

Đối với cộng đồng thử nghiệm, Kiểm thử tự động API vẫn còn mới và hẹp. Sự phức tạp của JSON khiến việc kiểm thử API chưa được khám phá. Nhưng điều đó không làm cho nó kém quan trọng hơn trong quá trình thử nghiệm. Khung Rest Assured.io đã làm cho nó trở nên rất đơn giản bằng cách sử dụng các kiến ​​thức cơ bản về java cốt lõi, khiến nó trở thành một điều rất đáng học.

Tại sao cần Rest-Assured?

Hãy tưởng tượng bạn mở chế độ xem bản đồ google và tìm một địa điểm bạn muốn đến, bạn sẽ thấy ngay các nhà hàng gần đó, bạn thấy các tùy chọn về đường đi làm; từ một số nhà cung cấp dịch vụ du lịch hàng đầu và thấy rất nhiều lựa chọn trong tầm tay bạn. Chúng ta đều biết chúng không phải là sản phẩm của Google, vậy Google làm cách nào để hiển thị nó. Họ sử dụng các API được hiển thị của các nhà cung cấp này. Bây giờ, nếu bạn được yêu cầu thử nghiệm loại thiết lập này, ngay cả trước khi giao diện người dùng được xây dựng hoặc đang được phát triển, thì việc thử nghiệm API sẽ trở nên cực kỳ quan trọng và việc thử nghiệm chúng nhiều lần, với các kết hợp dữ liệu khác nhau khiến đây trở thành trường hợp rất phù hợp cho tự động hóa.

Trước đó, chúng tôi đã sử dụng các ngôn ngữ động như Groovy, Ruby để đạt được điều này và điều đó thật khó khăn. Do đó, thử nghiệm API không được khám phá bằng thử nghiệm chức năng.

Nhưng việc sử dụng Rest Assured, thử nghiệm tự động hóa các API, gửi các yêu cầu https đơn giản với các tùy chỉnh thân thiện với người dùng sẽ rất đơn giản nếu một người có nền tảng cơ bản về java. Cần phải hiểu kiểm tra API và kiểm tra tích hợp, nhưng đăng rằng tự động hóa Rest Assured mang lại sự tin cậy rất tốt cho phần phụ trợ trong khi kiểm tra giao diện người dùng chỉ có thể tập trung vào giao diện người dùng và các hoạt động phía máy khách. Rest Assured là một nguồn mở có nhiều phương thức và thư viện bổ sung được thêm vào đã khiến nó trở thành lựa chọn tuyệt vời cho việc tự động hóa API.

Cách thiết lập Rest Assured.io với Eclipse

Bước 1) Cài đặt Java. Tham khảo cái này hướng dẫn

Bước 2) Tải xuống IDE để bắt đầu: nhật thực

Bước 3) Cài đặt Maven và thiết lập eclipse của bạn. Tham khảo đây.

Thiết lập yên tâm

  1. Tạo Dự án Maven trong IDE của bạn. Chúng tôi đang sử dụng Intellij, nhưng bạn sẽ có cấu trúc tương tự trên bất kỳ IDE nào bạn có thể đang sử dụng.
  2. Mở POM.xml của bạn
Cấu trúc dự án
Cấu trúc dự án

Dành cho Rest Assured.io: Dành cho Java phiên bản < 9 người dùng:

Thêm phần phụ thuộc bên dưới vào POM.xml của bạn:

<dependency>
<groupId>io.rest-assured</groupId>
<artifactId>json-path</artifactId>
<version>4.2.0</version>
<scope>test</scope>
</dependency>


<dependency>
<groupId>io.rest-assured</groupId>
<artifactId>xml-path</artifactId>
<version>4.2.0</version>
<scope>test</scope>
</dependency>


<dependency>
<groupId>io.rest-assured</groupId>
<artifactId>json-schema-validator</artifactId>
<version>4.2.0</version>
<scope>test</scope>
</dependency>

Dành cho Rest Assured.io : Dành cho Java người dùng phiên bản 9+:

<dependency>
<groupId>io.rest-assured</groupId>
<artifactId>rest-assured-all</artifactId>
<version>4.2.0</version>
<scope>test</scope>
</dependency>

Xử lý Sự cố:

Trong trường hợp bạn thấy lỗi và không chắc liệu các phần phụ thuộc có được tải xuống tốt hay không,

  1. Thực hiện xây dựng maven để nhập tất cả các phần phụ thuộc, một lần nữa bạn sẽ tìm thấy trợ giúp về việc thiết lập Maven trên guru99.
  2. Tuy nhiên, bạn vẫn thấy lỗi, sau đó thực hiện dọn dẹp maven, sau đó cài đặt maven và nó sẽ được xây dựng mà không có bất kỳ lỗi nào.
  3. Bạn có thể thêm các dòng dưới đây vào lớp java của mình và thấy không có lỗi biên dịch nào.
import io.restassured.RestAssured.*;
import io.restassured.matcher.RestAssuredMatchers.*;
import org.hamcrest.Matchers.*;

Tập lệnh Rest Assured đơn giản đầu tiên

Cú pháp:

Cú pháp của Rest Assured.io là phần hay nhất, vì nó rất giống BDD và dễ hiểu.

Given(). 
        param("x", "y"). 
        header("z", "w").
when().
Method().
Then(). 
        statusCode(XXX).
        body("x, ”y", equalTo("z"));

Giải thích:

Giải thích
Được cho() Từ khóa 'Cho trước', cho phép bạn đặt nền, tại đây, bạn chuyển tiêu đề yêu cầu, thông số truy vấn và đường dẫn, nội dung, cookie. Đây là tùy chọn nếu những mục này không cần thiết trong yêu cầu
Khi() Từ khóa 'khi' đánh dấu tiền đề cho kịch bản của bạn. Ví dụ: 'khi' bạn nhận/đăng/đặt thứ gì đó, hãy làm việc khác.
Phương pháp() Thay thế điều này bằng bất kỳ thao tác CRUD nào (get/post/put/delete)
Sau đó() Các điều kiện xác nhận và so khớp của bạn sẽ xuất hiện ở đây

Bây giờ bạn đã thiết lập và một số thông tin cơ bản về cú pháp, hãy tạo bài kiểm tra đơn giản đầu tiên của chúng ta. Sẽ không sao nếu cho đến nay cấu trúc này có vẻ mới đối với bạn, khi bạn viết mã diễn giải sâu hơn từng dòng, bạn sẽ hiểu rõ về nó.

Bạn sẽ lấy gì?

Mở trình duyệt của bạn và nhấn – https://demo.guru99.com/V4/sinkministatement.php?CUSTOMER_ID=68195&PASSWORD=1234!&Account_No=1. Đảm bảo bạn nhìn thấy một cái gì đó như dưới đây.

Kịch bản yên tâm nghỉ ngơi

Trong trường hợp bạn gặp lỗi trên trình duyệt khi cố gắng nhận phản hồi cho yêu cầu,

  1. Xem bạn đã sử dụng Https hay Http chưa. Trình duyệt của bạn có thể có cài đặt để không mở các trang web không an toàn.
  2. Xem liệu bạn có proxy hoặc tường lửa nào chặn trình duyệt của bạn mở trang web hay không.

*Chú thích – bạn không sử dụng bất kỳ tiêu đề nào ở đây, không có nội dung và không có cookie. Đó là một URL và bạn cũng đang nhận nội dung từ API chứ không đăng hoặc cập nhật bất kỳ nội dung hiện có nào, vì vậy, đó là lệnh gọi GET. Hãy nhớ điều này để hiểu bài kiểm tra đầu tiên của chúng tôi tốt hơn.

Mục tiêu bài kiểm tra của bạn:

Mục tiêu của tập lệnh là in kết quả đầu ra trên bảng điều khiển IDE giống như kết quả bạn nhận được trên trình duyệt thông qua Rest Assured.

Hãy để chúng tôi mã hóa điều này với các bước dưới đây:

Nhận phản hồi nội dung

Bước 1) Tạo một lớp có tên là “myFirstRestAssuredClass”

Bước 2) Tạo một phương thức gọi là “getResponseBody”

Bước 3) Tương tự như cấu trúc đã học trước đó, khi nào và sau đó, hãy nhập mã bên dưới

được cho(). -> Không cần tiêu đề, không cần truy vấn hoặc thông số đường dẫn.

khi(). -> Không thiết lập điều kiện cụ thể

lấy('https://demo.guru99.com/V4/sinkministatement.php?CUSTOMER_ID=68195&PASSWORD=1234!&Account_No=1'). -> chỉ cần cung cấp url

sau đó(). -> Không cần xác nhận cụ thể

nhật ký(). all() -> Sau khi tất cả phản hồi được tìm nạp, phản hồi nhật ký, tiêu đề, về cơ bản là mọi thứ mà yêu cầu trả về cho bạn.

public static void getResponseBody(){
   given().when().get("https://demo.guru99.com/V4/sinkministatement.php?CUSTOMER_ID=68195&PASSWORD=1234!&Account_No=1").then().log()
  .all();
 
}

Bây giờ hãy lưu ý rằng URL được sử dụng dài và khó đọc hơn, nếu nhìn kỹ, bạn sẽ nhận thấy rằng 3 tham số truy vấn đang được sử dụng là

  1. ID khách hàng
  2. Mật khẩu
  3. Tài khoản_Không

Rest Assured, giúp chúng tôi chuyển từng phần (truy vấn, đường dẫn, thông số tiêu đề) một cách riêng biệt, giúp mã dễ đọc hơn và dễ bảo trì hơn. Ngoài ra, chúng tôi có thể tham số hóa dữ liệu từ tệp bên ngoài theo yêu cầu.

Để sử dụng tham số truy vấn, chúng ta quay lại định nghĩa cú pháp của mình và thấy rằng tất cả chúng đều được truyền như một phần của cú pháp đã cho.

public static void getResponseBody(){
 
   given().queryParam("CUSTOMER_ID","68195")
           .queryParam("PASSWORD","1234!")
           .queryParam("Account_No","1")
           .when().get("https://demo.guru99.com/V4/sinkministatement.php").then().log()
           .body();
}

**Lưu ý rằng chúng tôi sử dụng “nội dung” thay vì “tất cả”; điều này giúp chúng tôi chỉ trích xuất nội dung của phản hồi.

Đầu ra:

Lấy mã trạng thái phản hồi

Phương pháp tiếp theo mà chúng tôi viết kịch bản sẽ là lấy mã trạng thái và cũng đưa ra một xác nhận để xác thực tương tự.

Bước 1) Tạo một phương thức gọi là getResponseStatus()

Bước 2) Sử dụng cấu trúc yêu cầu tương tự được sử dụng ở trên. Sao chép và dán nó.

Bước 3) Thay vì ghi nhật ký, chúng tôi sử dụng phương thức sẵn có 'getStatusCode' của Rest Assured để tìm nạp giá trị mã trạng thái

Bước 4) Để khẳng định rằng mã trạng thái của bạn là 200, chúng tôi sử dụng từ khóa – khẳng địnhThat().statusCode(expectedCode)

**Lưu ý – URL là một biến được sử dụng để đơn giản hóa. URL chứa toàn bộ URL yêu cầu API

public static void getResponseStatus(){
   int statusCode= given().queryParam("CUSTOMER_ID","68195")
           .queryParam("PASSWORD","1234!")
           .queryParam("Account_No","1") .when().get("https://demo.guru99.com/V4/sinkministatement.php").getStatusCode();
   System.out.println("The response status is "+statusCode);

   given().when().get(url).then().assertThat().statusCode(200);
}

Đầu ra:

Nhu cầu kinh doanh

Một trong những quy tắc cơ bản của tự động hóa là chúng ta phải đặt các điểm kiểm tra để quá trình kiểm tra chỉ tiến hành nếu đáp ứng tất cả các điều kiện bắt buộc. Trong thử nghiệm API, xác thực cơ bản nhất là kiểm tra xem mã trạng thái của yêu cầu có ở định dạng 2XX hay không.

Mã hoàn chỉnh, cho đến nay:

import java.util.ArrayList;
import static io.restassured.RestAssured.*;
import static java.util.concurrent.TimeUnit.MILLISECONDS;

public class myFirstRestAssuredClass {

   final static String url="https://demo.guru99.com/V4/sinkministatement.php?CUSTOMER_ID=68195&PASSWORD=1234!&Account_No=1";

   public static void main(String args[]) {

     getResponseBody();
     getResponseStatus();

; }

   //This will fetch the response body as is and log it. given and when are optional here
   public static void getResponseBody(){
       given().when().get(url).then().log()
      .all();

  given().queryParam("CUSTOMER_ID","68195")
               .queryParam("PASSWORD","1234!")
               .queryParam("Account_No","1") .when().get("https://demo.guru99.com/V4/sinkministatement.php").then().log().body();
   }

public static void getResponseStatus(){
   int statusCode= given().queryParam("CUSTOMER_ID","68195")
           .queryParam("PASSWORD","1234!")
           .queryParam("Account_No","1")
           .when().get("https://demo.guru99.com/V4/sinkministatement.php").getStatusCode();
   System.out.println("The response status is "+statusCode);

   given().when().get(url).then().assertThat().statusCode(200);
}

}

* Chú ý:

  1. 200 là phản hồi thành công cho kịch bản này. Đôi khi, bạn cũng cần yêu cầu không thành công và khi đó bạn có thể sử dụng 4XX hoặc 5XX. Hãy thử thay đổi mã trạng thái bằng cách cung cấp các tham số không hợp lệ và kiểm tra.
  2. Khi chúng tôi xác nhận một điều kiện, sẽ không có bản in nào trên bảng điều khiển trừ khi có lỗi.

Tập lệnh để tìm nạp các phần khác nhau của phản hồi

Việc tìm nạp nội dung phản hồi và mã trạng thái phản hồi đã được đề cập trong phân đoạn trên. Điều đáng lưu ý là để tìm nạp các phần khác nhau của phản hồi, từ khóa 'trích xuất' là rất quan trọng.

Tiêu đề

Rest Assured là một ngôn ngữ rất đơn giản và việc tìm nạp các tiêu đề cũng đơn giản như vậy. Tên phương thức là headers(). Giống như trước đây, chúng ta sẽ tạo một phương thức độc lập để thực hiện tương tự.

public static void getResponseHeaders(){
   System.out.println("The headers in the response "+
                   get(url).then().extract()
           .headers());
}

Xin lưu ý rằng 'given().when()' bị bỏ qua ở đây và dòng mã bắt đầu từ get(), điều này là do không có điều kiện tiên quyết hoặc xác minh nào được thực hiện ở đây để thực hiện yêu cầu và nhận phản hồi. Trong những trường hợp như vậy, việc sử dụng tương tự là tùy chọn.

Đầu ra:

Nhu cầu kinh doanh:

Khá nhiều lần, bạn sẽ cần sử dụng mã thông báo xác thực hoặc cookie phiên cho yêu cầu tiếp theo và phần lớn các chi tiết này được trả về dưới dạng tiêu đề của phản hồi.

Thời gian đáp ứng

Để có thời gian cần thiết để tìm nạp phản hồi từ hệ thống phụ trợ hoặc các hệ thống hạ nguồn khác, Rest Assured cung cấp một phương thức có tên là 'timeIn' với một timeUnit phù hợp để có được thời gian cần thiết để trả về phản hồi.

public static void getResponseTime(){
  System.out.println("The time taken to fetch the response "+get(url)
         .timeIn(TimeUnit.MILLISECONDS) + " milliseconds");
}

Đầu ra:

Nhu cầu kinh doanh:

Một tính năng rất quan trọng của việc kiểm tra API là thời gian phản hồi của chúng, để đo lường hiệu suất của ứng dụng. Lưu ý rằng thời gian thực hiện cuộc gọi của bạn có thể mất nhiều hoặc ít thời gian hơn tùy thuộc vào tốc độ Internet, hiệu suất của API tại thời điểm đó, tải máy chủ và các yếu tố khác ảnh hưởng đến thời gian.

Loại nội dung

Bạn có thể nhận được loại nội dung của phản hồi được trả về bằng phương thức là “contentType ()”.

public static void getResponseContentType(){
   System.out.println("The content type of response "+
           get(url).then().extract()
              .contentType());
}

Đầu ra

Nhu cầu kinh doanh:

Đôi khi, việc lấy loại nội dung là điều cần thiết để đảm bảo không có lỗ hổng bảo mật đối với bất kỳ mối đe dọa có nguồn gốc chéo nào hoặc chỉ để đảm bảo nội dung được chuyển theo tiêu chuẩn của API.

Tìm nạp phần tử JSON riêng lẻ

Từ phản hồi đã cho, bạn được yêu cầu tính tổng số tiền, bạn cần lấy từng số tiền và tổng hợp lại.

Bước sau:

Bước 1) Trường số lượng nằm trong một mảng có các “câu lệnh” khóa lần lượt nằm trong danh sách có khóa “kết quả”

Bước 2) Rest Assured, cung cấp cơ chế để đạt được các giá trị trong API bằng cách sử dụng “đường dẫn”

Bước 3) Đường dẫn để đạt được số tiền là “result.statements.AMOUNT”. Hãy nghĩ về nó giống như Xpath trong selen.

Bước 4) Tìm nạp tất cả số tiền trong một bộ sưu tập, sau đó lặp lại tất cả các giá trị để tính tổng

public static void getSpecificPartOfResponseBody(){

ArrayList<String> amounts = when().get(url).then().extract().path("result.statements.AMOUNT") ;
int sumOfAll=0;
for(String a:amounts){

    System.out.println("The amount value fetched is "+a);
    sumOfAll=sumOfAll+Integer.valueOf(a);
}
System.out.println("The total amount is "+sumOfAll);

}

Lưu ý: Vì giá trị số tiền thuộc kiểu dữ liệu chuỗi nên chúng tôi chuyển đổi thành số nguyên và sử dụng nó để tính tổng.

Đầu ra:

Tổng kết

  • Rest Assured là một nhóm thư viện java cho phép chúng tôi tự động hóa Kiểm tra API còn lại
  • Yên tâm là Javadựa trên và kiến ​​thức cốt lõi Java đủ để học nó
  • Nó giúp tìm nạp các giá trị yêu cầu và phản hồi từ các cấu trúc JSON phức tạp
  • API yêu cầu có thể được tùy chỉnh với nhiều loại tiêu đề, truy vấn, thông số đường dẫn và bất kỳ phiên hoặc cookie nào sẽ được đặt.
  • Nó giúp thiết lập các câu lệnh và điều kiện khẳng định.
  • Mặc dù Rest Assured rất hữu ích khi phản hồi là loại JSON, nhưng các phương thức của nó có thể không hoạt động liền mạch nếu loại nội dung id HTML hoặc văn bản thuần túy.

Đọc thêm Xem tiếp