บทช่วยสอน 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.
ตั้งค่าได้อย่างมั่นใจ
- สร้างโปรเจ็กต์ Maven ใน IDE ของคุณ เรากำลังใช้ Intellij แต่คุณจะได้รับโครงสร้างที่คล้ายกันบน IDE ใดๆ ที่คุณอาจใช้อยู่
- เปิด 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>
การแก้ไขปัญหา:
ในกรณีที่คุณเห็นข้อผิดพลาดและไม่แน่ใจว่าดาวน์โหลดการอ้างอิงได้ดีหรือไม่
- ดำเนินการสร้าง Maven เพื่อนำเข้าการอ้างอิงทั้งหมด อีกครั้งคุณจะพบความช่วยเหลือเกี่ยวกับการตั้งค่า Maven บน guru99
- ถึงกระนั้น คุณเห็นข้อผิดพลาด จากนั้นทำการล้าง maven ตามด้วยการติดตั้ง maven และควรสร้างโดยไม่มีข้อผิดพลาดใดๆ
- คุณสามารถเพิ่มบรรทัดด้านล่างในคลาส 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
- ตรวจสอบให้แน่ใจว่าคุณเห็นบางสิ่งด้านล่าง
ในกรณีที่คุณได้รับข้อผิดพลาดบนเบราว์เซอร์เมื่อคุณพยายามรับการตอบกลับสำหรับคำขอ
- ดูว่าคุณใช้ Https หรือ Http หรือไม่ เบราว์เซอร์ของคุณอาจมีการตั้งค่าไม่ให้เปิดเว็บไซต์ที่ไม่ปลอดภัย
- ดูว่าคุณมีพร็อกซีหรือไฟร์วอลล์บล็อกเบราว์เซอร์ของคุณไม่ให้เปิดเว็บไซต์หรือไม่
*หมายเหตุ – คุณไม่ได้ใช้ส่วนหัวใดๆ ที่นี่ ไม่มีเนื้อหา และไม่มีคุกกี้ มันเป็น 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 ตัว ซึ่งได้แก่
- รหัสลูกค้า
- รหัสผ่าน
- บัญชี_เลขที่
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); } }
* หมายเหตุ:
- 200 คือการตอบสนองที่ประสบความสำเร็จสำหรับสถานการณ์นี้ ในบางครั้ง คุณต้องการคำขอให้ล้มเหลวเช่นกัน จากนั้นคุณอาจใช้ 4XX หรือ 5XX พยายามเปลี่ยนรหัสสถานะโดยระบุพารามิเตอร์ที่ไม่ถูกต้องและตรวจสอบ
- เมื่อเรายืนยันเงื่อนไข จะไม่มีการพิมพ์บนคอนโซลเว้นแต่จะมีข้อผิดพลาด
สคริปต์เพื่อดึงส่วนต่างๆ ของการตอบกลับ
การดึงเนื้อหาการตอบกลับและรหัสสถานะการตอบกลับครอบคลุมอยู่ในส่วนด้านบนแล้ว เป็นที่น่าสังเกตว่าในการดึงส่วนต่างๆ ของการตอบสนอง คำหลัก '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 หรือข้อความธรรมดา