NUnit
"עיצוב מונחה בדיקות" , זה המושג המדויק... מה הכוונה? ובכן מתוך מספר שיטות תיכנון ועיצוב תוכנה, אחת השיטה נקראת extremeprogramming ואחת מנקודות השיטה הזאת היא שאנו בונים את האפליקציה על בסיס בדיקות. אבל לא כרגיל שאנו בונים את האפליקציה ואז עושים בדיקות, אלא קודם מציבים את הבדיקות ואז בונים את האפליקציה כך שתוכל לעבור את הבדיקות!
אני לא ארחיב כעת על התיאוריה וכל מה שקשור, אני רק אראה צורה מאוד נוחה, שיכולה לשמש בכל אפליקציה, לבצע בדיקות באפליקציה. זה אומנם נראה קצת מסורבל בהתחלה, אבל אחרי שמתרגלים אי אפשר לעזוב את זה :)
קודם כל צריך להוריד את תוכנית ההתקנה ל NUnit
פשוט תורידו את ההתקנה לחלונות ותריצו.
כעת ניצור פרוייקט חדש ונוסיף הפניה ל NUnit. שימו לב שבחרתי פרויקט מסוג class library, זה לא חובה אבל עדיף
כעת נבנה לנו מחלקה חדשה שתייצג ריבוע, הריבוע יודע להחזיר את השטח שלו וניתן לשנות לו את הגודל
public class Cube
{
private int width;
private int height;
public Cube(int w, int h)
{
if (w <= 0)
{
throw new ArgumentOutOfRangeException("width must be a positive integer");
}
if (h <= 0)
{
throw new ArgumentOutOfRangeException("height must be a positive integer");
}
this.width = w;
this.height = h;
}
public void Resize(int w, int h)
{
if (w <= 0)
{
throw new ArgumentOutOfRangeException("width must be a positive integer");
}
if (h <= 0)
{
throw new ArgumentOutOfRangeException("height must be a positive integer");
}
this.width = w;
this.height = h;
}
public int Size
{
get { return width * height; }
}
}
כדי להשתמש ב NUnit עלינו להגדיר לה מה כאן בדיקות , לשם כך נוסיף את הסימון [Test] מעל כל פונקציה שאנו רוצים לבדוק, במקרה שלנו זה Resize ו Size
[Test]
public void Resize(int w, int h)
{
if (w <= 0)
{
throw new ArgumentOutOfRangeException("width must be a positive integer");
}
if (h <= 0)
{
throw new ArgumentOutOfRangeException("height must be a positive integer");
}
this.width = w;
this.height = h;
}
אני חייב להגיד שגם בצורת הבדיקות יש כל מיני גישות... וכמובן שאני אציג את זאת שאני חושב שהיא הכי טובה :)
כדי לבדוק את הריבוע שלי, או כל דבר אחר באפקליציה, אני אצור מחלקה שכל מטרתה הוא לבדיקות. עדיף אפילו ליצור פרוייקט נפרד באותו שם עם תוספת Test בסופו שכל מטרתו הוא לבדוק את הפרוייקט המקורי שלי. ניצור מחלקה נוספת בשם CuteTest.
במחלקה
אני אצור מספר פונקציות כשכל אחת אמורה לבדוק משהו אחר בריבוע שלנו:
public class CuteTest
{
public void GoodTest()
{
Cube c = new Cube(3, 4);
int s = c.Size;
Console.WriteLine("size : " + s);
}
public void BadTest()
{
Cube c = new Cube(-2, 3);
int s = c.Size;
Console.WriteLine("size : " + s);
}
public void AnotherBadTest()
{
Cube c = new Cube(3, 6);
c.Resize(4, -2);
int s = c.Size;
Console.WriteLine("size : " + s);
}
public void ZeroTest()
{
Cube c = new Cube(0, 0);
int s = c.Size;
Console.WriteLine("size : " + s);
}
}
* שימו לב שחלק מהבדיקות אמורות להיכשל כי הכנסתי ערך שלילי...
*הגדרת המחלקה והפונקציות חייבת להיות public
כעת נגיד ל
NUnit שאלו הבדיקות שלנו על ידי הוספת סימון [Test] לפני שם כל פונקציה
[Test]
public void ZeroTest()
{
Cube c = new Cube(0, 0);
int s = c.Size;
Console.WriteLine("size : " + s);
}
ונריץ את UNnit (בעת ההתקנה נוסף לנו פריט לתוכניות בתפריט ההתחלה)
ונטען את הפרוייקט שלנו
אנו רואים שהבדיקות שלנו מופיעות כבר. כעת רק נשאר ללחוץ על הרצה
ואנו רואים שרק בדיקה אחת עברה בהצלחה...
אבל אנחנו כן מרוצים מכך שהשאר לא עברו בהצלחה, ובשבילנו הבדיקות האלה כן מוצלחות כי ציפינו לשגיאה ואכן קיבלנו שגיאה... אז נגיד ל NUnit שהפונקציה אמורה לקבל שגיאה, ואז אם לא נקבל שגיאה אזי הבדיקה נכשלה, ואם כן נקבל שגיאה כצפוי אז הבדיקה נחשבת כמוצלחת
[Test]
[ExpectedException(typeof(ArgumentOutOfRangeException))]
public void BadTest()
{
Cube c = new Cube(-2, 3);
int s = c.Size;
Console.WriteLine("size : " + s);
}
ונריץ שוב
NUnit מגיע גם שורת פקודה ולא רק עם GUI כך שניתן להריץ אותו באופן אוטומטי לאחר כל בניה של פרוייקט על ידי שינוי ההגדרות של בניית הפרוייקט בויז'ואל סטודיו.
יש ב NUnit עוד הרבה אפשרויות כמו למשל Assert שדומה למחלקה Debug שיש בדוט נט. אצלנו הפונקציות היו פשוטות ורק בדקתי שאכן הריבוע שלי מוכן לקבל ערכים חוקיים בלבד, אך איך לבדוק שהגודל שהוא מחזיר לי הוא אכן תקין?
לשם כך נשתמש ב Assert
[Test]
public void GoodTest()
{
Cube c = new Cube(3, 4);
int s = c.Size;
Assert.AreEqual(s, 3 * 4);
Console.WriteLine("size : " + s);
}
כעת אם התוצאה לא תהיה נכונה אזי הבדיקה תיכשל
אפשר להמשיך עוד הרבה אבל אני אשאיר לכם לגלות לבד את עולם הבדיקות האוטומטיות, העיקר שהתקנתם והתחלתם...
להורדת הפרוייקט