إدارة الاختبار الآلي مع Telegram

كمهندس ضمان الجودة ، قمت بتطوير نظام اختبار ذاتي. واجه عدد من المشاكل:

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

لذلك ، قررت إنشاء نموذج أولي صغير من برنامج الروبوت لتشغيل الاختبارات الآلية ، والذي سيغطي معظم المشكلات المذكورة أعلاه.

وصف الفكرة:

يرسل المستخدم الأوامر اللازمة للدردشة ، ويقوم بتشغيل الإنشاء في نظام CI ، وفقًا للقواعد المحددة في التكوين. CI تدير autotests مع علامات pytest. بعد التشغيل ، يتلقى البرنامج النصي داخل مستودع الاختبار معلومات حول حالة الإنشاء ، ويقوم بجمع السجلات ويرسلها مرة أخرى إلى المستخدم في دردشة البرقية.

الأدوات:

الأدوات
  • لغة البرمجة - بيثون
  • اختبار الإطار - Pytest
  • عميل HTTP - طلبات
  • قاعدة البيانات - SQLite3
  • ORM - Peewee
  • نظام CI - ترافيس CI



محتوى

  1. تدريب
  2. بوت التسجيل
  3. إعداد مستودع الاختبار
  4. الاختبارات وقطع الأشجار
  5. تقرير جيل
  6. تكوين Travis CI
  7. بوت الإعداد
  8. مبادئ الروبوت
  9. نشر على Heroku


بوت التسجيل


بادئ ذي بدء ، نحن بحاجة إلى تسجيل برقية الروبوت والحصول على معرفه الفريد ، والذي يعد رمزًا مميزًا. للقيام بذلك ، اكتب الرسالة / ابدأ في botFather @ bot.
فريقنا الرئيسي هو / newbot ، عن طريق الدخول الذي سيُطلب منا طرح اسم الروبوت.
ولكن هناك قاعدة واحدة - يجب أن ينتهي الاسم بالروبوت. يأخذ BotFather اسم الروبوت ويعيد الرمز المميز الخاص بك. تنشيط الروبوت عن طريق بدء الدردشة. بعد ذلك ، تحتاج إلى إرسال طلب API إلى طريقة getUpdates.

https://api.telegram.org/bot{_}/getUpdates 

تذكر hat_id المستلمة.


إعداد مستودع الاختبار


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


الاختبارات وقطع الأشجار

إنشاء وظائف الاختبار ووضع علامات عليها مع علامة pytest - الكامل والدخان والطيور.

من المهم إضافة تسجيل إلى اختباراتنا عن طريق إنشاء ملف pytest.ini وإضافة المكالمات إلى طريقة المعلومات من مكتبة التسجيل في وظائف الاختبار.
يحتوي ملف pytest.ini على قوالب للسجلات المباشرة وملف سجل.

مثال الاختبار
 import pytest import requests import logging @pytest.mark.full @pytest.mark.smoke def test_cat_facts(): query = {"animal_type": "cat", "amount": "2"} response = requests.get("https://cat-fact.herokuapp.com/facts/random", params=query) logging.info(f"Request url: {response.request.url}, body: {response.request.body}") logging.info(f"Request status: {response.status_code}, body: {response.text}") assert response.status_code == 200 @pytest.mark.full @pytest.mark.smoke def test_dog_facts(): query = {"animal_type": "dog", "amount": "2"} response = requests.get("https://cat-fact.herokuapp.com/facts/random", params=query) logging.info(f"Request url: {response.request.url}, body: {response.request.body}") logging.info(f"Request status: {response.status_code}, body: {response.text}") assert response.status_code == 200 @pytest.mark.full def test_horse_facts(): query = {"animal_type": "horse", "amount": "2"} response = requests.get("https://cat-fact.herokuapp.com/facts/random", params=query) logging.info(f"Request url: {response.request.url}, body: {response.request.body}") logging.info(f"Request status: {response.status_code}, body: {response.text}") assert response.status_code == 200 @pytest.mark.bird def test_bird_facts(): query = {"animal_type": "bird", "amount": "2"} response = requests.get("https://cat-fact.herokuapp.com/facts/random", params=query) logging.info(f"Request url: {response.request.url}, body: {response.request.body}") logging.info(f"Request status: {response.status_code}, body: {response.text}") assert response.status_code == 200 



pytest.ini
 [pytest] markers = smoke: for smoking testing full: for regression testing bird: facts only bird log_cli = 1 log_cli_level=INFO log_cli_format = %(asctime)s [%(levelname)8s] %(message)s log_cli_date_format='%Y-%m-%d %H:%M:%S' log_file = test_log.log log_file_level=INFO log_file_format= %(asctime)s [%(levelname)8s] %(message)s log_file_date_format='%Y-%m-%d %H:%M:%S' 




تقرير جيل

نقوم بإنشاء برنامج نصي يقوم ، بعد اكتمال التجميع ، بجمع المعلومات من نظام CI وإرسالها إلى الدردشة البرقية ، جنبًا إلى جنب مع السجلات.
داخل البرنامج النصي ، تحتاج إلى استبدال قيمتي TELEGRAM_BOT و CHAT_ID بتلك التي تلقيتها سابقًا.

رمز البرنامج النصي
 import requests import os TRAVIS_TEST_RESULT = os.environ.get("TRAVIS_TEST_RESULT") TRAVIS_REPO_SLUG = os.environ.get("TRAVIS_REPO_SLUG") TRAVIS_BRANCH = os.environ.get("TRAVIS_BRANCH") TRAVIS_JOB_WEB_URL = os.environ.get("TRAVIS_JOB_WEB_URL") TRAVIS_COMMIT_MESSAGE = os.environ.get("TRAVIS_COMMIT_MESSAGE") TELEGRAM_TOKEN = "808619876:GHrtj9zs-KvKhhtWyu1YoxjtIikUYMGVjD8g" CHAT_ID = "272560060" if TRAVIS_TEST_RESULT != 0: build_status = "" else: build_status = "" TEXT = f" : {build_status} \n : {TRAVIS_REPO_SLUG} \n : {TRAVIS_BRANCH} \n Commit : {TRAVIS_COMMIT_MESSAGE} \n -: {TRAVIS_JOB_WEB_URL}" def send_message(): URL = f"https://api.telegram.org/bot{TELEGRAM_TOKEN}/sendMessage" body = {'chat_id': CHAT_ID, 'text': TEXT} response = requests.post(url=URL, json=body) return response def send_file(): URL = f"https://api.telegram.org/bot{TELEGRAM_TOKEN}/sendDocument" body = {'chat_id': CHAT_ID} file = {"document": open("test_log.log")} response = requests.post(url=URL, data=body, files=file) return response send_message() send_file() 


يستخدم البرنامج النصي متغيرات النظام ويستقبل القيم من Travis CI.

إذا كانت قيمة TRAVIS_TEST_RESULT لا تساوي الصفر ، فسيتم تعيين القيمة على "بنجاح" ، تتم معالجة وظيفة send_message أولاً ، والتي ترسل معلومات التجميع إلى الدردشة (اسم المستودع ، الفرع المحدد ، اسم الالتزام المستخدم ، الارتباط بسجل الويب) ، ثم وظيفة send_file التي ترسل ملف السجل.

في مستودع الاختبار ، أضف ملف التكوين - travis.yml. في الداخل نصف خط الأنابيب الذي من خلاله سيعمل التجميع.

travis.yml
 language: python python: - "3.7" install: - pip install -r requirements.txt script: pytest -m smoke after_script: - python tg_command.py 


بعد ذلك ، نحتاج إلى نشر مستودع التخزين على GitHub لإضافته إلى Travis CI.


إعداد TRAVIS_CI


نذهب الى الموقع
تسجيل الدخول باستخدام حساب GitHub الخاص بك. التبديل إلى علامة التبويب Dashboard. بعد فتح DevTools (Network) مسبقًا ، في علامة التبويب الفرعية المستودعات على الموقع المقابل لمستودع الاختبار ، انقل المنزلق - قم بتنشيط التجميع. في علامة تبويب "الشبكة" (DevTools) ، يصل طلب نشط ، في المعاينة التي توجد فيها معلومات حول معرف المستودع ، يجب تذكر الرقم (نسخ / الكتابة). التبديل إلى الموقع في علامة التبويب "إعداد". نحن ننسخ أو نتذكر الرمز - نحتاجه.


بوت الإعداد


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

داخل المستودع توجد الملفات:

  1. main.py - البرنامج النصي bot؛
  2. models.py - ملف به نماذج لـ ORM ؛
  3. conf.ini - ملف به متغيرات التكوين ؛
  4. runtime.txt - قيم إصدار Python الثابتة لـ Travis CI ؛
  5. procfile - الإعداد ل gunicorn.
  6. wsgi.py - ملف إطلاق التطبيق مع gunicorn.

لجعل روبوتك يعمل ، تحتاج إلى استبدال البيانات في conf.ini ، وهي:

  • travis_token - تشير إلى الرمز المميز المستلم إلى Travis CI ؛
  • travis_base_url - حدد عنوان Travis CI API ؛
  • travis_repository_id - حدد معرف المستودع مع الاختبارات التلقائية ، داخل Travis CI ؛
  • telegram_chat_id - حدد معرف الدردشة الخاص بـ telegram حيث سيتم إرسال رسائل من bot ؛
  • telegram_bot_url - حدد عنوان url الخاص بالبوت.

مثال Conf.ini
 [travis] travis_token = token HkjhkjgGKJhjgFGfdgd travis_base_url = https://api.travis-ci.org travis_repository_id = 10898384 [telegram] telegram_chat_id = 24234234 telegram_bot_url = https://api.telegram.org/bot87543366:AAHtj9zs-Kv4zGWyu1eTXegikUYMGVjD8g/ 



مبادئ الروبوت

من المهم أن يعطي كل طلب حالة استجابة تبلغ 200. وإلا ، يبدأ التلغراف في إرسال طلبات بشكل دوري حتى يتلقى استجابة صالحة.

الروبوت لديه مجموعة من الأوامر:

يمكن أن يكون المحدد أي أحرف خاصة باستثناء الشرطة السفلية.

  • add_m - إضافة مجموعة اختبار (علامات الثعبان).
    قالب: * command * {kit description} {delimiter} {name mark}.
    مثال: add_m اختبار الطيور / الطيور.
  • add_b - إضافة فرع للاختبار.
    قالب: * command * {وصف الفرع} {delimiter} {اسم الفرع من git}.
    مثال: add_b ماجستير.
  • حدد - يسمح لك باختيار فرع للاختبار بشكل افتراضي.
    قالب: * قيادة *.
    مثال: بعد إدخال الأمر select ، تظهر أزرار لتحديد الفروع التي تمت إضافتها إلى قاعدة البيانات باستخدام الأمر add_b.
  • المدى - الأمر لبدء التجميع.
    قالب: * قيادة *.
    مثال: بعد إدخال الأمر "تشغيل" ، تظهر أزرار تحديد مجموعات الاختبارات التلقائية التي تمت إضافتها إلى قاعدة البيانات باستخدام الأمر add_m. عند بدء التشغيل ، يتم تلقائيًا تحديد الفرع المحدد بواسطة الأمر select.
  • del_m - يزيل مجموعة من الاختبارات.
    القالب: * command * {name name}.
    مثال: del_m bird.
  • del_b - حذف الفروع المدخلة في قاعدة البيانات.
    قالب: * command * {branch from git}.
    مثال: del_b master.

كيف يعمل الروبوت؟

1. يضيف المستخدم مجموعة اختبار (add_m):
يقوم الأمر بتقسيم بيانات المستخدم إلى قسمين - وصف واسم الفرع في بوابة. تتم كتابة الاسم في عمود mark_name داخل قاعدة البيانات ، والوصف في عمود mark_description.

2. يضيف المستخدم فروع (add_b):
يقوم الأمر بتقسيم بيانات المستخدم إلى قسمين - وصف واسم الفرع في بوابة. تتم كتابة الاسم في العمود branch_name داخل قاعدة البيانات ، والوصف في العمود branch_description.

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

4. يبدأ المستخدم تهيئة البنية (التشغيل):
يتلقى المستخدم أزرارًا في الدردشة ، تكونت وفقًا للبيانات من الجداول
mark_description و mark_name. يحدد المستخدم زرًا مع مجموعة لتشغيل الاختبارات التلقائية.

استنادًا إلى البيانات التي حددها المستخدم ، ينشئ الروبوت طلبًا في طريقة التشغيل في فئة TravisCI ويرسله إلى Travis للتنفيذ. داخل نظام Travis ، يتم تنشيط خيار بدء التشغيل. يتجاوز هذا الخيار ملف travis.yml ، مع تغيير قسم البرنامج النصي إلى البيانات المحددة من قبل المستخدم.


نشر على HEROKU


لكي يعمل الروبوت ، يجب نشره في الاستضافة. أوصي باستخدام Heroku ، لأن هذا النظام الأساسي لديه تعريفة مجانية ، والتي توفر الطاقة اللازمة لكي يعمل الروبوت.

كيفية نشر الروبوت؟

لكي لا أصف العملية برمتها ، سأترك رابطًا للوثائق الرسمية للبدء:

إذا كنت ترغب في العمل مع Heroku من خلال واجهة المستخدم الرسومية ، فاملأ الكود على جيثب. تحتاج إلى التسجيل من خلال واجهة الويب Heroku. بعد التسجيل ، انقر فوق جديد -> إنشاء تطبيق جديد -> أدخل اسم التطبيق وحدد المنطقة. انتقل إلى علامة التبويب نشر وحدد التكامل مع جيثب في طريقة النشر.

أمامنا يظهر كتلة للبحث في المستودع. أدخل اسم المستودع وانقر فوق الزر "بحث". في نتائج البحث ، مقابل اسم المستودع ، انقر فوق الزر "اتصال". في كتلة النشر اليدوي ، حدد الفرع وانقر فوق "نشر".

آخر لحظة - تحتاج إلى تنشيط صفحات الويب باستخدام طلب GET:
 https://api.telegram.org/bot{id_}/setWebhook?url=https://{_}.herokuapp.com/bot 


الروبوت يمكن استخدامها. نتحقق من أن كل شيء نجح بالنسبة لنا:

صورة

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


All Articles