وحدة اختبار Python – مثال على اختبار الوحدة

اليوم سنتعلم عن اختبارات الوحدة في بايثون ونلقي نظرة على أمثلة برامج اختبارات الوحدة في بايثون. في الدرس السابق تعلمنا عن وظيفة الضغط في بايثون.

وحدة اختبارات بايثون

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

مثال على اختبارات الوحدة في بايثون

أولاً يجب علينا كتابة بعض الشفرة لاختبار الوحدات. سنقوم بإنشاء فئة Python. الهدف الرئيسي للفئة هو تخزين واسترجاع اسم الشخص. لذا، سنقوم بكتابة دالة set_name() لتخزين البيانات ودالة get_name() لاسترجاع الاسم من الفئة.

class Person:
    name = []

    def set_name(self, user_name):
        self.name.append(user_name)
        return len(self.name) - 1

    def get_name(self, user_id):
        if user_id >= len(self.name):
            return 'There is no such user'
        else:
            return self.name[user_id]


if __name__ == '__main__':
    person = Person()
    print('User Abbas has been added with id ', person.set_name('Abbas'))
    print('User associated with id 0 is ', person.get_name(0))

لقد أطلقنا اسم الملف الخاص بالفئة بـ Person.py. وسيكون إخراج الشفرة أعلاه كما يلي.

$ python3.6 Person.py 
User Abbas has been added with id  0
User associated with id 0 is  Abbas
$

هيكلة اختبارات وحدة Python

الآن، دعنا نتعلم كيفية كتابة شفرة اختبار الوحدات. يتم إنشاء حالة اختبار فردية عن طريق توريث unittest.TestCase. من خلال تجاوز أو إضافة الوظائف المناسبة، يمكننا إضافة منطق الاختبار. ستنجح الشفرة التالية إذا كانت قيمة a تساوي قيمة b.

import unittest


class Testing(unittest.TestCase):
    def test_string(self):
        a = 'some'
        b = 'some'
        self.assertEqual(a, b)

    def test_boolean(self):
        a = True
        b = True
        self.assertEqual(a, b)

if __name__ == '__main__':
    unittest.main()

كيفية تشغيل وحدة اختبار Python

إذا كنت تستخدم بيئة تطوير PyCharm، يمكنك ببساطة الضغط على ctrl+shift+F10 لتشغيل وحدة الاختبار. وإلا، يمكنك استخدام موجه الأوامر لتشغيل هذه الوحدة. على سبيل المثال، لقد قمنا بتسمية الملف لاختبار الوحدات كـ Basic_Test.py. لذا، سيكون الأمر لتشغيل اختبار الوحدات بلغة Python كما يلي: $python3.6 -m unittest Basic_Test.Testing. إذا كنت ترغب في رؤية النتائج بتفصيل، فسيكون الأمر كالتالي: $python3.6 -m unittest -v Basic_Test.Testing. باستخدام PyCharm، نحصل على الإخراج التالي.

نتيجة اختبار الوحدات في Python والوظائف الأساسية

تحتوي هذه وحدة الاختبار على 3 نتائج ممكنة. وهي كما يلي:

  1. موافق: إذا نجحت جميع حالات الاختبار، يظهر الإخراج “موافق”.
  2. فشل: إذا فشلت أي من حالات الاختبار ورفعت استثناء AssertionError
  3. خطأ: إذا رفع أي استثناء آخر غير استثناء AssertionError.

هناك العديد من الوظائف تحت وحدة الاختبار. وهي مذكورة أدناه.

Method Checks that
assertEqual(a,b) a==b
assertNotEqual(a,b) a != b
assertTrue(x) bool(x) is True
assertFalse(x) bool(x) is False
assertIs(a,b) a is b
assertIs(a,b) a is b
assertIsNot(a, b) a is not b
assertIsNone(x) x is None
assertIsNotNone(x) x is not None
assertIn(a, b) a in b
assertNotIn(a, b) a not in b
assertIsInstance(a, b) isinstance(a, b)
assertNotIsInstance(a, b) not isinstance(a, b)

مثال على اختبار وحدة Python

الآن حان وقت كتابة اختبارات الوحدة لصنفنا الأصلي Person. في هذا الصنف قمنا بتنفيذ وظيفتين – get_name() و set_name(). الآن، سنقوم باختبار تلك الوظائف باستخدام unittest. لذلك، قمنا بتصميم حالتين اختباريتين لتلك الوظائف. اطلع على الشفرة التالية، ستفهمها بسهولة.

import unittest

# هذا هو الصنف الذي نريد اختباره. لذلك، نحتاج إلى استيراده
import Person as PersonClass


class Test(unittest.TestCase):
    """
    The basic class that inherits unittest.TestCase
    """
    person = PersonClass.Person()  # instantiate the Person Class
    user_id = []  # variable that stores obtained user_id
    user_name = []  # variable that stores person name

    # وظيفة حالة الاختبار للتحقق من وظيفة Person.set_name
    def test_0_set_name(self):
        print("Start set_name test\n")
        """
        Any method which starts with ``test_`` will considered as a test case.
        """
        for i in range(4):
            # تهيئة اسم
            name = 'name' + str(i)
            # تخزين الاسم في متغير القائمة
            self.user_name.append(name)
            # الحصول على معرف المستخدم الذي تم الحصول عليه من الوظيفة
            user_id = self.person.set_name(name)
            # التحقق مما إذا كان معرف المستخدم الذي تم الحصول عليه فارغًا أم لا
            self.assertIsNotNone(user_id)  # null user id will fail the test
            # تخزين معرف المستخدم في القائمة
            self.user_id.append(user_id)
        print("user_id length = ", len(self.user_id))
        print(self.user_id)
        print("user_name length = ", len(self.user_name))
        print(self.user_name)
        print("\nFinish set_name test\n")

    # وظيفة حالة الاختبار للتحقق من وظيفة Person.get_name
    def test_1_get_name(self):
        print("\nStart get_name test\n")
        """
        Any method that starts with ``test_`` will be considered as a test case.
        """
        length = len(self.user_id)  # total number of stored user information
        print("user_id length = ", length)
        print("user_name length = ", len(self.user_name))
        for i in range(6):
            # إذا لم يتجاوز الفهرس الطول الإجمالي، التحقق من الاسم المُرجَع
            if i < length:
                # إذا لم يتطابق الاسمين، فإنه سيفشل حالة الاختبار
                self.assertEqual(self.user_name[i], self.person.get_name(self.user_id[i]))
            else:
                print("Testing for get_name no user test")
                # إذا تجاوز الفهرس الطول، التحقق من رسالة النوع 'لا يوجد مستخدم بهذا الاسم'
                self.assertEqual('There is no such user', self.person.get_name(i))
        print("\nFinish get_name test\n")


if __name__ == '__main__':
    # بدء unittest.main()
    unittest.main()

لاحظ أن وحدة الاختبار تنفذ وظائف الاختبار بترتيب أسمائها، وليس بترتيب تعريفها. وبما أننا نريد أن يتم تنفيذ اختبارنا لـ set_name أولاً، فقد أطلقنا على وظائف حالات الاختبار أسماء test_0_set_name و test_1_get_name.

مثال على إختبار وحدة Python

تظهر الصور أدناه الناتج الذي يتم إنتاجه بواسطة برنامج اختبار الوحدة لدينا – سواء في الوضع العادي أو في وضع التفصيل.

$ python3.6 -m unittest -v PersonTest.Test
test_0_set_name (PersonTest.Test) ... Start set_name test

user_id length =  4
[0, 1, 2, 3]
user_name length =  4
['name0', 'name1', 'name2', 'name3']

Finish set_name test

ok
test_1_get_name (PersonTest.Test) ... 
Start get_name test

user_id length =  4
user_name length =  4
Testing for get_name no user test
Testing for get_name no user test

Finish get_name test

ok

----------------------------------------------------------------------
Ran 2 tests in 0.000s

OK
$

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

Source:
https://www.digitalocean.com/community/tutorials/python-unittest-unit-test-example