302. ExpectedException

[נכתב ע”י ג’ייסון פיין]

שלום,

היום נתקלתי במשהו שלא הכרתי בעולם הUnit Testing שיכול להיות מאוד שימושי ורציתי לשתף אתכם בו.

לפעמים אנחנו רוצים לכתוב Unit Test שאנחנו יודעים שאמור להזרק בו Exception ואנחנו מעוניינים לבדוק שזה קורה באמת ושהException שנזרק הוא הException שאותו ציפינו לקבל.

הרבה פעמים אני רואה קוד שנראה ככה בערך:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
[TestMethod]
public void DivideTest()
{
bool exceptionThrown = false;
try
{
float f = 1000f / 0f;
}
catch (DivideByZeroException)
{
exceptionThrown = true;
}
Assert.IsTrue(exceptionThrown,"No DivideByZeroException was thrown when dividing a float by zero");
}

כמו שאתם רואים הקוד נראה לא משהו עבור בדיקה כה פשוטה (לבדוק שנזרק DivideByZeroException) .

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

בעזרת שימוש בAttribute הזה הבדיקה תראה כך:

1
2
3
4
5
6
[TestMethod]
[ExpectedException(typeof(System.DivideByZeroException))]
public void DivideTest()
{
float f = 1000f/0f;
}

כמו שאתם רואים - הרבה יותר פשוט וקריא.

לעומת זאת יש פה גם חסרונות:

  • אם אנחנו רוצים לבדוק שהException שנזרק מכיל שגיאה מסויימת אז אנחנו לא יכולים – למשל עבור השגיאה OracleException הType הוא תמיד אותו הType אבל הטקסט של השגיאה מכיל משהו אחר כל פעם – ולכן לא נוכל לבדוק ככה שהשגיאה שנזרקה היא הנכונה. רצוי לציין שיש לזה פתרונות בNUnit אבל לא בMS-Test.
  • אם היה לכם UT שבדק כמה Exception ים אז תצטרכו להפרידו לUT ים נפרדים. כמובן שזה לא באמת בעיה היות וככה צריך שהUT יהיו בכל מקרה ולא יבדקו כמה דברים באותו Test.

בברכת "Unit Test גם יכול להיות לא כורעני",

שתף