Hopp til innhold

اختبارات الوحدة والتحقق

Skip to content

هذا نص مترجم آليًا وقد يحتوي على أخطاء!

اختبار الوحدة والتحقق من الصحة

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

فكيف يمكننا التأكد من أن الكود يعمل كما ينبغي، إذا لم نختبره؟

ما هو اختبار الوحدة؟

اختبار وحدة (Unit Testing) هي طريقة لاختبار أجزاء صغيرة من كودنا بشكل آلي ومنهجي. في بايثون، نستخدم وحدة تسمى pytest لكتابة وتنفيذ الاختبارات. يُعدّ “الوحدة” أصغر جزء قابل للاختبار في التطبيق، وغالبًا ما يكون دالة أو طريقة واحدة. عند استخدام pytest، من المهم اتباع اتفاقيات التسمية الصحيحة حتى يتمكن pytest من اكتشاف اختباراتنا، مثل تسمية ملفات الاختبارات ببادئة test_ وتسمي وظائف الاختبار ببادئة test_.

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

def test_add():
    assert 0.3 + 0.3 + 0.3 == 0.9

يتم تشغيله بكتابة pytest في الطرفية.

حقيقة مثيرة للاهتمام

سيُحدث الكود أعلاه خطأً، لأن .3+.3+.3 يصبح 0.8999999999 في بايثون!

Easy المهمة 1 - تثبيت pytest

قم بتثبيت pytest في بيئتك الافتراضية. يمكنك القيام بذلك عن طريق تشغيل الأمر التالي في الطرفية:

pip install pytest

Easy مهمة 2 - إنشاء اختبار

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

مثال على كيفية ظهور الاختبار:

from main import Person

def test_person_working():
    bob_kaare = Person(name="Bob Kåre",
                       eye_color=EyeColor.BLUE,
                       phone_number=PhoneNumber("12345678"),
                       email=Email("bob_kaare@example.com"))
    assert bob_kaare.name == "Bob Kåre"
    assert bob_kaare.eye_color == EyeColor.BLUE
هذا النوع من الاختبار يسمى "اختبار المسار السعيد"، لأننا نختبر أن كل شيء يعمل كما ينبغي عندما نقدم قيمًا صالحة، وهو ليس مفيدًا جدًا.

متوسط المهمة 3 - اختبار التحقق

أنشئ عدة اختبارات في test_person.py للتحقق من أن التحقق في Email وPhoneNumber يعمل كما ينبغي. اختبر القيم الصالحة وغير الصالحة على حد سواء. هنا يجب عليك استخدام دالة في pytest تسمى raises، والتي تتحقق من حدوث خطأ محدد معين.

import pytest

def test_exception():
    with pytest.raises(KeyError):
        my_dict = {"a": 1, "b": 2}
        value = my_dict["c"]  # هذا سيرفع KeyError

Tip

يمكنك إنشاء العديد من الدوال التي تريدها، طالما أن اسم الدالة يبدأ بـ test_.

الحل: مثال على اختبار لبريد إلكتروني غير صالح
from main import Email

import pytest

def test_invalid_email():
    with pytest.raises(ValueError):
        email = Email("not-an-email")

لماذا نفعل ذلك؟

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

الفيديو: لماذا تحمي الاختبارات الشيفرة من أخطاء جديدة

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

باستخدام برامج مثل جاست (Jest) أو سيلينيوم (Selenium)، على سبيل المثال، يمكنك اختبار المواقع الإلكترونية آليًا، وبالتالي ضمان عمل كل شيء كما ينبغي بعد كل تغيير في الشيفرة. فنحن نود معرفة أن «تسجيل المستخدم» و«الدفع» و「تسجيل الدخول」 تعمل بشكل صحيح، أليس كذلك؟

فكر في السيناريوهات التالية

ماذا يحدث (أو يجب أن يحدث) إذا..:

  • حاول مستخدم التسجيل باستخدام بريد إلكتروني مستخدم بالفعل؟
  • كان لدى مستخدم تاريخ ميلاد في المستقبل؟
  • أدخل مستخدم الاسم “jOHN dOE”؟

A software tester walks into a bar...

Hard المهمة 4 - الاختبار التلقائي (CI)

عندما ننشر الكود على GitHub، يمكننا إعداد ما يسمى GitHub Actions والذي يمكنه تشغيل اختباراتنا تلقائيًا في كل مرة نجري فيها تغييرًا في الكود. يُطلق على هذا اسم التكامل المستمر (CI)، ويساعدنا على التأكد من أن الكود الخاص بنا يعمل دائمًا كما هو متوقع.

أنشئ ملفًا في مجلد المشروع الخاص بك باسم .github/workflows/pytest.yml. في هذا الملف، يجب عليك إضافة الكود التالي:

name: Pytest

on: [push]

jobs:
  build:
    runs-on: ubuntu-latest

    steps:
    - uses: actions/checkout@v4
    - name: Set up Python
      uses: actions/setup-python@v5
      with:
        python-version: '3.11'
    - name: Install dependencies
      run: |
        python -m pip install --upgrade pip
        pip install pytest
        # قم بتثبيت أي تبعيات أخرى يحتاجها مشروعك
        pip install -r requirements.txt
    - name: Run tests with pytest
      run: pytest

إذا قمت بإدراجها بشكل صحيح، فسترى الآن تبويبًا جديدًا في مستودع GitHub الخاص بك يحمل اسم “إجراءات” (Actions). هنا ستتمكن من رؤية اختباراتك تُنفَّذ تلقائيًا كل مرة تقوم فيها بتغيير الكود، وستتلقى إشعارًا إذا فشلت أيٌّ من الاختبارات (علامة خطأ حمراء وعبر البريد الإلكتروني).

ملاحظة حول هيكل الملفات

سيحدد هيكل ملفاتك ما إذا كانت GitHub Actions ستعمل أم لا. تأكد من أن مجلد .github موجود في المجلد الرئيسي لمشروعك، وكذلك الحال بالنسبة لمجلد tests الذي يحتوي على ملفات الاختبار الخاصة بك.

يمكنك عند الضرورة تعديل ملف pytest.yml ليشير إلى المجلد الصحيح.

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

تغطية الكود

يوجد أيضًا ما يُسمى بـ”تغطية الكود”، والذي يمكن أن يساعدك في رؤية مقدار الشيفرة البرمجية التي يتم اختبارها فعليًا. قد يكون هذا مفيدًا لمعرفة هل لديك عدد كافٍ من الاختبارات، أم إن هناك أجزاءً من شيفرتك غير مُختبَرة على الإطلاق.

تتطلب بعض أماكن العمل امتلاك نسبة مئوية معينة من التغطية الاختبارية لشيفرتك قبل نشرها (Deploy)، لضمان متانة الكود وعمله كما هو مطلوب.

ميم الاختبار الوحدوي