איך להשתמש ב-PyTest לבדיקות יחידה בפייתון

כשאתה כותב קוד בPython, חשוב לוודא שהקוד שלך עובד כמו שצפית. אחת הדרכים הטובות ביותר לעשות זאת היא באמצעות בדיקות יחידה, שעוזרות לך לבדוק אם חלקים קטנים (או יחידות) של הקוד שלך פועלים כראוי.

במאמר זה, נלמד כיצד לכתוב ולהריץ בדיקות יחידה אפקטיביות ב-Python באמצעות PyTest, אחד ממסגרות הבדיקה הפופולריות ביותר עבור Python.

מהן בדיקות יחידה?

בדיקות יחידה הן בדיקות קטנות ופשוטות שמתמקדות בבדיקת פונקציה אחת או פיסת קוד קטנה. הן עוזרות להבטיח שהקוד שלך עובד כמו שצפית ויכולות לזהות באגים בשלב מוקדם.

בדיקות יחידה יכולות להיכתב עבור חלקים שונים של הקוד שלך, כמו פונקציות, שיטות ואפילו מחלקות. על ידי כתיבת בדיקות יחידה, אתה יכול לבדוק את הקוד שלך מבלי להריץ את התוכנית כולה.

למה להשתמש ב-PyTest?

PyTest היא מסגרת בדיקה פופולרית עבור Python שמפשטת את כתיבת והרצת הבדיקות.

זה פשוט לשימוש ויש לה הרבה תכונות מועילות כמו:

  • זה מאפשר לך לכתוב מקרים פשוטים וברורים של בדיקות.
  • זה מספק תכונות מתקדמות כמו fixtures, בדיקות פרמטריות ותוספים.
  • זה עובד היטב עם כלים וספריות בדיקה אחרות.
  • זה מייצר תוצאות ודוחות בדיקה קלים לקריאה.

הגדרת PyTest בלינוקס

לפני שנתחיל לכתוב בדיקות, אנחנו צריכים להתקין את PyTest. אם אין לך את PyTest מותקן, תוכל להתקין אותו באמצעות מנהל החבילות של פייתון הנקרא pip.

pip install pytest

כאשר PyTest מותקן, אתה מוכן להתחיל לכתוב בדיקות!

כתיבת הבדיקה הראשונה שלך עם PyTest

בואו נתחיל על ידי כתיבת פונקציה פשוטה ואז נכתוב לה בדיקה.

שלב 1: כתיבת פונקציה פשוטה

ראשית, בואו ניצור פונקציה בפייתון שאנו רוצים לבדוק. נניח שיש לנו פונקציה שמחברת שני מספרים:

# add.py
def add(a, b):
    return a + b

זו פונקציה פשוטה שמקבלת שני מספרים a ו- b, מחברת אותם יחד ומחזירה את התוצאה.

שלב 2: כתיבת בדיקה עבור הפונקציה

עכשיו, בואו נכתוב בדיקה עבור פונקציית ההוספה. ב- PyTest, הבדיקות נכתבות בקבצים נפרדים, בדרך כלל בשם test_*.py כדי להקל על זיהוי קבצי הבדיקה.

צור קובץ חדש בשם test_add.py וכתוב את קוד הבדיקה הבא:

# test_add.py
from add import add

def test_add_numbers():
    assert add(2, 3) == 5
    assert add(-1, 1) == 0
    assert add(0, 0) == 0

הסבר על הקוד לעיל:

  • אנו מייבאים את הפונקציה add מהקובץ add.py.
  • אנו מגדירים פונקציית בדיקה בשם test_add_numbers(). ב- PyTest, פונקציית בדיקה צריכה להתחיל עם המילה test_.
  • בתוך פונקציית הבדיקה, אנו משתמשים בהצהרת assert כדי לבדוק אם התוצאה של קריאת פונקציית add תואמת לערך הצפוי. אם התנאי בהצהרת assert הוא True, הבדיקה מצליחה; אחרת, היא נכשלת.

שלב 3: הרץ את הבדיקה

כדי להריץ את הבדיקה, פתח את הטרמינל שלך ועבור לתיקייה שבה נמצא הקובץ test_add.py ואז הרץ את הפקודה הבאה:

pytest

PyTest ימצא אוטומטית את כל קבצי הבדיקה (אלו שמתחילים בtest_) ויריץ את הבדיקות בתוכם. אם הכל פועל כראוי, אתה אמור לראות פלט כזה:

Verifying Python Code Functionality

הנקודה (.) מצביעה על כך שהבדיקה הצליחה. אם היו בעיות, PyTest תציג הודעת שגיאה.

כתיבת בדיקות מתקדמות יותר

עכשיו כשאנחנו יודעים איך לכתוב ולרוץ בדיקה בסיסית, בואו נחקור כמה תכונות מתקדמות יותר של PyTest.

בדיקת חריגות צפויות

לפעמים, אתה רוצה לבדוק אם הקוד שלך מעלה את החריגות הנכונות כשמשהו משתבש. אתה יכול לעשות זאת עם פונקציית pytest.raises().

נניח שאנחנו רוצים לבדוק פונקציה שחלקת שני מספרים. אנחנו רוצים להעלות חריגה אם המספר השני הוא אפס (כדי למנוע שגיאות חלוקה באפס).

הנה פונקציית divide:

# divide.py
def divide(a, b):
    if b == 0:
        raise ValueError("Cannot divide by zero")
    return a / b

עכשיו, בואו נכתוב בדיקה לפונקציה זו שבודקת אם ValueError מועלית כאשר אנו מנסים לחלק באפס:

# test_divide.py
from divide import divide
import pytest

def test_divide_numbers():
    assert divide(10, 2) == 5
    assert divide(-10, 2) == -5
    assert divide(10, -2) == -5

def test_divide_by_zero():
    with pytest.raises(ValueError):
        divide(10, 0)

הסבר על הקוד:

  • הוספנו פונקציית בדיקה חדשה שנקראת test_divide_by_zero().
  • בתוך פונקציה זו, אנו משתמשים ב-pytest.raises(ValueError) כדי לבדוק אם ValueError מתרחש כאשר אנו קוראים לפונקציה של חלוקה עם אפס כארגומנט השני.

הרץ את הבדיקות שוב עם הפקודה pytest. אם הכל עובד כמו שצריך, אתה אמור לראות את הפלט הבא:

Test Your Code with PyTest

שימוש בפיצ'רים להגדרה וניקוי

במקרים מסוימים, ייתכן שתצטרך להגדיר תנאים מסוימים לפני הרצת הבדיקות או לנקות לאחר שהבדיקות הושלמו. PyTest מספק פיצ'רים כדי לנהל זאת.

פיצ'ר הוא פונקציה שאתה יכול להשתמש בה כדי להגדיר או לפרק תנאים עבור הבדיקות שלך. פיצ'רים משמשים לעיתים קרובות כדי ליצור אובייקטים או להתחבר לבסיסי נתונים שנדרשים עבור הבדיקות.

הנה דוגמה לשימוש בפיצ'ר כדי להקים תיקיה זמנית עבור בדיקות של פעולות קבצים:

# test_file_operations.py
import pytest
import os

@pytest.fixture
def temporary_directory():
    temp_dir = "temp_dir"
    os.mkdir(temp_dir)
    yield temp_dir  # This is where the test will run
    os.rmdir(temp_dir)  # Cleanup after the test

def test_create_file(temporary_directory):
    file_path = os.path.join(temporary_directory, "test_file.txt")
    with open(file_path, "w") as f:
        f.write("Hello, world!")
    
    assert os.path.exists(file_path)

הסבר על הקוד:

  • אנו מגדירים פיצ'ר שנקרא temporary_directory שיוצר תיקיה זמנית לפני הבדיקה ומוחק אותה לאחר מכן.
  • פונקציית הבדיקה test_create_file() משתמשת בפיצ'ר זה כדי ליצור קובץ בתיקיה הזמנית ובודקת אם הקובץ קיים.

הרץ את הבדיקות שוב עם הפקודה pytest. PyTest יזהה באופן אוטומטי וישתמש בפיצ'ר.

פרמטריזציה של הבדיקות שלך עם Pytest

לפעמים, אתה רוצה להריץ את אותה בדיקה עם קלטים שונים. PyTest מאפשר לך לעשות זאת בקלות באמצעות parametrize.

נניח שאנו רוצים לבדוק את הפונקציה add עם מספר זוגות של מספרים. במקום לכתוב פונקציות בדיקה נפרדות לכל זוג, אנו יכולים להשתמש ב-pytest.mark.parametrize כדי להריץ את אותה בדיקה עם קלטים שונים.

# test_add.py
import pytest
from add import add

@pytest.mark.parametrize("a, b, expected", [
    (2, 3, 5),
    (-1, 1, 0),
    (0, 0, 0),
    (100, 200, 300)
])
def test_add_numbers(a, b, expected):
    assert add(a, b) == expected

הסבר על הקוד:

  • אנו משתמשים בקישוט pytest.mark.parametrize כדי להגדיר כמה קבוצות קלטים (a, b ו-expected).
  • הבדיקה function test_add_numbers() תרוץ פעם אחת עבור כל קבוצת קלטים.

הרץ את הבדיקות שוב עם הפקודה pytest, שתהריץ את הבדיקה ארבע פעמים, פעם עבור כל קבוצת קלטים.

מסקנה

במאמר זה, למדנו כיצד לכתוב ולהפעיל בדיקות יחידה יעילות ב-Python תוך שימוש ב-PyTest כדי לתפוס באגים מוקדם ולהבטיח שהקוד שלך עובד כפי שמצופה.

PyTest מקל על כתיבה והרצת הבדיקות הללו, ובתכונות החזקות שלו, תוכל להתמודד עם צרכי בדיקה מורכבים יותר ככל שאתה מתקדם במסע שלך ב- Python.

Source:
https://www.tecmint.com/unit-testing-python-code-with-pytest/