برنامج تعليمي لاختبار واجهات برمجة التطبيقات REST Assured
⚡ ملخص ذكي
تُرسّخ شركة REST Assured مكانتها كشركة Javaمكتبة مفتوحة المصدر قائمة على [اسم المكتبة] تُبسّط عملية اختبار أتمتة واجهات برمجة تطبيقات REST. يُمكّن هذا الإطار مهندسي الجودة من التحقق من صحة استجابات JSON المعقدة، والعناوين، ورموز الحالة، وأوقات الاستجابة باستخدام بنية BDD نظيفة مع تكامل سلس مع Maven.

ما هو الاطمئنان؟
اطمئن، لا تشغل بالك يتيح لك اختبار واجهات برمجة التطبيقات REST باستخدام مكتبات Java ويتكامل جيدًا مع Maven. يحتوي على تقنيات مطابقة فعالة للغاية، لذا فإن تأكيد النتائج المتوقعة أمر سهل للغاية أيضًا. يحتوي Rest Assured على طرق لجلب البيانات من كل جزء تقريبًا من الطلب والاستجابة بغض النظر عن مدى تعقيد هياكل JSON.
بالنسبة لمجتمع الاختبار، لا يزال اختبار أتمتة واجهة برمجة التطبيقات جديدًا ومميزًا. إن تعقيدات JSON تجعل اختبار واجهة برمجة التطبيقات غير مستكشف. لكن هذا لا يجعله أقل أهمية في عملية الاختبار. لقد جعل إطار عمل Rest Assured.io الأمر بسيطًا للغاية باستخدام أساسيات Java الأساسية، مما يجعله أمرًا مرغوبًا للغاية للتعلم.
لماذا نحتاج إلى Rest-Assured؟
تخيل أنك تفتح Google استعرض الخرائط وابحث عن المكان الذي ترغب في الذهاب إليه. ستظهر لك فورًا المطاعم القريبة، وخيارات المواصلات من كبرى شركات السفر، والعديد من الخيارات الأخرى المتاحة لك. نعلم جميعًا أن هذه ليست Google المنتجات، فكيف إذن Google هل يمكنك عرضها؟ يستخدم هذا النظام واجهات برمجة التطبيقات (APIs) المتاحة لهؤلاء المزودين. الآن، إذا طُلب منك اختبار هذا النوع من الإعدادات، حتى قبل بناء واجهة المستخدم أو أثناء تطويرها، يصبح اختبار واجهات برمجة التطبيقات في غاية الأهمية. اختبارها بشكل متكرر باستخدام مجموعات بيانات مختلفة يجعلها حالة مثالية للأتمتة.
في السابق، كانت الفرق تستخدم لغات ديناميكية مثل Groovy وقد استُخدمت لغة روبي لتحقيق ذلك، وكان الأمر صعباً. لذا لم يستكشف مختبرو الوظائف اختبار واجهات برمجة التطبيقات على نطاق واسع.
مع ذلك، باستخدام Rest Assured، يصبح اختبار واجهات برمجة التطبيقات (APIs) الآلي وإرسال طلبات HTTPS بسيطة مع تخصيصات سهلة الاستخدام أمرًا بسيطًا إذا كان لدى الشخص خلفية أساسية في Javaيُعدّ Rest Assured مفيدًا لفهم اختبار واجهات برمجة التطبيقات (API) واختبار التكامل. فهو يمنح ثقةً عاليةً في أداء الواجهة الخلفية، بينما يُمكّن مختبري الواجهة الأمامية من التركيز على واجهة المستخدم وعمليات جانب العميل. Rest Assured مفتوح المصدر، وقد جعلته الإضافات المستمرة من الطرق والمكتبات خيارًا ممتازًا لأتمتة واجهات برمجة التطبيقات.
راحة البال مقابل Postman: الاختلافات الرئيسية
كل من ريست أشورد و Postman تُستخدم أدوات التحقق من صحة واجهات برمجة تطبيقات REST، إلا أن كل أداة منها تُناسب مرحلة مختلفة من دورة حياة الاختبار. ويعتمد اختيار الأداة المناسبة على مهارات فريقك ونطاق المشروع واحتياجات التكامل.
| البعد | اطمئن، لا تشغل بالك | Postman |
|---|---|---|
| النوع | Java مكتبة لأتمتة البرمجيات | عميل واجهة برمجة تطبيقات قائم على واجهة المستخدم الرسومية مع دعم البرمجة النصية |
| أفضل حالة استخدام | خطوط التكامل المستمر ومجموعات اختبار الانحدار | الاستكشاف اليدوي والتحقق السريع من واجهة برمجة التطبيقات |
| متطلبات المهارة | جوهر Java المعرفة المطلوبة | الحد الأدنى من البرمجة؛ يستخدم Javaمقتطفات من البرامج النصية |
| التقارير | يتكامل مع TestNG, JUnitو Allure | ملخصات التشغيل المدمجة عبر واجهة سطر الأوامر نيومان |
تستخدم العديد من الفرق Postman للنموذج الأولي المبكرping ثم انتقل إلى REST Assured لإجراء اختبارات التراجع التلقائية بمجرد اكتمال واجهة برمجة التطبيقات.tracيستقر t.
كيفية إعداد Rest Assured.io مع Eclipse
يتضمن إعداد REST Assured ثلاثة عناصر أساسية: Javaبيئة تطوير متكاملة (IDE) وبرنامج Maven. اتبع الخطوات التالية لتجنب أخطاء البناء لاحقًا.
الخطوة 1) التثبيت Java. الرجوع إلى هذا توجيه
الخطوة 2) قم بتنزيل IDE للبدء: كسوف
الخطوة 3) قم بتثبيت Maven وإعداد Eclipse الخاص بك. راجع اضغط هنا.
الإعداد مضمون
- أنشئ مشروع Maven في بيئة التطوير المتكاملة (IDE) الخاصة بك. نحن نستخدم IntelliJ، ولكن ستحصل على بنية مماثلة في أي بيئة تطوير متكاملة أخرى تستخدمها.
- افتح ملف POM.xml الخاص بك.
هيكل المشروع لمساحة عمل Maven المعتمدة على REST
من أجل الراحة.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>
من أجل الراحة.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 clean متبوعًا بأمر Maven install. يجب أن تكتمل عملية البناء بدون أخطاء.
- أضف عمليات الاستيراد التالية في ملفك Java قم بتصنيف الملف وتأكد من عدم وجود أخطاء في عملية الترجمة.
import io.restassured.RestAssured.*; import io.restassured.matcher.RestAssuredMatchers.*; import org.hamcrest.Matchers.*;
أول نص بسيط للاطمئنان
بعد تثبيت التبعيات، يمكنك الآن كتابة أول برنامج نصي لك. يتبع إطار العمل أسلوب تطوير قائم على السلوك (BDD) يسهل قراءته حتى يصبح أشبه باللغة الإنجليزية.
بناء الجملة:
إن بناء جملة Rest Assured.io هو الجزء الأكثر قابلية للقراءة في الإطار، لأنه يشبه إلى حد كبير BDD ويمكن فهمه.
Given().
param("x", "y").
header("z", "w").
when().
Method().
Then().
statusCode(XXX).
body("x", "y", equalTo("z"));
التفسير:
| Code | تفسير |
|---|---|
| منح() | تتيح لك الكلمة المفتاحية "Given" تحديد خلفية. هنا، يمكنك تمرير رؤوس الطلب، ومعلمات الاستعلام والمسار، ومحتوى الطلب، وملفات تعريف الارتباط. هذا اختياري إذا لم تكن هذه العناصر مطلوبة في الطلب. |
| متى() | تُشير كلمة "عندما" إلى فرضية السيناريو الخاص بك. على سبيل المثال، عندما تحصل على/تنشر/تضع شيئًا ما، افعل شيئًا آخر. |
| طريقة() | استبدل هذا بأي من عمليات CRUD (get/post/put/delete). |
| ثم() | ضع شروط التأكيد والمطابقة هنا. |
الآن وقد أصبحت لديك الإعدادات الأساسية وفهمت بعض المعلومات عن بنية الكود، فلنبدأ بإنشاء أول اختبار بسيط. لا بأس إن بدت البنية جديدة عليك، فمع تقدمك في كتابة الكود وفهم كل سطر، ستعتاد عليها.
ماذا ستجلب؟
افتح متصفحك واضغط على – https://demo.guru99.com/V4/sinkministatement.php?CUSTOMER_ID=68195&PASSWORD=1234!&Account_No=1. تأكد من أنك ترى شيئا على النحو التالي.
نموذج استجابة واجهة برمجة التطبيقات (API) التي تم التقاطها بواسطة REST Assured
في حال ظهور خطأ في المتصفح عند محاولة الحصول على استجابة للطلب:
- تحقق مما إذا كنت قد استخدمت 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 يجب توفيرها.
ثم(). -> لا حاجة إلى تأكيدات محددة.
log(). 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 يُستخدم هذا الأمر بشكل طويل وأقل وضوحًا. بالتدقيق، ستلاحظ استخدام ثلاثة معلمات استعلام:
- هوية الزبون
- كلمة المرور
- رقم الحساب_رقم
تساعدنا مكتبة 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();
}
**لاحظ أننا استخدمنا كلمة "body" بدلاً من "all"؛ وهذا يساعدنا على توضيحtracلا يشمل ذلك سوى نص الرد.
الإخراج:
الحصول على رمز حالة الاستجابة
الطريقة التالية التي سنكتبها هي الحصول على رمز الحالة ووضع تأكيد للتحقق منه.
الخطوة 1) أنشئ دالة باسم getResponseStatus().
الخطوة 2) استخدم نفس بنية الطلب المستخدمة أعلاه. انسخه والصقه.
الخطوة 3) بدلاً من تسجيلها، استخدم 'getStatus'Codeطريقة مدمجة في Rest Assured لجلب قيمة رمز الحالة.
الخطوة 4) للتأكد من أن رمز الحالة الخاص بك هو 200، استخدم الكلمات المفتاحية التالية: assertThat().statusCode(مُتوقعCode).
**ملحوظة - URL هو متغير يُستخدم للتبسيط. URL يحتوي على طلب واجهة برمجة التطبيقات بالكامل URL.
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);
}
الإخراج:
احتياج العمل
إحدى القواعد الأساسية للأتمتة هي أنه يتعين علينا وضع نقاط تفتيش بحيث لا يستمر الاختبار إلا في حالة استيفاء جميع الشروط المطلوبة. في اختبار واجهة برمجة التطبيقات (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. جرّب تغيير رمز الحالة بإدخال معلمات غير صالحة ثم تحقق من النتيجة.
- عندما نؤكد شرطًا ما، لن تكون هناك طباعة على وحدة التحكم ما لم يكن هناك خطأ.
البرنامج النصي لجلب أجزاء مختلفة من الاستجابة
بالإضافة إلى نص الاستجابة ورمز الحالة، يكشف REST Assured أيضًا عن الرؤوس ووقت الاستجابة ونوع المحتوى من خلال أمثلة قابلة للتسلسلtracطرق تور. الكلمة المفتاحية 'ex'tract' ضروري لجلب هذه الأجزاء المحددة.
رأس
تعد لغة Rest Assured لغة واضحة جدًا، كما أن جلب الرؤوس أمر بسيط تمامًا. اسم الطريقة هو الرؤوس (). كما كان من قبل، سوف نقوم بإنشاء طريقة مستقلة للقيام بنفس الشيء.
public static void getResponseHeaders(){
System.out.println("The headers in the response "+
get(url).then().extract()
.headers());
}
يرجى ملاحظة أنه تم تخطي 'given().when()' هنا، ويبدأ سطر التعليمات البرمجية من get(). وذلك لعدم وجود أي شرط مسبق أو تحقق يتم إجراؤه قبل إرسال الطلب والحصول على الاستجابة. في مثل هذه الحالات، يكون استخدامها اختياريًا.
الإخراج:
احتياج العمل:
في كثير من الأحيان، ستحتاج إلى استخدام رمز التفويض أو ملف تعريف ارتباط الجلسة للطلب اللاحق، ويتم إرجاع هذه التفاصيل في الغالب كعناوين للاستجابة.
وقت الاستجابة
للحصول على الوقت اللازم لجلب الاستجابة من الواجهة الخلفية أو أنظمة المصب الأخرى، توفر Rest Assured طريقة تسمى "timeIn" مع وحدة زمنية مناسبة للحصول على الوقت المستغرق لإرجاع الاستجابة.
public static void getResponseTime(){
System.out.println("The time taken to fetch the response "+get(url)
.timeIn(TimeUnit.MILLISECONDS) + " milliseconds");
}
الإخراج:
احتياج العمل:
من أهم خصائص اختبار واجهات برمجة التطبيقات (APIs) زمن الاستجابة، الذي يقيس أداء التطبيق. قد يستغرق استدعاء التطبيق وقتًا أطول أو أقصر تبعًا لسرعة الإنترنت لديك، وأداء واجهة برمجة التطبيقات في ذلك الوقت، وحمل الخادم، وعوامل أخرى تؤثر على زمن الاستجابة.
نوع المحتوى
يمكنك الحصول على نوع محتوى الاستجابة التي تم إرجاعها باستخدام الطريقة "contentType()".
public static void getResponseContentType(){
System.out.println("The content type of response "+
get(url).then().extract()
.contentType());
}
الناتج
احتياج العمل:
في بعض الأحيان، يكون الحصول على نوع المحتوى أمرًا ضروريًا لضمان عدم وجود ثغرات أمنية لأي تهديدات من مصادر مختلفة وللتأكد من أن المحتوى الذي تم تمريره يتوافق مع معايير واجهة برمجة التطبيقات (API).
جلب عنصر JSON فردي
بناءً على الإجابة المعطاة، يُطلب منك حساب المبلغ الإجمالي. عليك استخراج كل مبلغ وجمعه.
الخطوات التالية:
الخطوة 1) يوجد حقل المبلغ داخل مصفوفة تحتوي على المفتاح "statements"، والذي بدوره موجود في القائمة التي تحتوي على المفتاح "result".
الخطوة 2) يوفر Rest Assured آلية للوصول إلى القيم في واجهة برمجة التطبيقات باستخدام "المسار".
الخطوة 3) المسار للوصول إلى المبالغ هو "result.statements.AMOUNT". فكّر في الأمر على أنه XPath في Selenium.
الخطوة 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);
}
ملاحظة: بما أن قيمة المبلغ هي نوع بيانات نصية، فإننا نحولها إلى عدد صحيح للجمع.
الإخراج:
أفضل الممارسات لأتمتة اختبار REST Assured
بمجرد فهم الأساسيات، يضمن تطبيق أنماط منهجية موثوقية مجموعة الاختبارات مع ازدياد حجم واجهة برمجة التطبيقات (API). تساعد الممارسات التالية الفرق على تجنب الاختبارات غير المستقرة وتكاليف الصيانة الإضافية.
- مركزية القاعدة URL: قم بتخزين عنوان URI الأساسي ورموز المصادقة في فئة تكوين واحدة أو ملف خصائص واحد. هذا يمنع التكرار ويبسط عملية تبديل البيئة.
- استخدم مواصفات الطلب والاستجابة: قم بإنشاء كائنات RequestSpecBuilder و ResponseSpecBuilder قابلة لإعادة الاستخدام. فهي تقلل من الشيفرة النمطية عندما تشترك العديد من الاختبارات في رؤوس أو تأكيدات مشتركة.
- التحقق من صحة مخطط JSON: قم بدمج REST Assured مع وحدة json-schema-validator لتأكيد contracسلامة البيانات. تتحقق عمليات فحص المخطط من التغييرات الجذرية قبل وصولها إلى المستهلكين النهائيين.
- استخراج بيانات الاختبار الخارجية: قم بتخزين البيانات في ملفات JSON أو استخدم موفري البيانات من TestNG. تصبح البيانات المضمنة في التعليمات البرمجية قديمة بسرعة.
- إجراء اختبارات مستقلة: ينبغي لكل اختبار إعداد بياناته الخاصة وإزالتها. تفشل مجموعات الاختبارات المعتمدة على الترتيب بشكل غير متوقع في عمليات التكامل المستمر المتوازية.
- التقاط السجلات بشكل انتقائي: استخدم log().ifError() في مجموعات الاختبار المستقرة، وlog().all() أثناء تصحيح الأخطاء. فالسجلات المطولة تُبطئ مسارات التكامل المستمر وتُخفي المشكلات الحقيقية.
- قم بتوصيله بنظام CI/CD: قم بتشغيل مجموعات REST Assured من خلال Maven Surefire أو Failsafe في Jenkins، أو GitHub Actions، أو GitLab. قم بتشغيل فحوصات التحقق الأولية على كل عملية إيداع واختبارات التراجع الكاملة طوال الليل.
إن تبني هذه العادات مبكراً يحول أتمتة واجهة برمجة التطبيقات إلى أصل طويل الأجل بدلاً من كونها نقطة اختناق هشة.


