مقدمة في الاختبار باستخدام unittest
يُعد الاختبار جزءًا أساسيًا من عملية تطوير البرمجيات، حيث يضمن موثوقية الكود وجودته. في نظام Python البيئي، تعتبر وحدة unittest الحل القياسي لإنشاء وتنفيذ الاختبارات الآلية.
UnitTest هي مكتبة Python مدمجة، مبنية على بنية xUnit، وتوفر للمطورين مجموعة كاملة من الأدوات لإنشاء اختبارات الوحدات، والتحقق من منطق الأعمال، ومراقبة عمل الدوال والكلاسات. الميزة الرئيسية لـ unittest هي أنها جزء من المكتبة القياسية لـ Python ولا تتطلب تثبيتات إضافية.
ما هو unittest ولماذا تحتاجه
Unittest هو إطار عمل لكتابة وتنفيذ الاختبارات في Python، يتبع مبادئ التطوير الموجه بالاختبارات (TDD). يتيح لك إنشاء اختبارات قابلة للتكرار ومعزولة وآلية تساعد في:
- اكتشاف الأخطاء في المراحل المبكرة من التطوير
- ضمان استقرار الكود عند إعادة الهيكلة (refactoring)
- توثيق السلوك المتوقع للدوال
- زيادة الثقة في جودة المنتج البرمجي
أساسيات العمل مع unittest
الهيكل الأساسي للاختبار
للبدء مع unittest، يجب استيراد الوحدة وإنشاء كلاس اختبار:
import unittest
class TestMath(unittest.TestCase):
def test_add(self):
self.assertEqual(2 + 3, 5)
def test_multiply(self):
self.assertEqual(4 * 5, 20)
if __name__ == '__main__':
unittest.main()
المبادئ الأساسية للهيكل
يجب أن يرث كل كلاس اختبار من unittest.TestCase. تبدأ جميع دوال الاختبار بالبادئة test_، مما يسمح للإطار باكتشاف وتنفيذ الاختبارات تلقائيًا. الدالة unittest.main() تقوم بتشغيل جميع الاختبارات الموجودة في الوحدة الحالية.
دورة حياة الاختبارات والـ Fixtures
طرق الإعداد والتنظيف
يوفر unittest طرقًا خاصة لإعداد وتنظيف بيئة الاختبار:
class TestDatabase(unittest.TestCase):
@classmethod
def setUpClass(cls):
"""تُنفذ مرة واحدة قبل جميع اختبارات الكلاس"""
cls.db_connection = create_test_database()
@classmethod
def tearDownClass(cls):
"""تُنفذ مرة واحدة بعد جميع اختبارات الكلاس"""
cls.db_connection.close()
def setUp(self):
"""تُنفذ قبل كل اختبار"""
self.test_data = ["item1", "item2", "item3"]
def tearDown(self):
"""تُنفذ بعد كل اختبار"""
self.test_data.clear()
مستويات الـ Fixtures
تعمل الـ Fixtures في unittest على مستويات مختلفة:
setUp()وtearDown()- لكل اختبار على حدةsetUpClass()وtearDownClass()- لكل كلاس اختبارsetUpModule()وtearDownModule()- لكل وحدة
طرق التأكيد (Assertions)
طرق التحقق الأساسية
يوفر unittest مجموعة غنية من الطرق لأنواع مختلفة من التحقق:
| الطريقة | الوصف | مثال الاستخدام |
|---|---|---|
assertEqual(a, b) |
تتحقق من تساوي a و b | self.assertEqual(2+2, 4) |
assertNotEqual(a, b) |
تتحقق من عدم تساوي a و b | self.assertNotEqual(2+2, 5) |
assertTrue(x) |
تتحقق من صحة x | self.assertTrue(5 > 3) |
assertFalse(x) |
تتحقق من خطأ x | self.assertFalse(5 < 3) |