מה ההבדל בין Assert ל Exception?
כל תשתית לכתיבת unit tests שאני מכיר היום משתמשת במחלקה Assert בכדי לקבוע בסוף תרחיש הבדיקה, האם הבדיקה הצליחה או נכשלה.
אבל מה ההבדל בין זה לבין throw new Exception?
ראשית נבין איזה שימוש נרצה בדרך כלל לעשות בכל אחד מהשניים ואיך נשתמש בהם.
המחלקה Assert
פירוש המילה Assert באנגלית היא "לטעון" במהלך/לאחר תרחיש הבדיקה שכתבתנו, נטען טענה, אם הטענה שאנחנו טוענים אינה מתקיימת תרחיש הבדיקה יוגדר כנכשל.
איך זה עובד?
ישנה מחלקה סטטית בשם Assert המכילה מספר רב של סוגי טענות.
היום נעבור על מספר דוגמאות שבעיני חשובות להבנת הקונספט.
Assert.Fail(string)
מקבל כפרמטר מחרוזת, יכשיל את הבדיקה ויציג את המחרוזת כהודעת שגיאה
Assert.AreEqual(object, object, string)
יקבל כפרמטר שני אובייקטים (לדוג': string, int וכו') ומחרוזת, ויכשל אם האובייקטים אינם שווים. המחרוזת תוצג כהודעת השגיאה.
Assert.IsTrue(bool, string)
יקבל ביטוי בוליאני, ויוודא שערכו 'אמת', אם ערכו שקר יכשיל את תרחיש הבדיקה ויציג את המחרוזת שקיבל כהודעת שגיאה.
על מנת לראות פעולות נוספות של המחלקה Assert ניתן להיכנס לקישור הבא - Assert Class
דוגמה לתרחיש בדיקה המשתמש ב Assert
בתרחיש אפשר לראות שאנחנו מוודאים כי מספר ש"קיבלנו מ DataBase" שווה למספר לו ציפינו, אם אינם שווים תרחיש הבדיקה יכשל ותודפס הודעת השגיאה.
המחלקה Exception
השימוש ב Exception מעט שונה, נשתמש ב Exception כאשר נרצה לזרוק הודעת שגיאה למשתמש.
אופן השימוש יראה כך:
ישנן המון מחלקות אשר יורשות מהמחלקה Exception ומטרתן העיקרית היא לפרש את משמעות הException.
דוגמה טובה תהיה TimeOutException שהיא מחלקת בן של Exception, כאשר ייזרק TimeOutException נבין ישר מה הבעיה והודעת שגיאה לא תהיה רלוונטית במקרה זה.
דוגמה טובה תהיה TimeOutException שהיא מחלקת בן של Exception, כאשר ייזרק TimeOutException נבין ישר מה הבעיה והודעת שגיאה לא תהיה רלוונטית במקרה זה.
אז מה ההבדל בין Exception ל Assert?
מעבר לאסטטיות וקריאות הקוד כאשר נשתמש בAssert על פני Exception קיימים יתרונות נוספים לAssert.
מה שגורם לTest להיכשל הוא Exception שנזרק.
אבל איפה אנחנו זורקים Exception כשאנחנו משתמשים בAssert?
אז זהו, כאשר טענה שנטענה (Assertion) אינה נכונה, נזרק Exception בשם AssertFailException והכשלון מנוהל ידי תשתית הUnitTest שלנו, (NUnit במקרה הזה).
ההבדלים בניהול של NUnit ב - Test שנכשל כתוצאה מ Exception ל Test שנכשל כתוצאה מAssert בוהקים למדי.
כאשר Test יכשל בגלל Exception שייזרק הצגת הכישלון תראה כך:
תרחיש הבדיקה נכשל וההודעה שהתבקשה הוצגה.
כאשר Test יכשל בגלל Assert ניתן יהיה לראות ניהול כישלון שונה לחלוטין.
מעבר להודעת הException ניתן לראות ש NUnit בודד לנו את סיבת השגיאה והציג אותה!
מה שגורם לTest להיכשל הוא Exception שנזרק.
אבל איפה אנחנו זורקים Exception כשאנחנו משתמשים בAssert?
אז זהו, כאשר טענה שנטענה (Assertion) אינה נכונה, נזרק Exception בשם AssertFailException והכשלון מנוהל ידי תשתית הUnitTest שלנו, (NUnit במקרה הזה).
ההבדלים בניהול של NUnit ב - Test שנכשל כתוצאה מ Exception ל Test שנכשל כתוצאה מAssert בוהקים למדי.
כאשר Test יכשל בגלל Exception שייזרק הצגת הכישלון תראה כך:
תרחיש הבדיקה נכשל וההודעה שהתבקשה הוצגה.
כאשר Test יכשל בגלל Assert ניתן יהיה לראות ניהול כישלון שונה לחלוטין.
מעבר להודעת הException ניתן לראות ש NUnit בודד לנו את סיבת השגיאה והציג אותה!
סיכום
בפוסט של היום למדנו על השימוש בAssert וב Exception ומתי כדאי לנו להשתמש בכל אחד.
אני ממליץ בחום לפתוח את תרחישי הבדיקה הישנים שכתבת ולראות, האם יש תרחישי בדיקה שהוכשלו באמצעות Exception? האם ישנם תרחישי בדיקה המכילים Assert-ים שיכולים להכתב באופן שונה? לדוגמה,
Assert.IsTrue(x == 3);
ניתן ורצוי להחליף ב -
Assert.AreEqual(x,3);
עד כאן להיום,
נתראה בפוסט הבא!
תגובות
הוסף רשומת תגובה