Nunit | בדיקות מבוססות נתונים - Data Driven Tests
פעמים רבות אנו נדרשים לבצע תרחישי בדיקה אוטומטיים על קונפיגורציות משתנות.
בדוגמאות אציג:
- קבלת פרמטרים רגילים לבדיקה - Parametrized Test
- קבלת רשימת פרמטרים לבדיקה - TestCaseSource
- קבלת פרמטרים לבדיקה מקובץ חיצוני - External TestCaseSource
הנושא הינו נושא בסיסי ומוכר מאוד בתחום הבדיקות וחשוב להכירו לעומק.
דרישות קדם: תכנות בסיסי בC#, היכרות עם NUnit
דרישות קדם: תכנות בסיסי בC#, היכרות עם NUnit
תחילה נדבר על תרחיש הבדיקות עליו נתבסס במהלך המדריך
התרחיש בסיסי מאוד - מקבל מספר כפרמטר ומדפיס את המספר בכפולה של 2.
איך התרחיש יקבל מספר כפרמטר?
קבלת פרמטרים רגילים לבדיקה - Parametrized Test
באמצעות הכנסת פרמטרים ב-TestCase attribute, ניתן לתת לתרחיש הבדיקה שלנו נתונים לעבוד איתם.
זה יקרה באופן הבא:
[TestCase(123)]
public void DoubleTheNumber(int num)
{
Console.WriteLine(num * 2);
}
כעת num יקבל את השלם - 123 כפרמטר.
נריץ את הבדיקה ונוכל לצפות בפלט שלה באופן הבא:
זוהי הדרך הבסיסית והפשוטה ביותר להכנסת פרמטרים לTest.
אבל מה אם יהיה לנו יותר מתרחיש בדיקה אחד במחלקה ונרצה להכניס לכולם את אותה רשימת פרמטרים?
לא כל הבדיקות נמצאות באותה המחלקה מפני שהן מחולקות לפי נושאים.
לא נרצה ליצור רשימה בכל מחלקה ולתחזק אותה נכון?
כאן תידרש היכולת לעבוד עם קובץ פרמטרים חיצוני שאליו כל תרחישי הבדיקה שלנו יפנו.
איך עושים את זה?
אבל מה אם יהיה לנו יותר מתרחיש בדיקה אחד במחלקה ונרצה להכניס לכולם את אותה רשימת פרמטרים?
קבלת רשימת פרמטרים לבדיקה - TestCaseSource
באמצעות שימוש ב TestCaseSource Attribute נוכל לקרוא לרשימת פרמטרים עליהם ירוץ תרחיש הבדיקה שלנו.
בדוגמה ניתן לראות את כיצד יצרנו מערך של טיפוסים מסוג int והכנסנו אותם כפרמטרים לבדיקה.
הדבר הכי יפה בסיפור הזה הוא שלאחר שנקמפל את הקוד נראה שנוצר Test נפרד עבור כל אחד מהאיברים במערך
אוקיי, זה מגניב, אבל בוא נניח שיש לנו רשימת תרחישי בדיקות ארוכה.בדוגמה ניתן לראות את כיצד יצרנו מערך של טיפוסים מסוג int והכנסנו אותם כפרמטרים לבדיקה.
הדבר הכי יפה בסיפור הזה הוא שלאחר שנקמפל את הקוד נראה שנוצר Test נפרד עבור כל אחד מהאיברים במערך
לא כל הבדיקות נמצאות באותה המחלקה מפני שהן מחולקות לפי נושאים.
לא נרצה ליצור רשימה בכל מחלקה ולתחזק אותה נכון?
כאן תידרש היכולת לעבוד עם קובץ פרמטרים חיצוני שאליו כל תרחישי הבדיקה שלנו יפנו.
איך עושים את זה?
קבלת פרמטרים לבדיקה מקובץ חיצוני - External TestCaseSource
ראשית ניצור קובץ csv (בכונן C לצורך העניין) ובו נשים כמה פרמטרים שנרצה באופן הבא:
כעת, ניצור מחלקת עזר בשם TestDataHelper שתכיל את הלוגיקה של קריאת קובץ הקונפיגורציה.
בפעולת ה get של TestCases קראנו את את התוכן של קובץ ה csv שורה אחר שורה והוספנו את הערכים מהקובץ לתוך רשימה.
עכשיו כל מה שנשאר לעשות זה רק לבקש את רשימת הפרמטרים שלנו לTest.
עכשיו כל מה שנשאר לעשות זה רק לבקש את רשימת הפרמטרים שלנו לTest.
[Test, TestCaseSource(typeof(TestDataHelper),"TestCases")]
public void DoubleTheNumber(int num)
{
Console.WriteLine(num * 2);
}
הפעם אפשר לראות שהתווסף פרמטר ל TestCaseSourse Attribute - הפרמטר מגדיר את סוג המחלקה ממנה נקבל את הפרמטרים.
וכמובן, נוכל לקמפל את הפרויקט ולראות שכל פרמטר מהקובץ נקרא כTest נפרד לחלוטין.
סיכום
היום דיברנו על תרחישי בדיקה מבוססי נתונים, וראינו 3 דוגמאות שונות להכנסת פרמטרים לתרחיש הבדיקה שלנו:
- הכנסת פרמטרים רגילה
- הכנסת פרמטרים מרשימה פנימית
- הכנסת פרמטרים מקובץ חיצוני
כמובן שתרחישי הבדיקה שהוצגו כאן אינם תרחישי בדיקה אמיתיים מכיוון שלא הייתה שום וולידציה בסוף התרחיש.
במידה ונרצה להשתמש ביכולות שהוצגו בשביל לבצע Data Driven Testing נכלול בטבלה שלנו גם את הערך שאליו נרצה להשוות את תוצאת הריצה.
השימוש ב Parametrized Tests הופך את הבדיקות שלנו לגמישות ומודולריות וחשוב להשתמש ביכולת הזו ולבדוק את המוצר שלנו עבור כמה קונפיגורציות שניתן.
נתראה בפוסט הבא :)
What happens if you don't want to have the path to the file hard coded. Can you pass something from the 'Calling' test? Thanks
השבמחקOfcourse, it's even better that way.
מחקMy favorite way to 'pass' something to the test is to use some sort of config file like SettingFile or maybe even create the parameter straight in the app config.