ميزات الخيار: نظرة عامة
نشرت: 2022-04-20مقدمة
Gherkin هي لغة لا تزال مستخدمة في العديد من أطر أتمتة الاختبار. أحيانًا يكون ذلك لأن العميل يطلب منا استخدامه ، وأحيانًا لأن الفريق يقرر القيام بذلك.
لأكون صادقًا ، لم يكن حبًا بالنسبة لي من النظرة الأولى. أنا شخصيًا أمتلك رحلة طويلة جدًا مع غيركين - بدءًا من الإعجاب بها في البداية ، وحتى كره اللغة لبعض الوقت ، ثم انتهى بي الأمر إلى الإعجاب بها مرة أخرى. في هذه المقالة سأقدم أهم ميزات Cucumber مع تطبيق Java.
فيما يلي جميع ميزات الخيار التي تم تناولها في هذه المقالة:
ميزة | وصف |
---|---|
سيناريو | سيناريو بسيط |
مخطط السيناريو | يتطلب من المستخدم تقديم بيانات الاختبار في قسم "أمثلة" |
جداول البيانات | يتطلب من المستخدم تقديم بيانات الاختبار لخطوة الاختبار |
سياق السيناريو | تقاسم القيم بين خطوات الاختبار |
أنواع بيانات الخيار | أنواع البيانات التي يتعامل معها الخيار |
التعبير العادي للخيار | استخدام التعبير النمطي في سيناريوهات الخيار |
خطاف الخيار | ينفذ تعليمات برمجية إضافية في سيناريوهات الاختبار |
ملف مميز
بادئ ذي بدء ، ما هو ملف الميزة؟ في العالم التقني ، تم إنشاء نهج غير تقني للسماح للأشخاص غير التقنيين بالتعاون مع الفريق أثناء تطوير التطبيق. تم إنشاء لغة غيركين كطبقة إضافية في نهج BDD. توجد اختبارات Gherkin في ما يسمى بملفات الميزات الملصقة بالشفرة (Java ، Kotlin ، C # وما إلى ذلك). عادةً ما يكون استخدام Gherkin سهل الاستخدام للغاية ، ويتطلب الحد الأدنى من المعرفة بالبرمجة ، ولكن هناك ميزات تتطلب بعض الترميز.
لنبدأ بشيء سهل.
سيناريو
إليك المثال الأساسي والأسهل استخدامًا لاختبار الخيار:
الميزة: سيناريو الخلفية: قبل اختبار السيناريوهات نظرا لأني نفذ قبل الخطوة @اختبار السيناريو: سيناريو نظرًا لاستخدامي الخطوة ذات المعلمات من "السيناريو 1"
كود بلوك 1. السيناريو
يحتوي Code Block 1. على بعض الأشياء التي يجب شرحها:
- الميزة : عنوان ملف الميزة
- الخلفية : الكلمة الأساسية التي تسمح للمستخدم بتنفيذ خطوات الاختبار قبل كل سيناريو اختبار محدد في ملف الميزة
- Test : العلامة التي تخبر إطار الاختبار عن سيناريو الاختبار الذي يجب تنفيذه. يتم تعريف "اختبار" من قبل المستخدم. يمكننا استخدام على سبيل المثال "SmokeTest"
- السيناريو : اختبار اسم السيناريو
تستخدم اختبارات Gherkin الكلمات الرئيسية [المعطاة ، ومتى ، وبعد ذلك ، ولكن] قبل كل خطوة اختبار. في خطوة الاختبار الوحيدة ، باستثناء خطوة الخلفية ، نستخدم معلمة نمرر فيها القيمة "سيناريو 1".
الآن ، دعنا نرى كيف تبدو كود Java الملصقة:
Given ("أنا أنفذ قبل الخطوة") iExecuteBeforeStep () باطل عام { // بعض التنفيذ } Given ("أنا أستخدم الخطوة ذات المعلمات من {سلسلة}") iUseParametrizedStepOf العام باطل (سلسلة ع) { // بعض التنفيذ }
كود بلوك 2. تنفيذ كود جافا للسيناريو
مخطط السيناريو
لنفعل شيئًا أكثر تعقيدًا:
الميزة: مخطط السيناريو @اختبار مخطط السيناريو: مخطط السيناريو نظرًا لأنني قمت بتشغيل الخطوة مع "<parameter1>" و "<parameter2>" أمثلة: | المعلمة 1 | المعلمة 2 | | معلمة 1a | معلمة 2 أ | | المعلمة 1 ب | معلمة 2 ب |
كتلة التعليمات البرمجية 3. مخطط السيناريو
هذه المرة سوف نستخدم مخطط السيناريو الذي يسمح لنا بتكرار سيناريوهات الاختبار مع تكوينات مختلفة لبيانات الاختبار. يحتوي Code Block 3. على بعض الأشياء التي يجب شرحها:
- أمثلة : مصفوفة بيانات الاختبار التي ستستخدمها سيناريوهات الاختبار. الصف الأول عبارة عن رأس بأسماء معلمات.
وتنفيذ جافا:
Given ("أنا أجري الخطوة مع {string} و {string}") عامة باطلة iRunStepWithAnd (سلسلة p1 ، سلسلة p2) { // بعض التنفيذ }
Code Block 4. تنفيذ Java لمخطط السيناريو
جدول البيانات
مخطط السيناريو مفيد للغاية ، ولكن ماذا لو لم نرغب في تكرار سيناريو الاختبار بالكامل ولكننا نريد فقط خطوة اختبار واحدة؟ لدى Gherkin طريقة للقيام بذلك وتسمى "جدول البيانات".
الميزة: جدول البيانات @اختبار السيناريو: سيناريو جدول البيانات نظرًا لأنني أتحقق من أن العمود يحتوي على القيمة المتوقعة | اسم العمود | المتوقعالقيمة | | someColumnName | SomeExpectedValue |
كتلة التعليمات البرمجية 5. جدول البيانات
لا يختلف السيناريو مع جدول البيانات كثيرًا عن مخطط السيناريو. الشيء الوحيد هو أننا لا نضع الكلمة الرئيسية "أمثلة" قبل الجدول.
يبدو تنفيذ Java أكثر تعقيدًا قليلاً مما كان عليه في الحالات السابقة:
Given ("أتحقق من احتواء العمود على القيمة المتوقعة") iVerifyColumnValuesInTableUsingQueryFromFileOnSchema العامة (DataTable dataTable) { قائمة <خريطة <سلسلة ، سلسلة >> data = dataTable.asMaps () ؛ لـ (Map <String، String> form: data) { String columnName = form.get ("اسم العمود") ؛ String dueResult = form.get ("متوقعValue") ؛ // بعض التنفيذ } } }
كتلة التعليمات البرمجية 6. تنفيذ Java لجدول البيانات
للوصول إلى البيانات من جدول البيانات ، نقوم بإنشاء متغير dataTable خاص من نوع "DataTable". سيتم تخزين جميع البيانات في متغير القائمة.

سياق السيناريو
باستخدام سياق السيناريو ، يمكننا مشاركة البيانات بين الخطوات. لنفترض أن لدينا سيناريو من خطوتين نريد فيه تمرير "بيانات" القيمة من الخطوة 1 إلى الخطوة 2 (Code Block 7).
@اختبار السيناريو: سياق السيناريو بالنظر إلى أنني قمت بتعيين قيمة سياق السيناريو "البيانات" بالنظر إلى أنني أستخدم قيمة سياق السيناريو
كتلة التعليمات البرمجية 7. سياق السيناريو
أولاً ، نحتاج إلى إنشاء فئة خاصة تسمى ScenarioContext مع ميزات سياق السيناريو لإعداد البيانات والحصول عليها (Code Block 8). سياق السيناريو لدينا هو HashMap مع زوج مفتاح القيمة. سنحدد القيم من خلال مفتاحها.
- السيناريوContext () : HashMap لزوج القيمة الرئيسية
- setContext () : طريقة قيمة المفتاح لتخزين بيانات سياق السيناريو
- getContext () : طريقة للحصول على مفتاح توفير البيانات
سيناريو كونكست فئة عامة { خريطة خاصة <سلسلة ، كائن> سيناريو كونتيكست ؛ سيناريو عام السيناريوContext = new HashMap <> () ؛ } setContext العامة باطلة (مفتاح السياق ، قيمة الكائن) { السيناريوContext.put (key.toString () ، القيمة) ؛ } public Object getContext (مفتاح السياق) { إرجاع سيناريوContext.get (key.toString ()) ، } } سياق التعداد العام { بطاقة تعريف؛ }
كتلة التعليمات البرمجية 8. تنفيذ Java لفئة سياق السيناريو
الحصول على هذا يمكننا الاستفادة من الأساليب المطبقة. في الخطوة 1 ، قمنا بتعيين القيمة في سياق السيناريو وفي الخطوة 2 نحصل على القيمة (Code Block 9).
سيناريو كونتيكست سيناريو كونتيكست = new ScenarioContext ()؛ Given ("لقد قمت بتعيين قيمة سياق السيناريو {سلسلة}") iSetScenarioContextValue العامة الباطلة (قيمة السلسلة) { السيناريوContext.setContext (Context.ID، value) ؛ } Given ("أنا أستخدم قيمة سياق السيناريو") iUseScenarioContextValue عام باطل () { String sharedValue =arioContext.getContext (Context.ID) .toString () ؛ }
كتلة التعليمات البرمجية 9. خطوات سياق السيناريو
أنواع بيانات الخيار
يعالج الخيار عددًا محدودًا من أنواع البيانات. يمكننا تحديد السلاسل والأعداد الصحيحة والقيم العائمة ولكن في حالة القيم المنطقية نحتاج إلى ترميز بعض الحلول.
@اختبار السيناريو: سيناريو مع المتغيرات بالنظر إلى أنني أستخدم السلسلة "string" و int 1 و float 1.1 و boolean "false"
كتلة التعليمات البرمجية 10. أنواع بيانات الخيار
سيبدو كود Java كما يلي:
Given ("I use string {string}، int {int}، float {float} and boolean {string}") عامة باطلة iUseStringIntFloatAndBoolean (String var1، int var2، double var3، String var4) { قيمة منطقية f = Boolean.valueOf (var4) ؛ // بعض التعليمات البرمجية }
كتلة التعليمات البرمجية 11. تنفيذ Java لأنواع بيانات الخيار
التعبير العادي للخيار
هذه ميزة أخرى شائعة الاستخدام. يُظهر Code Block 12 سيناريو من خطوتين يختلفان فقط باستخدام قيم متغيرة مختلفة (var1 و var2). هذه في الواقع مجرد خطوة واحدة ، وفي كود Java (Code Block 13) نحدد طريقة واحدة فقط ولكن مع regex ومعامل واحد var.
@اختبار السيناريو: سيناريو التعبير العادي بالنظر إلى أنني استخدم متغير var1 بالنظر إلى أنني استخدم متغير var2
كتلة التعليمات البرمجية 12. التعبير العادي في الخيار
Given ("^ أنا أستخدم متغير (. *)") public void examTimeTableInSummerSeason (String var) { إذا (var.equals ("var1")) { // بعض التعليمات البرمجية } else if (var.equals ("var2")) { // بعض التعليمات البرمجية } }
كود بلوك 13. تنفيذ جافا للتعبير النمطي للخيار
خطاف الخيار
أخيرًا وليس آخرًا: خطافات الخيار.
يقدم الكود بلوك 14 أهم 4 خطافات:
- Before : ينفذ التعليمات البرمجية قبل كل سيناريو اختبار
- After : تنفيذ التعليمات البرمجية بعد كل سيناريو اختبار
- BeforeStep : ينفذ التعليمات البرمجية قبل كل خطوة اختبار
- AfterStep : تنفيذ التعليمات البرمجية بعد كل خطوة اختبار
@قبل فراغ عام قبل السيناريو () { // بعض التعليمات البرمجية } @بعد، بعدما فراغ عام بعد السيناريو () { // بعض التعليمات البرمجية } تضمين التغريدة فراغ عام قبل الخطوة () { // بعض التعليمات البرمجية } تضمين التغريدة فراغ عام بعد الخطوة () { // بعض التعليمات البرمجية }
كود بلوك 14. خطاطيف الخيار
ملخص
آمل أن أقنعك باستخدام غيركين في اختباراتك. ستجعل هذه الميزات القليلة اختباراتك أكثر قابلية للقراءة وأسهل للفهم من قبل الأشخاص غير التقنيين. أيضًا بالنسبة للمنضمين الجدد ، سيكون من الأسهل فهم منطق الأعمال وتقليل وقتهم في العمل.