**היום נלמד על פייתון unittest ונסתכל על דוגמאות של תוכניות לדוגמא ב- python unit test. בשיעור הקודם למדנו על פונקציית zip ב- python.**
פייתון unittest
מודול unittest של פייתון משמש לבדיקת יחידות בקוד המקור. לדוגמא, אם יש לך פרויקט ואתה רוצה לבדוק אותו, יש לך רעיון אילו נתונים אמורה הפונקציה להחזיר. אחרי כתיבת קוד נרחב, יש לך צורך לבדוק אם הפלט נכון או לא. לרוב, אנו פשוט מדפיסים את הפלט ומשווים אותו עם קובץ הפלט המקורי או בודקים את הפלט באופן ידני. כדי להקל על התהליך, פייתון הציעה את מודול unittest. באמצעות מודול זה, תוכל לבדוק את הפלט של הפונקציה באמצעות קוד פשוט. במהלך השיעור נדבר על שימוש בסיסי של מודול unittest של פייתון ונכתוב כמה מבחני יחידה לבדיקת פונקציות של מחלקה.
מקור לדוגמא של פייתון Unit Test
ראשית, עלינו לכתוב קצת קוד לבדיקת היחידה. ניצור כיתה ב-Python, ששמה Person
. המטרה העיקרית של הכיתה היא לאחסן ולשלב את שם האדם. לכן, נכתוב פונקציה 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 IDE, תוכל פשוט ללחוץ 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 תוצאות אפשריות. הן מובאות למטה:
- OK: אם כל מקרי הבדיקה עוברים בהצלחה, הפלט מציג OK.
- כישלון: אם יש כישלון באחת ממקרי הבדיקה ויש חריגת AssertionError
- שגיאה: אם יש חריגה שאינה חריגת 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()
שים לב שמודול unittest מפעיל את פונקציות הבדיקה לפי סדר שמותיהן, ולא לפי הסדר בו הן מוגדרות. ומכיוון שרוצים שהבדיקה של 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