لماذا للمشروع الجديد أخذت Robot Framework

لقد غيرت المشروع مؤخرًا - توصلت إلى تطوير جديد ، حيث لم يكن أمامي اختبار ، سواء كان يدويًا أو تلقائيًا. لم يفرض العميل الشروط على مجموعة الأدوات (باستثناء أنه كان Python) ، لذلك اخترت خياري الخاص. في هذه المقالة ، سأشرح لماذا في مثل هذه الظروف اخترت Robot Framework. وفي النهاية ، سيكون هناك بعض الأمثلة المكتوبة خصيصًا للمقالة التي توضح ما نتحدث عنه.

صورة

أقوم بإجراء أتمتة الاختبار لأكثر من 10 سنوات ، وتفاعل نحو ثلاثة منهم مع Robot Framework.

كما أشرت أعلاه ، منذ وقت ليس ببعيد جئت إلى مشروع جديد ، حيث بدأت اختبار الأتمتة من الصفر. لا يمكنني إخبارك بالمشروع - NDA. ألاحظ فقط أن هذه أداة رائعة للتشغيل الآلي ، والتي في المستقبل يجب أن توفر الكثير من الموارد البشرية. إنه مبني من الخدمات الصغيرة. حتى الآن ، يتعلق عملي بأربعة منهم ، ولكن في المستقبل سأوسع أنشطتي لتشمل الآخرين - كل ذلك يعود إلى حقيقة أن لديّ 8 ساعات عمل فقط في اليوم. كل شيء يستغرق وقتا.

كان عدم وجود اختبار في حالة هذا المشروع مطابقًا لنقص الأدوات الموصى بها. كجزء من مكدس Python ، كان لي حرية الاختيار. واستفدت منه.

لماذا روبوت الإطار؟


أعتقد أنني يمكن أن يعزى إلى عشاق Robot Framework. يبدو لي أن كل شيء تقريبا يمكن القيام به على ذلك.

في مشاريع أخرى ، تستخدم الشركة pytest. ومع ذلك ، في رأيي ، ليس لديها مثل هذه القدرات ، لأنها محدودة بقدرات بيثون. يمكنك فقط كتابة رمز Python ولاحظ أنك تتوقع قيمة معينة في مثل هذا المتغير. لذوقي ، الأمر بسيط ولكنه مجردة للغاية. لقد بقي الكثير تحت رحمة المطور ، الذي سيتعين عليه إضافة جميع الميزات المفيدة باليد. روبوت الإطار يفعل ذلك بنفسه. فيما يلي أربع نقاط تستحق المشاركة في مشروعك.

مرونة


تتم كتابة Robot Framework نفسه في Python (أي ، يمكنه القيام بأي شيء يمكن لـ Python) ، وله العديد من المكتبات التي أنشأها المجتمع ، مما يوسع نطاق المشكلات إلى حد كبير.

تحت Robot Framework ، يمكنك بسهولة كتابة مكتباتك الخاصة ودمجها مع أي شيء تقريبًا ، وسيعمل كل شيء على الفور. لا العكازات أو الدراجات مطلوبة.
بالإضافة إلى ذلك ، يسمح لك Robot Framework بكتابة اختبارات (قوالب) ، والتي تسرع بشكل كبير من عمل أداة التشغيل الآلي.

اللغة الروسية في الاختبارات


واحدة من النقاط الأساسية هي أن الكلمة الأساسية (نظائرها في الطرق التقليدية في Robot Framework ، والتي لسبب ما يطلق عليها تاريخيا بهذه الطريقة) يمكن كتابتها باللغة الروسية. نتيجة لذلك ، فإن نصوص الاختبار ، بالطبع ، بعيدة كل البعد عن اللغة الأدبية ، ولكن للوهلة الأولى يصبح من الواضح ما يحدث هناك. بادئ ذي بدء ، ليس هذا مطلوبًا من قِبل المطورين النهائيين ، ولكن ، على سبيل المثال ، من قبل أصحاب المصلحة. يمكنهم فتح الاختبارات بشكل مستقل ومعرفة ما يحدث بالضبط هناك: "حدد عنصرًا عشوائيًا من ..." ، إلخ.

علامات


روبوت الإطار يعمل بشكل جيد مع العلامات. لا يمكنك فقط إجراء الاختبارات باستخدام علامة محددة ، ولكن يمكنك أيضًا تحليل التقارير بمساعدتهم. يحتوي ملف السجل على إحصائيات حول العلامات ، بناءً على ذلك يمكنك اتخاذ بعض الإجراءات إذا كنت تفكر في ترتيب العلامات مسبقًا.

ملائمًا ، لا تحتاج إلى كتابة جميع العلامات في قاعدة قدم طويلة في كل اختبار ، ولكن يمكنك تضمين الاختبارات في بنية شجرة. في حالتي ، يبدو الأمر كما يلي: المستوى الأول عبارة عن خدمة مجهرية ، والثاني هو نوع الاختبار ، والثالث هو الاختبارات نفسها (من المريح وضع ملف init يحتوي على علامات لما هو مضمن بداخله).

قمت بإنشاء علامة لكل خدمة microservice ، ولكل طريقة اختبار (اختبارات الدخان ، واختبارات CRUD ، والتكامل ، وما إلى ذلك). يمكنني إجراء اختبارات من نوع معين أو فقط لخدمة معينة. أنا أيضا علامة نوع وظيفة - قائمة أو مفصلة. وإذا كان المنتج المسؤول عن "فواصل" وظائف القائمة في المنتج ، فسوف تتحول جميع الاختبارات التي تحمل هذه العلامة إلى اللون الأحمر ، بغض النظر عن مكان تواجدها وما يتعلق بها.

بالعلامات ، أربط autotests بـ Jira. عندما يغلق الشوائب من المتعقب ، ويتحول الاختبار من اللون الأحمر إلى اللون الأخضر ، لا يزال لدينا تاريخ لما حدث بالضبط. بعد عدة أشهر ، إذا تحول الاختبار إلى اللون الأحمر مرة أخرى ، يمكننا أن نرى الخطوات التي اتخذت لحل المشكلة في المرة الأخيرة ، وحتى نفترض أن ذلك أدى إلى تكرار الخطأ.

علامة خاصة أخرى أضفتها عن الأخطاء غير الهامة. لا يسمح GitLab لنا بعمل أي شيء مع التجميع إذا تعطل اختبار واحد على الأقل. هذا منطقي - إلى أن يتم إصلاح جميع الأخطاء ، لا يمكننا إصدار منتج أو حتى سباق أسبوعي. ولكن لدينا البق ذات الأولوية المنخفضة وقليلة الأهمية. بالنسبة إليهم ، اخترت علامة تسمح لـ Robot Framework بعدم إسقاط التجميع بالكامل ، إلا إذا فشلت هذه الاختبارات (الاختبارات مع هذه العلامة) على وجه التحديد.

سجل كبير


تحليل السجل هو جزء لا يتجزأ من الاختبار. مهما حدث في الوقت الذي يتم فيه تشغيل الاختبارات ، فإن Robot Framework يكتب كل شيء على الإطلاق. حتى أن اضطررت إلى كتابة برنامج تغليف خاص يخفي تسجيل الدخول وكلمة المرور من السجل للاتصال بقاعدة البيانات.

تساعد هذه التفاصيل في فهم ما هو سبب تعطل الاختبار بشكل أسرع بكثير - هل النظام قيد الاختبار يعمل بشكل غير صحيح أم أنه لا يتم أخذ شيء في الاعتبار في الاختبار ويحتاج إلى إصلاح؟ الإجابة على هذا السؤال ليست دائما واضحة. يتم توزيع أخطاء المطورين واختبار 50/50.
في أدوات أخرى - في نفس pytest - يمكنك إنشاء نفس السجل التفصيلي. ولكن هناك مهمة توليدها تقع على عاتق المطور الذي يكتب الاختبارات. إنه يحتاج إلى التفكير في نوع إدخالات السجل المطلوبة بالفعل.

ما هو في المشروع الآن


منذ اللحظة التي بدأت في استخدام Robot Framework ، مرت عدة أشهر. في الوقت الحالي ، قام Robot Framework بتنفيذ أكثر من 200 اختبار ، وكما ذكر أعلاه ، هناك تكامل مع GitLab ، مما يساعد على التحقق من التغييرات التي تم إجراؤها على المنتج المطوّر (يتم تخزين حالات الاختبار ذات المعرفات التي تسمح لك بربط الاختبارات الذاتية بها في testrail).

لحساب التغطية ، كتبت أداة مساعدة تأخذ قائمة بواجهة برمجة تطبيقات الواجهة الخلفية من Swagger ومقارنتها بما تم اختباره. وبالتالي ، لدينا فهم واضح للتغطية الحالية. على سبيل المثال ، نعلم أنه يتم تغطية هذه الخدمة المجهرية بالكامل اليوم ، بينما تتم تغطية الآخر بنسبة 98٪. وبعد إضافة وظائف جديدة لم تنعكس بعد في الاختبار ، تنخفض التغطية. وفقًا لذلك ، يمكنك التخطيط للعداء التالي ليتم تنفيذه بواسطتي.

بطبيعة الحال ، فإن المشروع يتطور أكثر. على سبيل المثال ، نقوم الآن بنشر خادم وهمية ( كتب زميلي بالفعل على هابري عن ماهية سبب ذلك والسبب في الحاجة إليه).

الآن لممارسة


تم تصميم الأمثلة المذكورة أعلاه خصيصًا للمقال لتوضيح الأفكار المذكورة أعلاه. إذا كنت ترغب في تجربة هذه الأمثلة بنفسك ، يتم نشرها جميعًا في مستودعنا .

أبسط مثال على الاختبار


لنبدأ بأبسط اختبار على Robot Framework.

في المثال أدناه ، يتم إنشاء جلسة لأول مرة لمورد معين يمكن الوصول إليه بوضوح (في حالتنا ، en.wikipedia.org/wiki ). عن طريق استدعاء Get root (/) ، نتحقق من كود الحالة 200.

*** Settings *** Documentation  smoke-. Library RequestsLibrary *** Variables *** ${base_url} https://en.wikipedia.org/wiki ${url} / *** Test Cases ***   Wiki Create session conn ${base_url} disable_warnings=1 ${response} Get request conn ${url} Delete all sessions Should be equal ${response.status_code} ${200} 

اختبارات القوالب (حدودي)


يسمح لك Robot Framework بإنشاء أنماط اختبار. إذا قمنا بنقل الاختبار من المثال السابق إلى عرض القالب ، فيمكننا تغييره بسهولة عن طريق إضافة مكالمات باستخدام الوسائط الضرورية. على سبيل المثال ، دعونا نتحقق من الإجابة 200 للصفحات التي تحتوي على سير ذاتية للعلماء.

 *** Settings *** Documentation  smoke-.    . ...    . Library RequestsLibrary Test Setup   Test Teardown    Test Template Smoke- *** Variables *** ${base_url} https://en.wikipedia.org/wiki *** Test Cases ***      /Isaac_Newton      /Albert_Einstein      /Stephen_Hawking *** Keywords ***   Create session conn ${base_url} disable_warnings=1    Delete all sessions Smoke- [Arguments] ${url} ${response} Get request conn ${url} Should be equal ${response.status_code} ${200} 

وضع علامات وقراءة السجلات


نواصل تحسين أبسط اختبار.

وجود قالب كنقطة دخول واحدة ، يمكننا بسهولة إضافة التحقق من سنة ميلاد العالم. بهذه الطريقة نؤكد أن الصفحة المحملة تعرض البيانات الصحيحة.

بالإضافة إلى ذلك ، في المثال أدناه ، قمت بلف الكلمة الرئيسية الحالية بأسماء روسية - حسب ذوقي ، لذلك يقرأ الاختبار بشكل عضوي. كاختبار ، كنت دائمًا منزعجًا من الأساليب التي تُسمى "كما لو كانت باللغة الإنجليزية" ، لكن أميين تمامًا. من الأفضل دائمًا أن تكتب باللغة التي تعرفها.

 *** Settings *** Documentation  smoke-.    . ...    . ...      . ...  . Library RequestsLibrary Test Setup   Test Teardown    Test Template Smoke- *** Variables *** ${base_url} https://en.wikipedia.org/wiki *** Test Cases ***      [Tags] Newton /Isaac_Newton 1642      [Tags] Einstein /Albert_Einstein 1879      [Tags] Hawking /Stephen_Hawking 1942     (  ) [Tags] Numbers /123456789 1899 *** Keywords ***   Create session conn ${base_url} disable_warnings=1    Delete all sessions Smoke- [Arguments] ${url} ${expected_word} ${response} Get request conn ${url} Should be equal ${response.status_code} ${200} ... msg=  GET ${url}    ,   200 .      ${response.text} ${expected_word}      [Arguments] ${text} ${expected_word} Should contain ${text} ${expected_word} msg=    ${expected_word}! 

إيلاء الاهتمام ل [Tags] . يمكنك إضافة علامات هنا ، والتي ، كما كتبت أعلاه ، ستساعد في تقييم المشكلات على مستوى التقرير. وبالمثل ، فإن فرض Force Tags في ملف __init __. Robot (انظر المثال في مستودعنا) يسمح لك بتعيين علامات لجميع الاختبارات في الدليل ، بما في ذلك الاختبارات المتداخلة. إذا تم وضع العلامات بشكل صحيح ، دون حتى قراءة أسماء الاختبارات نفسها وبدون الزحف إلى منطقها ، يمكننا أن نفترض بدقة إلى حد ما أنها لا تعمل في مشروع الاختبار.

انظر إلى التقرير الخاص بإطلاق هذه الاختبارات. من أجل الوضوح ، أضفت اختبارًا سيجد خطأ.

إحصاءات التقرير هي الجزء الأكثر أهمية.

صورة

في المثال الخاص بنا ، لم تمر الاختبارات التي تحمل علامة numbers تمامًا (لدينا 1 من أصل 1 ، ولكن في الحياة الواقعية سيكون هناك ، على سبيل المثال ، 17 من أصل 20). يمكن افتراض أن المشكلة في هذه الصفحة.

تساعد العلامات في إجراء الاختبارات بشكل انتقائي. لتشغيل جميع الاختبارات التي تحمل علامة معينة في خط الإطلاق ، يجب عليك تحديد:

 --include <tag> 

يتم دعم العمليات المنطقية حتى مع العلامات:

 -- include <tag>AND<tag> 

على سبيل المثال ، إذا كنت ترغب في تشغيل اختبار Smoke فقط للاختبارات باستخدام علامة الأرقام ، فيجب عليك إضافة:

 --include smokeANDnumbers 

الاختبارات غير الحرجة


دعنا ننتقل إلى الحيل التي تبسط العمل إلى حد كبير.

بعد وضع علامة على الاختبار بالعلامات ، يمكنك تحديد واحد أو أكثر منها على أنه "غير حرج". سيظل الاختبار الذي يحمل علامة كهذه يعرض الأخطاء (إن وجدت) ، ولكن في النهاية ، لن يتم تفسير هذه الأخطاء على أنها "غير صالحة". أستخدم هذا الخيار عند أخذ بعض الأخطاء الطفيفة في الاعتبار ، وإدخالها في أداة تتبع الأخطاء ، ولكن لم يتم إصلاحها بعد. بدون ذلك ، لن تسمح لك الاختبارات الذاتية المضمنة في CI ، عند اكتشاف مثل هذه المشكلات المعروفة ، بتجميع المشروع ، وهذا ليس مناسبًا دائمًا.

إضافة اختبار جديد:

     (   ) [Tags] Letters Known /abcdefghi 1799 

عند بدء التشغيل ، يتم تعريف العلامة المضافة على أنها "غير حرجة" باستخدام المفتاح:

 --noncritical Known 

الكلمة في الثعبان


مع المثال التالي ، سأوضح كيفية إضافة مكتبتي.

قم بإنشاء كلمة أساسية جديدة "إنشاء مجموعة من الأرقام". الغرض منه واضح (لهذا أنا أحب الأسماء الروسية).

 from random import randint from typing import List from robot.api.deco import keyword class ArrayGeneratorLibrary: ROBOT_LIBRARY_SCOPE = 'GLOBAL' @keyword("  ") def generate_array(self, length: int, minimal: int, maximal: int) -> List[int]: result = [] for i in range(int(length)): result.append(randint(int(minimal), int(maximal))) return result 

نقوم بتوصيل المكتبة في الاختبار:

 Library libraries.ArrayGeneratorLibrary 

واستخدامها:

   ,   python. ${array}    ${5} ${2} ${8} Log to console ${array} 

لا تنس أنه إذا كان لديك بنية متداخلة ، فيجب أن تفصلها بنقاط ، كما في المثال.
خدعة أخرى: يتم التعامل مع الأرقام التي تم تمريرها بـ ${} على أنها int ، وليس كسلسلة!

الحجج المضمنة


شيء جميل آخر هو الحجج المضمنة ، والتي يتم تمريرها ليس في نهاية المكالمة ، كالمعتاد ، ولكن مباشرة في جسده.

للتوضيح ، سنقوم بكتابة غلاف لمولد الصفيف الذي تم إنشاؤه أعلاه ، والذي يسمح باستخدام الوسائط المضمنة:

  ${n} ,  ${from}  ${to} ${result}    ${n} ${from} ${to} [Return] ${result} 

الآن يمكنك كتابة مثل هذا:

       . ${array}  5 ,  2  8 Log to console ${array} 

استبدال جزء من اسم الطريقة ، إدراج الثعبان والحلقات


الخدعة التالية التي يعجبني حقًا في Robot Framework هي استبدال جزء من الاسم. افترض أن لدينا طريقتين: واحدة تختار الأرقام الزوجية ، والآخر غريب.

      [Arguments] ${list} ${evens} Evaluate [i for i in $list if i % 2 == 0] [Return] ${evens}      [Arguments] ${list} ${odds} Evaluate [i for i in $list if i % 2 != 0] [Return] ${odds} 

الكلمة الأساسية Evaluate المستخدمة أعلاه يسمح لك بتنفيذ سطر من رمز بيثون "هنا". يرجى ملاحظة أنه إذا كنت لا ترغب في استبدال قطعة من السلسلة بمحتويات المتغير ، أي تمرير رابط إليها ، فيجب أن تشير إلى اسم المتغير مباشرة بعد علامة $ دون أقواس مجعد!

وهكذا ، يمكنك الاتصال بالطريقتين ، مع استبدال الجزء المختلف من اسمه:

     ,   . . ${types} Create list   ${array}  5 ,  12  28 FOR ${type} IN @{types} ${numbers} Run keyword  ${type}    ${array} log to console ${numbers} END 

ديكور الأسلوب


نعم ، يسمح لك برنامج Robot Framework بكتابة مصمم للكلمات الرئيسية الأخرى!

لتوضيح هذه الميزة ، نكتب مصممًا يحدد الأرقام السالبة في الاستجابة لأي طريقة تُرجع قائمة.

     ,  [Arguments] ${keyword} @{args} &{kwargs} ${list} Run keyword ${keyword} @{args} &{kwargs} ${negs} Evaluate [i for i in $list if i < 0] [Return] ${negs} 

يرجى ملاحظة:
@{args} جميع الوسائط غير المسماة ؛
&{kwargs} كلها وسائط مسماة.
بوجود هذه المجموعة ، يمكنك إعادة توجيهها ، وإنشاء مصمم ديكور.
العمل مع الديكور سيبدو هكذا:

    ${negs}     ,     10 -5 5 log to console ${negs} 

بدلا من الاستنتاج


في الأمثلة أعلاه ، عرضت الملامح الرئيسية لبرنامج Robot Framework ، مما يجعل الحياة أسهل بكثير. لكن رقائقه لا تقتصر على هذه القائمة.

إذا كان لديك أي أسئلة ، فاكتب في التعليقات. سنقوم بتوضيح الاتجاه الرئيسي لقراءة الاهتمام والإجابة على الأسئلة مع استمرار النص.

مؤلف المقال: فلاديمير فاسيايف.

ملاحظة: ننشر مقالاتنا على عدة مواقع من Runet. اشترك في صفحاتنا على VK أو FB أو Telegram-channel لمعرفة كل منشوراتنا وغيرها من أخبار Maxilect.

Source: https://habr.com/ru/post/ar470924/


All Articles