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

Skip to content

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

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

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

ما هو Unit Testing؟

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

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

def test_add():
    # اختبار الجمع
    assert 0.3 + 0.3 + 0.3 == 0.9

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

Fun fact

الكود أعلاه سيفشل، لأن ‎.3+.3+.3 يصبح 0.8999999999 في بايثون!

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

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

pip install pytest
# تثبيت 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

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

Medium المهمة 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_.

Løsning: Eksempel på en test for ugyldig e-post
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”. هنا، يمكنك رؤية اختباراتك وهي تعمل تلقائيًا في كل مرة تجري فيها تغييرًا على التعليمات البرمجية، وستتلقى إشعارًا إذا فشلت أي من الاختبارات (علامة X حمراء وعبر البريد الإلكتروني).

Merknad om filstruktur

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

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

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

Code Coverage

هناك شيء يسمى أيضًا “Code Coverage” (تغطية الكود)، والذي يمكن أن يساعدك في رؤية مقدار الكود الخاص بك الذي يتم اختباره بالفعل. قد يكون هذا مفيدًا لمعرفة ما إذا كان لديك عدد كافٍ من الاختبارات، أو ما إذا كانت هناك أجزاء من الكود الخاص بك لا يتم اختبارها على الإطلاق.

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

Unit Test Meme