برنامج REST Assured التعليمي لاختبار أتمتة واجهة برمجة التطبيقات (مثال)
ما هو الاطمئنان؟
اطمئن، لا تشغل بالك يتيح لك اختبار واجهات برمجة التطبيقات REST باستخدام مكتبات Java ويتكامل جيدًا مع Maven. يحتوي على تقنيات مطابقة فعالة للغاية، لذا فإن تأكيد النتائج المتوقعة أمر سهل للغاية أيضًا. يحتوي Rest Assured على طرق لجلب البيانات من كل جزء تقريبًا من الطلب والاستجابة بغض النظر عن مدى تعقيد هياكل JSON.
بالنسبة لمجتمع الاختبار، لا يزال اختبار أتمتة واجهة برمجة التطبيقات جديدًا ومميزًا. إن تعقيدات JSON تجعل اختبار واجهة برمجة التطبيقات غير مستكشف. لكن هذا لا يجعله أقل أهمية في عملية الاختبار. لقد جعل إطار عمل Rest Assured.io الأمر بسيطًا للغاية باستخدام أساسيات Java الأساسية، مما يجعله أمرًا مرغوبًا للغاية للتعلم.
لماذا نحتاج إلى Rest-Assured؟
تخيل أنك تفتح عرض خريطة جوجل الخاص بك وتبحث عن المكان الذي تريد الذهاب إليه، وترى على الفور المطاعم القريبة، وترى خيارات للتنقل؛ من بعض موفري خدمات السفر الرائدين، وشاهد العديد من الخيارات في متناول يدك. نعلم جميعًا أنها ليست منتجات جوجل، فكيف تمكنت جوجل من إظهارها. يستخدمون واجهات برمجة التطبيقات المكشوفة لهؤلاء المزودين. الآن، إذا طُلب منك اختبار هذا النوع من الإعداد، حتى قبل إنشاء واجهة المستخدم أو قيد التطوير، يصبح اختبار واجهات برمجة التطبيقات (APIs) مهمًا للغاية واختبارها بشكل متكرر، مع مجموعات بيانات مختلفة يجعلها حالة مناسبة جدًا للأتمتة.
في وقت سابق، كنا نستخدم لغات ديناميكية مثل Groovy وRuby لتحقيق ذلك، وكان الأمر صعبًا. ومن ثم لم يتم استكشاف اختبار واجهة برمجة التطبيقات (API) عن طريق الاختبار الوظيفي.
لكن استخدام Rest Assured واختبار أتمتة واجهات برمجة التطبيقات وإرسال طلبات https البسيطة مع تخصيصات سهلة الاستخدام أمر بسيط إذا كان لدى المرء خلفية أساسية في Java. هناك حاجة لفهم اختبار واجهة برمجة التطبيقات واختبار التكامل، ولكن بعد ذلك، يوفر Rest Assured ثقة جيدة جدًا في الواجهة الخلفية بينما يمكن لاختبار الواجهة الأمامية التركيز فقط على واجهة المستخدم والعمليات من جانب العميل. يعد Rest Assured مفتوح المصدر مع الكثير من الطرق والمكتبات الإضافية المضافة مما يجعله خيارًا رائعًا لأتمتة واجهة برمجة التطبيقات.
كيفية إعداد Rest Assured.io مع Eclipse
الخطوة 1) التثبيت Java. الرجوع إلى هذا توجيه
الخطوة 2) قم بتنزيل IDE للبدء: كسوف
الخطوة 3) قم بتثبيت Maven وإعداد Eclipse الخاص بك. راجع هنا.
الإعداد مضمون
- قم بإنشاء مشروع Maven في IDE الخاص بك. نحن نستخدم Intellij، لكنك ستحصل على بنية مماثلة في أي بيئة تطوير متكاملة (IDE) قد تستخدمها.
- افتح ملف POM.xml الخاص بك
من أجل الراحة.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 على guru99.
- مع ذلك، ترى أخطاء، ثم قم بإجراء عملية تنظيف مخضرم متبوعة بتثبيت مخضرم، ويجب أن يتم إنشاؤه بدون أي أخطاء.
- يمكنك إضافة الأسطر أدناه في فئة Java الخاصة بك ورؤية عدم وجود أخطاء في الترجمة.
import io.restassured.RestAssured.*; import io.restassured.matcher.RestAssuredMatchers.*; import org.hamcrest.Matchers.*;
أول نص بسيط للاطمئنان
بناء الجملة:
يعد بناء جملة Rest Assured.io هو الجزء الأكثر جمالا، لأنه يشبه BDD للغاية ومفهوم.
Given(). param("x", "y"). header("z", "w"). when(). Method(). Then(). statusCode(XXX). body("x, ”y", equalTo("z"));
التفسير:
رمز | تفسير |
---|---|
منح() | تتيح لك الكلمة الرئيسية "المعطى" تعيين الخلفية، حيث يمكنك هنا تمرير رؤوس الطلب ومعلمات الاستعلام والمسار والنص وملفات تعريف الارتباط. وهذا أمر اختياري إذا لم تكن هذه العناصر مطلوبة في الطلب |
متى() | تشير الكلمة الأساسية "متى" إلى فرضية السيناريو الخاص بك. على سبيل المثال، "عندما" تحصل/تنشر/تضع شيئًا ما، افعل شيئًا آخر. |
طريقة() | استبدل هذا بأي من عمليات CRUD (get/post/put/delete) |
ثم() | شروط التأكيد والمطابقة الخاصة بك تذهب هنا |
الآن بعد أن انتهيت من الإعداد وبعض المعلومات الأساسية عن بناء الجملة، فلنقم بإنشاء أول اختبار بسيط لنا. لا بأس إذا كانت البنية تبدو جديدة بالنسبة لك حتى الآن، حيث تقوم بتفسير كل سطر بشكل أكبر، فسوف تتقنها.
ماذا ستجلب؟
افتح متصفحك واضغط على – http://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) على غرار البنية التي تعلمتها مسبقًا، متى وبعد ذلك، اكتب الكود أدناه
منح(). -> لا توجد رؤوس مطلوبة، ولا يوجد استعلام أو معلمات مسار.
متى(). -> لا يوجد إعداد شرط محدد
يحصل('http://demo.guru99.com/V4/sinkministatement.php?CUSTOMER_ID=68195&PASSWORD=1234!&Account_No=1
'). ->يجب توفير عنوان url فقط
ثم(). -> لا توجد تأكيدات محددة مطلوبة
سجل(). all() -> بمجرد جلب كل الاستجابة، قم بتسجيل الاستجابة، والرؤوس، وبشكل أساسي كل ما يعيده الطلب إليك.
public static void getResponseBody(){ given().when().get("http://demo.guru99.com/V4/sinkministatement.php?CUSTOMER_ID=68195&PASSWORD=1234!&Account_No=1").then().log() .all(); }
لاحظ الآن أن عنوان URL المستخدم طويل وأقل قابلية للقراءة، وإذا نظرت عن كثب، ستلاحظ أنه يتم استخدام 3 معلمات استعلام وهي
- هوية الزبون
- كلمة المرور
- رقم الحساب_رقم
كن مطمئنًا، يساعدنا هذا على تمرير كل جزء (الاستعلام والمسار ومعلمة الرأس) بشكل منفصل، مما يجعل الكود أكثر قابلية للقراءة وأسهل في الصيانة. كما يمكننا تحديد معلمات البيانات من ملف خارجي حسب الحاجة.
لاستخدام معلمة الاستعلام، نعود إلى تعريفنا لبناء الجملة ونرى أنه تم تمريرها جميعًا كجزء من المعطى.
public static void getResponseBody(){ given().queryParam("CUSTOMER_ID","68195") .queryParam("PASSWORD","1234!") .queryParam("Account_No","1") .when().get("http://demo.guru99.com/V4/sinkministatement.php").then().log() .body(); }
**لاحظ أننا استخدمنا "الجسم" بدلاً من "الكل"؛ وهذا يساعدنا على استخراج جسم الاستجابة فقط.
الإخراج:
الحصول على رمز حالة الاستجابة
الطريقة التالية التي سنكتبها هي الحصول على رمز الحالة ووضع تأكيد أيضًا للتحقق من صحته.
الخطوة 1) قم بإنشاء طريقة تسمى getResponseStatus ()
الخطوة 2) استخدم نفس بنية الطلب المستخدمة أعلاه. انسخه والصقه.
الخطوة 3) بدلاً من تسجيله، نستخدم الأسلوب المدمج "getStatusCode" الخاص بـ Rest Assured لجلب قيمة رمز الحالة
الخطوة 4) من أجل التأكد من أن رمز الحالة الخاص بك هو 200، نستخدم الكلمات الرئيسية – AssurThat().statusCode(expectedCode)
**ملاحظة - عنوان URL هو متغير يستخدم للبساطة. يحتوي عنوان URL على عنوان URL لطلب واجهة برمجة التطبيقات بالكامل
public static void getResponseStatus(){ int statusCode= given().queryParam("CUSTOMER_ID","68195") .queryParam("PASSWORD","1234!") .queryParam("Account_No","1") .when().get("http://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="http://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("http://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("http://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 لغة واضحة جدًا، كما أن جلب الرؤوس أمر بسيط تمامًا. اسم الطريقة هو الرؤوس (). كما كان من قبل، سوف نقوم بإنشاء طريقة مستقلة للقيام بنفس الشيء.
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) يوجد حقل المبلغ ضمن مصفوفة تحتوي على "بيانات" رئيسية والتي بدورها موجودة في القائمة التي تحتوي على "نتيجة" رئيسية
الخطوة 2) كن مطمئنا، يوفر آلية للوصول إلى القيم في واجهة برمجة التطبيقات باستخدام "المسار"
الخطوة 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
- الاطمئنان هو Java- القائم على المعرفة الأساسية Java يكفي لتعلمها
- يساعد في جلب قيم الطلب والاستجابة من هياكل JSON المعقدة
- تشير API يمكن تخصيص الطلب باستخدام مجموعة متنوعة من العناوين والاستعلام ومعلمات المسار وأي جلسة أو ملفات تعريف ارتباط سيتم تعيينها.
- فهو يساعد على تعيين تأكيد البيانات والشروط.
- على الرغم من أن ميزة Rest Assured مفيدة للغاية عندما تكون الاستجابة من نوع JSON، فقد لا تعمل أساليبها بسلاسة إذا كان معرف نوع المحتوى HTML أو نصًا عاديًا.