บทช่วยสอน REST Assured สำหรับการทดสอบการทำงานอัตโนมัติของ API (ตัวอย่าง)

Rest Assured คืออะไร?

มั่นใจได้ ช่วยให้คุณสามารถทดสอบ REST API โดยใช้ไลบรารี Java และบูรณาการได้ดีกับ Maven มีเทคนิคการจับคู่ที่มีประสิทธิภาพมาก ดังนั้นการยืนยันผลลัพธ์ที่คาดหวังจึงค่อนข้างตรงไปตรงมา Rest Assured มีวิธีการดึงข้อมูลจากเกือบทุกส่วนของคำขอและการตอบสนองไม่ว่าโครงสร้าง JSON จะซับซ้อนเพียงใดก็ตาม

สำหรับชุมชนการทดสอบ การทดสอบอัตโนมัติของ API ถือเป็นเรื่องใหม่และเฉพาะกลุ่ม ความซับซ้อนของ JSON ทำให้การทดสอบ API ไม่ได้รับการสำรวจ แต่ถึงอย่างนั้น การทดสอบอัตโนมัติของ API ก็ยังมีความสำคัญน้อยลงในกระบวนการทดสอบ เฟรมเวิร์ก Rest Assured.io ได้ทำให้มันง่ายมากโดยใช้พื้นฐานของ Java หลัก ทำให้การทดสอบอัตโนมัตินี้เป็นสิ่งที่น่าเรียนรู้มาก

เหตุใดจึงต้องการ Rest-Assured?

ลองนึกภาพคุณเปิดมุมมอง Google Map และค้นหาสถานที่ที่คุณต้องการไป คุณจะเห็นร้านอาหารใกล้เคียงทันที คุณเห็นตัวเลือกสำหรับการเดินทาง จากผู้ให้บริการด้านการเดินทางชั้นนำ และดูตัวเลือกมากมายเพียงปลายนิ้วสัมผัส เราทุกคนรู้ดีว่าไม่ใช่ผลิตภัณฑ์ของ Google แล้ว Google จะแสดงผลิตภัณฑ์ดังกล่าวได้อย่างไร พวกเขาใช้ API ที่เปิดเผยของผู้ให้บริการเหล่านี้ ตอนนี้ หากคุณถูกขอให้ทดสอบการตั้งค่าประเภทนี้ แม้กระทั่งก่อนที่ UI จะถูกสร้างขึ้นหรืออยู่ระหว่างการพัฒนา การทดสอบ API จะมีความสำคัญอย่างยิ่ง และการทดสอบซ้ำๆ ด้วยการผสมผสานข้อมูลที่แตกต่างกันทำให้เป็นกรณีที่เหมาะสมมากสำหรับระบบอัตโนมัติ

ก่อนหน้านี้ เราใช้ภาษาไดนามิก เช่น Groovy, Ruby เพื่อให้บรรลุเป้าหมายนี้ และถือเป็นเรื่องท้าทาย ดังนั้นการทดสอบ API จึงไม่ได้สำรวจโดยการทดสอบการทำงาน

การใช้ Rest Assured การทดสอบอัตโนมัติของ API การส่งคำขอ https ง่ายๆ พร้อมการปรับแต่งที่เป็นมิตรกับผู้ใช้เป็นเรื่องง่ายหากใครก็ตามมีพื้นฐานด้าน Java จำเป็นต้องเข้าใจการทดสอบ API และการทดสอบการรวมระบบ แต่หลังจากนั้น Rest Assured จะให้ความมั่นใจที่ดีมากกับแบ็กเอนด์ ในขณะที่การทดสอบฟรอนต์เอนด์สามารถเน้นที่ UI และการทำงานด้านไคลเอนต์ได้ Rest Assured เป็นโอเพ่นซอร์สที่มีเมธอดและไลบรารีเพิ่มเติมมากมายที่เพิ่มเข้ามา ทำให้เป็นตัวเลือกที่ยอดเยี่ยมสำหรับการทำงานอัตโนมัติของ API

วิธีการตั้งค่า Rest Assured.io ด้วย Eclipse

ขั้นตอนที่ 1) ติดตั้ง Java- อ้างถึงสิ่งนี้ ให้คำแนะนำ

ขั้นตอนที่ 2) ดาวน์โหลด IDE เพื่อเริ่มต้น: คราส

ขั้นตอนที่ 3) ติดตั้ง Maven และตั้งค่า Eclipse ของคุณ อ้างอิง Good Farm Animal Welfare Awards.

ตั้งค่าได้อย่างมั่นใจ

  1. สร้างโปรเจ็กต์ Maven ใน IDE ของคุณ เรากำลังใช้ Intellij แต่คุณจะได้รับโครงสร้างที่คล้ายกันบน IDE ใดๆ ที่คุณอาจใช้อยู่
  2. เปิด POM.xml ของคุณ
โครงสร้างโครงการ
โครงสร้างโครงการ

สำหรับ Rest Assured.io: สำหรับ Java เวอร์ชัน < 9 ผู้ใช้:

เพิ่มการพึ่งพาด้านล่างให้กับ POM.xml ของคุณ:

<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>

สำหรับ Rest Assured.io : สำหรับ Java ผู้ใช้เวอร์ชัน 9+:

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

การแก้ไขปัญหา:

ในกรณีที่คุณเห็นข้อผิดพลาดและไม่แน่ใจว่าดาวน์โหลดการอ้างอิงได้ดีหรือไม่

  1. ดำเนินการสร้าง Maven เพื่อนำเข้าการอ้างอิงทั้งหมด อีกครั้งคุณจะพบความช่วยเหลือเกี่ยวกับการตั้งค่า Maven บน guru99
  2. ถึงกระนั้น คุณเห็นข้อผิดพลาด จากนั้นทำการล้าง maven ตามด้วยการติดตั้ง maven และควรสร้างโดยไม่มีข้อผิดพลาดใดๆ
  3. คุณสามารถเพิ่มบรรทัดด้านล่างในคลาส Java ของคุณและไม่เห็นข้อผิดพลาดในการคอมไพล์
import io.restassured.RestAssured.*;
import io.restassured.matcher.RestAssuredMatchers.*;
import org.hamcrest.Matchers.*;

สคริปต์ Rest Assured ง่ายๆ ตัวแรก

ไวยากรณ์:

ไวยากรณ์ของ Rest Assured.io เป็นส่วนที่สวยงามที่สุด เนื่องจากมีลักษณะเหมือน BDD และเข้าใจได้ง่าย

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

คำอธิบาย:

รหัส คำอธิบาย
ที่ให้ไว้() คำหลัก 'Given' ช่วยให้คุณตั้งค่าพื้นหลัง ที่นี่ คุณสามารถส่งส่วนหัวของคำขอ พารามิเตอร์การสืบค้นและเส้นทาง เนื้อความ คุกกี้ นี่เป็นทางเลือกหากรายการเหล่านี้ไม่จำเป็นในคำขอ
เมื่อไร() คำหลัก 'เมื่อ' ทำเครื่องหมายหลักฐานของสถานการณ์ของคุณ ตัวอย่างเช่น 'เมื่อ' คุณได้รับ/โพสต์/วางบางสิ่ง ให้ทำอย่างอื่น
วิธี() แทนที่ด้วยการดำเนินการ CRUD ใดๆ (รับ/โพสต์/ใส่/ลบ)
แล้ว() เงื่อนไขการยืนยันและการจับคู่ของคุณอยู่ที่นี่

ตอนนี้เมื่อคุณมีการตั้งค่าและพื้นหลังของไวยากรณ์แล้ว เรามาสร้างการทดสอบง่ายๆ ครั้งแรกกัน ไม่เป็นไรหากจนถึงตอนนี้โครงสร้างยังดูใหม่สำหรับคุณ เมื่อคุณโค้ดตีความแต่ละบรรทัดเพิ่มเติม คุณจะเข้าใจโครงสร้างนั้น

คุณจะเอาอะไรมา?

เปิดเบราว์เซอร์ของคุณแล้วกด – https://demo.guru99.com/V4/sinkministatement.php?CUSTOMER_ID=68195&PASSWORD=1234!&Account_No=1- ตรวจสอบให้แน่ใจว่าคุณเห็นบางสิ่งด้านล่าง

มั่นใจสคริปต์

ในกรณีที่คุณได้รับข้อผิดพลาดบนเบราว์เซอร์เมื่อคุณพยายามรับการตอบกลับสำหรับคำขอ

  1. ดูว่าคุณใช้ Https หรือ Http หรือไม่ เบราว์เซอร์ของคุณอาจมีการตั้งค่าไม่ให้เปิดเว็บไซต์ที่ไม่ปลอดภัย
  2. ดูว่าคุณมีพร็อกซีหรือไฟร์วอลล์บล็อกเบราว์เซอร์ของคุณไม่ให้เปิดเว็บไซต์หรือไม่

*หมายเหตุ – คุณไม่ได้ใช้ส่วนหัวใดๆ ที่นี่ ไม่มีเนื้อหา และไม่มีคุกกี้ มันเป็น URL และคุณยังได้รับเนื้อหาจาก API และไม่ได้โพสต์หรืออัปเดตเนื้อหาใดๆ ที่มีอยู่ ดังนั้นจึงทำให้เป็นการเรียก GET จำสิ่งนี้ไว้เพื่อทำความเข้าใจการทดสอบครั้งแรกของเราให้ดีขึ้น

วัตถุประสงค์ของการทดสอบของคุณ:

เป้าหมายของสคริปต์คือการพิมพ์เอาต์พุตเดียวกันบนคอนโซล IDE ของคุณเหมือนกับที่คุณได้รับบนเบราว์เซอร์ผ่าน Rest Assured

ให้เราเขียนโค้ดนี้ตามขั้นตอนด้านล่าง:

ได้รับการตอบสนองของร่างกาย

ขั้นตอน 1) สร้างคลาสชื่อเป็น “myFirstRestAssuredClass”

ขั้นตอน 2) สร้างวิธีการที่เรียกว่า "getResponseBody"

ขั้นตอน 3) คล้ายกับโครงสร้างที่เรียนรู้ก่อนหน้านี้เมื่อใดให้พิมพ์โค้ดด้านล่าง

ที่ให้ไว้(). -> ไม่จำเป็นต้องมีส่วนหัว ไม่มีแบบสอบถามหรือพารามิเตอร์เส้นทาง

เมื่อไร(). -> ไม่มีการตั้งค่าเงื่อนไขเฉพาะ

รับ('https://demo.guru99.com/V4/sinkministatement.php?CUSTOMER_ID=68195&PASSWORD=1234!&Account_No=1- ->ต้องระบุเฉพาะ url เท่านั้น

แล้ว(). -> ไม่จำเป็นต้องมีการยืนยันเฉพาะ

บันทึก(). all() -> เมื่อดึงการตอบสนองทั้งหมดแล้ว ให้บันทึกการตอบกลับ ส่วนหัว โดยพื้นฐานแล้วทุกอย่างที่คำขอส่งคืนถึงคุณ

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();
 
}

ตอนนี้สังเกตว่า URL ที่ใช้ยาวและอ่านยาก หากคุณสังเกตอย่างใกล้ชิด คุณจะสังเกตเห็นว่ามีการใช้พารามิเตอร์แบบสอบถาม 3 ตัว ซึ่งได้แก่

  1. รหัสลูกค้า
  2. รหัสผ่าน
  3. บัญชี_เลขที่

Rest Assured ช่วยให้เราส่งแต่ละส่วน (แบบสอบถาม เส้นทาง พารามิเตอร์ส่วนหัว) แยกกัน ทำให้โค้ดอ่านง่ายขึ้นและดูแลรักษาง่ายขึ้น นอกจากนี้ เรายังสามารถกำหนดค่าพารามิเตอร์ข้อมูลจากไฟล์ภายนอกตามต้องการ

สำหรับการใช้พารามิเตอร์การสืบค้น เราจะกลับไปที่คำจำกัดความของไวยากรณ์และดูว่าทั้งหมดถูกส่งผ่านเป็นส่วนหนึ่งของการกำหนด

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();
}

**โปรดทราบว่าเราใช้ "เนื้อหา" แทน "ทั้งหมด" สิ่งนี้ช่วยให้เราดึงเฉพาะเนื้อหาของการตอบสนองเท่านั้น

Output:

รับรหัสสถานะการตอบกลับ

วิธีต่อไปที่เราเขียนสคริปต์คือการรับรหัสสถานะและใส่การยืนยันเพื่อตรวจสอบสิ่งเดียวกัน

ขั้นตอน 1) สร้างวิธีการที่เรียกว่า getResponseStatus()

ขั้นตอน 2) ใช้โครงสร้างคำขอเดียวกันกับที่ใช้ด้านบน คัดลอกและวาง

ขั้นตอน 3) แทนที่จะบันทึก เราใช้เมธอด inbuilt 'getStatusCode' ของ Rest Assured เพื่อดึงค่ารหัสสถานะ

ขั้นตอน 4) เพื่อยืนยันว่ารหัสสถานะของคุณคือ 200 เราจะใช้คำหลัก – assertThat().statusCode(expectedCode)

**หมายเหตุ – URL เป็นตัวแปรที่ใช้เพื่อความเรียบง่าย URL เก็บ URL คำขอ 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);
}

Output:

ความต้องการทางธุรกิจ

กฎพื้นฐานของระบบอัตโนมัติประการหนึ่งคือเราต้องวางจุดตรวจสอบเพื่อให้การทดสอบดำเนินต่อไปเฉพาะเมื่อตรงตามเงื่อนไขที่จำเป็นทั้งหมดเท่านั้น ในการทดสอบ API การตรวจสอบขั้นพื้นฐานที่สุดคือการตรวจสอบว่ารหัสสถานะของคำขออยู่ในรูปแบบ 2XX หรือไม่

รหัสที่สมบูรณ์จนถึงขณะนี้:

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);
}

}

* หมายเหตุ:

  1. 200 คือการตอบสนองที่ประสบความสำเร็จสำหรับสถานการณ์นี้ ในบางครั้ง คุณต้องการคำขอให้ล้มเหลวเช่นกัน จากนั้นคุณอาจใช้ 4XX หรือ 5XX พยายามเปลี่ยนรหัสสถานะโดยระบุพารามิเตอร์ที่ไม่ถูกต้องและตรวจสอบ
  2. เมื่อเรายืนยันเงื่อนไข จะไม่มีการพิมพ์บนคอนโซลเว้นแต่จะมีข้อผิดพลาด

สคริปต์เพื่อดึงส่วนต่างๆ ของการตอบกลับ

การดึงเนื้อหาการตอบกลับและรหัสสถานะการตอบกลับครอบคลุมอยู่ในส่วนด้านบนแล้ว เป็นที่น่าสังเกตว่าในการดึงส่วนต่างๆ ของการตอบสนอง คำหลัก 'extract' มีความสำคัญมาก

ส่วนหัว

Rest Assured เป็นภาษาที่ตรงไปตรงมา และการดึงข้อมูลส่วนหัวก็ทำได้ง่ายเช่นกัน ชื่อวิธีการคือ headers() เช่นเดียวกับเมื่อก่อน เราจะสร้างวิธีการแบบสแตนด์อโลนเพื่อทำเช่นเดียวกัน

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

โปรดทราบว่าการข้าม 'given().when()' ที่นี่ และบรรทัดโค้ดเริ่มต้นจาก get() เนื่องจากไม่มีเงื่อนไขเบื้องต้นหรือการตรวจสอบยืนยันที่นี่เพื่อส่งคำขอและรับการตอบกลับ ในกรณีเช่นนี้ คุณสามารถเลือกใช้แบบเดียวกันได้

Output:

ความต้องการทางธุรกิจ:

หลายครั้งที่คุณจำเป็นต้องใช้โทเค็นการอนุญาตหรือคุกกี้เซสชันสำหรับการร้องขอครั้งต่อไป และส่วนใหญ่ รายละเอียดเหล่านี้จะถูกส่งกลับมาเป็นส่วนหัวของการตอบกลับ

เวลาตอบสนอง

เพื่อให้ได้เวลาที่จำเป็นในการดึงการตอบสนองจากแบ็กเอนด์หรือระบบดาวน์สตรีมอื่นๆ Rest Assured จัดเตรียมวิธีการที่เรียกว่า 'timeIn' พร้อมด้วย timeUnit ที่เหมาะสมเพื่อรับเวลาที่ใช้ในการส่งคืนการตอบกลับ

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

Output:

ความต้องการทางธุรกิจ:

คุณลักษณะที่สำคัญมากของการทดสอบ API คือเวลาตอบสนองเพื่อวัดประสิทธิภาพของแอปพลิเคชัน โปรดทราบว่าเวลาที่ใช้สำหรับการโทรของคุณอาจใช้เวลามากหรือน้อยขึ้นอยู่กับความเร็วอินเทอร์เน็ตของคุณ ประสิทธิภาพของ API ในขณะนั้น โหลดของเซิร์ฟเวอร์ และปัจจัยอื่น ๆ ที่ส่งผลต่อเวลา

ชนิดของเนื้อหา

คุณสามารถรับประเภทเนื้อหาของการตอบกลับที่ส่งคืนโดยใช้วิธีการคือ "contentType ()"

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

เอาท์พุต

ความต้องการทางธุรกิจ:

ในบางครั้ง การได้รับประเภทเนื้อหาถือเป็นสิ่งสำคัญเพื่อให้แน่ใจว่าไม่มีช่องว่างด้านความปลอดภัยสำหรับภัยคุกคามข้ามต้นทาง หรือเพียงเพื่อให้แน่ใจว่าเนื้อหาที่ส่งผ่านนั้นเป็นไปตามมาตรฐานของ API

ดึงข้อมูลองค์ประกอบ JSON แต่ละรายการ

จากคำตอบที่ให้มา คุณจะถูกขอให้คำนวณจำนวนเงินทั้งหมด คุณต้องดึงทุกจำนวนเงินและสรุปออกมา

ขั้นตอน:

ขั้นตอน 1) ฟิลด์จำนวนเงินอยู่ภายในอาร์เรย์ที่มีคีย์ “คำสั่ง” ซึ่งจะอยู่ในรายการที่มีคีย์ “ผลลัพธ์”

ขั้นตอน 2) มั่นใจได้ มีกลไกในการเข้าถึงค่าใน API โดยใช้ "เส้นทาง"

ขั้นตอน 3) เส้นทางในการเข้าถึงจำนวนเงินคือ “result.statements.AMOUNT” ลองนึกถึง Xpath ในเซเลเนียมดูสิ

ขั้นตอน 4) ดึงข้อมูลจำนวนเงินทั้งหมดในคอลเลกชัน จากนั้นวนซ้ำค่าทั้งหมดเพื่อคำนวณผลรวม

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);

}

หมายเหตุ: เนื่องจากค่าจำนวนอยู่ในประเภทข้อมูลสตริง เราจึงแปลงเป็นจำนวนเต็มและใช้สำหรับการรวม

Output:

สรุป

  • Rest Assured คือกลุ่มของไลบรารี Java ซึ่งช่วยให้เราสามารถทำงานอัตโนมัติได้ การทดสอบ API ที่เหลือ
  • มั่นใจได้เลยว่า Java- พื้นฐานและความรู้หลัก Java ก็เพียงพอแล้วสำหรับการเรียนรู้มัน
  • ช่วยดึงค่าคำขอและการตอบสนองจากโครงสร้าง JSON ที่ซับซ้อน
  • เค้ก API คำขอสามารถปรับแต่งได้ด้วยส่วนหัว การสืบค้น พารามิเตอร์เส้นทาง และเซสชันหรือคุกกี้ต่างๆ ที่จะตั้งค่า
  • ช่วยกำหนดคำยืนยันและเงื่อนไข
  • แม้ว่า Rest Assured จะมีประโยชน์มากเมื่อการตอบกลับเป็นประเภท JSON แต่วิธีการดังกล่าวอาจไม่ทำงานได้อย่างราบรื่นหากประเภทเนื้อหา id HTML หรือข้อความธรรมดา