مرحبا بالجميع!
نواصل
المقال حول التعارف مع الاختبارات في Python ، والذي أعددناه لك كجزء من دورة
مطور Python الخاص بنا.
اختبار إطار عمل جانغو وقارورةإذا قمت بكتابة اختبارات لتطبيقات الويب باستخدام أحد الأطر الشائعة ، على سبيل المثال ، Django أو Flask ، فمن الجدير بنا أن نتذكر الاختلافات المهمة في كتابة هذه الاختبارات وتشغيلها.
كيف تختلف عن غيرها من التطبيقاتفكر في الكود الذي تريد اختباره في تطبيق ويب. تتطلب جميع الطرق والآراء والنماذج الكثير من الواردات والمعرفة بالإطار المستخدم.
هذا مشابه لاختبار سيارة ، تمت مناقشتها في الجزء الأول من البرنامج التعليمي: قبل إجراء اختبارات بسيطة ، مثل فحص المصابيح الأمامية ، تحتاج إلى تشغيل الكمبيوتر في السيارة.
يبسط Django و Flask هذه المهمة ويوفران إطارًا للاختبار على أساس unittest. يمكنك الاستمرار في كتابة الاختبارات بالطريقة المعتادة ، ولكن قم بإجراءها بشكل مختلف قليلاً.
كيفية استخدام جانغو اختبار الجلاد
يقوم قالب بدء تطبيق Django بإنشاء ملف tests.py في دليل التطبيق الخاص بك. إذا لم يكن موجودًا بالفعل ، فقم بإنشائه بالمحتويات التالية:
from django.test import TestCase class MyTestCase(TestCase):
الفرق الرئيسي من الأمثلة السابقة هو أنك تحتاج إلى أن ترث من
django.test.TestCase
، وليس
unittest.TestCase
. API من هذه الفئات هو نفسه ، ولكن فئة Django TestCase إعداد كل شيء للاختبار.
لتشغيل مجموعة اختبار ، استخدم
manage.py
test بدلاً من unittest في سطر الأوامر:
$ python manage.py test
إذا كنت بحاجة إلى عدة ملفات اختبار ، استبدل tests.py بمجلد الاختبارات ، ضع فيه ملفًا فارغًا يسمى
__init__.py
وقم بإنشاء ملفات
test_*.py
. سوف Django الكشف عنها وتنفيذها.
تتوفر المزيد من المعلومات على
موقع وثائق Django .
كيفية استخدام Unittest وقارورة
للعمل مع Flask ، يجب استيراد تطبيق ووضعه في وضع الاختبار. يمكنك إنشاء عميل اختبار واستخدامه لإرسال الطلبات إلى أي طرق في التطبيق الخاص بك.
يتم إنشاء مثيل عميل اختبار في طريقة setUp لحالة الاختبار الخاصة بك. في المثال التالي ، my_app هو اسم التطبيق. لا تقلق إذا كنت لا تعرف ما الذي يقوم به setUp. سنلقي نظرة فاحصة على قسم "المزيد من برامج الاختبار المتقدمة".
سيبدو الرمز في ملف الاختبار كما يلي:
import my_app import unittest class MyTestCase(unittest.TestCase): def setUp(self): my_app.app.testing = True self.app = my_app.app.test_client() def test_home(self): result = self.app.get('/')
يمكنك بعد ذلك تشغيل حالات الاختبار باستخدام الأمر
python -m unittest discover.
المزيد من المعلومات متاح على موقع وثائق Flask.
أكثر تقدما اختبار البرامج النصيةقبل البدء في إنشاء اختبارات لتطبيقك ، تذكر الخطوات الرئيسية الثلاثة لأي اختبار:
- إنشاء معلمات الإدخال ؛
- تنفيذ التعليمات البرمجية ، تلقي بيانات الإخراج ؛
- مقارنة بيانات المخرجات بالنتيجة المتوقعة ؛
يمكن أن يكون هذا أكثر تعقيدًا من إنشاء قيمة ثابتة للبيانات المصدر مثل سلسلة أو رقم. في بعض الأحيان يتطلب التطبيق الخاص بك مثيل لفئة أو سياق. ماذا تفعل في هذه الحالة؟
تسمى البيانات التي تقوم بإنشائها كمصدر إنشاء وإعادة استخدام المباريات ممارسة شائعة.
يُطلق على نفس الاختبار عدة مرات بقيم مختلفة تحسباً للنتيجة نفسها.
معالجة الفشل المتوقعفي وقت سابق ، عندما قمنا بتجميع قائمة من البرامج النصية لاختبار
sum()
، نشأ السؤال: ماذا يحدث عندما نقدم قيمة سيئة ، على سبيل المثال ، عدد صحيح واحد أو سلسلة؟
في هذه الحالة ، من المتوقع أن يقوم
sum()
برمي خطأ. في حالة حدوث خطأ ، سيفشل الاختبار.
هناك طريقة محددة للتعامل مع الأخطاء المتوقعة. يمكنك استخدام
.assertRaises()
كمدير للسياق ، ثم تنفيذ خطوات الاختبار داخل الكتلة
with
:
import unittest from my_sum import sum class TestSum(unittest.TestCase): def test_list_int(self): """ , """ data = [1, 2, 3] result = sum(data) self.assertEqual(result, 6) def test_list_fraction(self): """ , """ data = [Fraction(1, 4), Fraction(1, 4), Fraction(2, 5)] result = sum(data) self.assertEqual(result, 1) def test_bad_type(self): data = "banana" with self.assertRaises(TypeError): result = sum(data) if __name__ == '__main__': unittest.main()
سيتم تمرير حالة الاختبار هذه فقط إذا قام
sum(data)
بإلقاء TypeError. يمكنك استبدال TypeError بأي نوع آخر من الاستثناءات.
عزل سلوك التطبيقفي الجزء الأخير من البرنامج التعليمي ، تحدثنا عن الآثار الجانبية. إنها تعقد اختبار الوحدة ، نظرًا لأن كل تشغيل تجريبي يمكن أن يؤدي إلى نتيجة مختلفة أو أسوأ - يمكن أن يؤثر اختبار واحد على حالة التطبيق بأكمله ويؤدي إلى فشل اختبار آخر!
هناك بعض التقنيات البسيطة لاختبار أجزاء من التطبيق مع الكثير من الآثار الجانبية:
- إعادة بيع التعليمات البرمجية وفقًا لمبدأ المسؤولية الفردية ؛
- يسخر من جميع الطرق ويدعو وظيفة للقضاء على الآثار الجانبية ؛
- استخدام اختبارات التكامل بدلاً من اختبارات الوحدة لهذه الشريحة من التطبيق.
- إذا لم تكن معتادًا على تناول الدخان ، فراجع بعض الأمثلة الرائعة لاختبار Python CLI .
اختبارات تكامل الكتابةحتى الآن ، لقد أولينا المزيد من الاهتمام لاختبارات الوحدة. اختبار الوحدة هو وسيلة رائعة لإنشاء رمز يمكن التنبؤ به ومستقر. ولكن في النهاية ، يجب أن يعمل التطبيق الخاص بك عند بدء التشغيل!
اختبار التكامل ضروري للتحقق من تعاون العديد من مكونات التطبيق. قد يتطلب هذا الاختبار القيام بدور المشتري أو المستخدم:
- استدعاء HTTP REST API ؛
- استدعاء بيثون API ؛
- مكالمة خدمة الويب ؛
- تشغيل سطر الأوامر.
كل هذه الأنواع من اختبارات التكامل يمكن كتابتها بنفس طريقة اختبارات الوحدة ، باتباع قالب معلمات الإدخال ، التنفيذ ، الموافقة. الفرق الأكثر أهمية هو أن اختبارات التكامل تختبر في وقت واحد المزيد من المكونات ، مما يعني أنها ستؤدي إلى آثار جانبية أكثر من اختبارات الوحدة. بالإضافة إلى ذلك ، تتطلب اختبارات التكامل المزيد من التركيبات ، مثل قاعدة البيانات أو مقبس الشبكة أو ملف التكوين.
لذلك ، يوصى بفصل اختبارات الوحدة واختبارات التكامل. يستغرق إنشاء تركيبات لتركيبات التكامل ، على سبيل المثال ، قاعدة بيانات الاختبار أو حالات الاختبار نفسها ، وقتًا أطول بكثير من إجراء اختبارات الوحدة ، لذلك يجب إجراء اختبارات التكامل قبل الدخول في الإنتاج بدلاً من تشغيلها في كل مرة تلتزم فيها.
إن أبسط طريقة لفصل اختبارات الوحدة والتكامل هي وضعها في مجلدات مختلفة.
project/
│
├── my_app/
│ └── __init__.py
│
└── tests/
|
├── unit/
| ├── __init__.py
| └── test_sum.py
|
└── integration/
├── __init__.py
└── test_integration.py
يمكنك تشغيل مجموعة معينة من الاختبارات بطرق مختلفة. يمكن إضافة علامة لتحديد الدليل المصدر ، -s ، إلى unittest اكتشف باستخدام مسار يحتوي على اختبارات:
$ python -m unittest discover -s tests/integration
unittest سيعرض جميع النتائج في دليل الاختبارات / التكامل.
اختبار التطبيقات الموجهة للبياناتتتطلب اختبارات التكامل العديد من البيانات الخلفية ، مثل قاعدة بيانات مع قيم محددة. افترض أنك بحاجة إلى اختبار للتحقق من التشغيل الصحيح للتطبيق مع أكثر من 100 عميل في قاعدة البيانات ، أو للتحقق من صحة عرض صفحة الطلب ، حتى لو كانت جميع أسماء البضائع باللغة اليابانية.
تعتمد هذه الأنواع من اختبارات التكامل على تركيبات اختبار مختلفة لضمان تكرارها وإمكانية التنبؤ بها.
يجب تخزين بيانات الاختبار في مجلد التركيبات داخل دليل اختبارات التكامل للتأكيد على "قابليتها للاختبار". ثم في الاختبارات ، يمكنك تحميل البيانات وتشغيل الاختبار.
فيما يلي مثال على بنية البيانات التي تتكون من ملفات JSON:
project/
│
├── my_app/
│ └── __init__.py
│
└── tests/
|
└── unit/
| ├── __init__.py
| └── test_sum.py
|
└── integration/
|
├── fixtures/
| ├── test_basic.json
| └── test_complex.json
|
├── __init__.py
└── test_integration.py
في حالة الاختبار ، يمكنك استخدام طريقة .setUp () لتحميل بيانات الاختبار من ملف التثبيت بطريقة معروفة وتشغيل العديد من الاختبارات باستخدام هذه البيانات. تذكر أنه يمكنك تخزين العديد من حالات الاختبار في ملف Python واحد ، وسوف يقوم unittest بالعثور عليها وتنفيذها. يمكنك الحصول على حالة اختبار واحدة لكل مجموعة من بيانات الاختبار:
import unittest class TestBasic(unittest.TestCase): def setUp(self):
إذا كان التطبيق الخاص بك يعتمد على بيانات من موقع بعيد ، مثل واجهة برمجة التطبيقات عن بُعد ، فتأكد من تكرار الاختبارات. قد يتأخر التطوير بسبب الاختبارات التي فشلت عند تعطيل واجهة برمجة التطبيقات ومشكلات الاتصال. في مثل هذه الحالات ، من الأفضل تخزين التركيبات عن بُعد محليًا ليتم استعادتها وإرسالها إلى التطبيق.
تحتوي مكتبة
requests
على حزمة استجابة مجانية تسمح لك بإنشاء تركيبات استجابة وحفظها في مجلدات الاختبار. اكتشف المزيد
على صفحة جيثب الخاصة بهم .
الجزء التالي سيكون حول الاختبار في العديد من البيئات واختبار التشغيل الآلي.
النهاية
التعليقات / الأسئلة هي دائما موضع ترحيب. هنا أو الذهاب إلى
ستاس في
يوم مفتوح .