מדריך: פיתוח אוטומציה באמצעות NUnit ב10 דקות



היום אדבר על איך לבצע בדיקה אוטומטית ראשונה עם NUnit ואציג את ההבדלים בין שלושת תשתיות הUnit Testing הגדולות ביותר עבור NET.


תשתיות הבדיקה הגדולות עבור NET.

שלושת תשתיות הבדיקה הן:
  • MSTest
  • NUnit
  • XUnit
כל השלוש מגיעות בכדי להשיג יעד דומה - הפיכת כתיבת תרחישי בדיקה לקלה יותר, מהירה יותר ופשוטה יותר.
עדיין קיימים בניהן הבדלים מינוריים רבים. נדבר על היתרונות והחסרונות העיקריים של השלוש.

MSTest:

כבר מ-2005, Visual Studio יוצאת עם תשתית מובנית לבדיקות בתוך סביבת הפיתוח.

היתרון העיקרי: אינטגרציה קלה מאוד עם Visual Studio - ללא צורך בהתקנה
החיסרון העיקרי: מעט פיצ'רים ויכולות גמישות ביחס לשתיים האחרות

NUnit:

נוצרה ב2006 ומאז פחות או יותר נחשבת לתשתית הבדיקות הפופולרית ביותר עבור NET., התשתית עובדת בתצורת Open source ונמצאת בעבודה מתמדת על שינויים ושיפורים.

היתרון העיקרי: פיצ'רים מרובים, דוקומנטציה עצומה
החיסרון העיקרי: דורשת התקנה כפלאגין ל Visual Studio

XUnit:

החדישה מבין השלוש, גם היא מותקנת כפלאגין, הגיעה על מנת לפתור פערים ש NUnit לא פתרה, אך NUnit הוציאה גרסאות נוספות ולא נשארה מאחור.

היתרון העיקרי: גמישות בבדיקות, קהילה גדולה, דומה לNUnit
החיסרון העיקרי: אופן שימוש פחות מובן ונוח

אז במה לבחור?

יהיה לך קשה לבחור גרוע..
כל אחת משלוש התשתיות שהוצגו כאן כנראה תתן לך מענה ל99% מהדרישות שלך.

למרות זאת, אני הייתי הולך עם העדר העצום של NUnit, ונהנה מהדוקומנטציה, הגמישות והקהילה הגדולה.


איך לכתוב תרחיש בדיקות באמצעות NUnit?

שלב 1: בחירת הפרויקט לבדיקה

לצורך הדוגמה נכתוב תכנית פשוטה עליה נבצע את הבדיקות.
אם זוהי התכנית הראשונה שאתה כותב ב C# אני ממליץ לך להיכנס לכאן

התכנית תקבל כקלט שתי מחרוזות - נתיב קובץ, טקסט. התכנית תיצור קובץ בנתיב המבוקש ותכתוב את הטקסט מהפרמטר אל תוך הקובץ.

תחילה ניצור פרויקט חדש מסוג ConsoleApplication בשם Program.



לתוך הפרויקט החדש שיצרנו נעתיק את הקוד הבא: (הסבר בהמשך)



using System.IO;
שימוש בספריה IO על מנת שנוכל לבצע פעולות על קבצים

namespace ConsoleApp1
{
    class Program
    {
        static void Main(string[] args)
התכנית הראשית
        {
            string fileName = args[0];
            string textToAppend = args[1];

            CreateFile(fileName);
         
            AppendAllTextToFile(fileName, textToAppend);
        }
סוף התכנית הראשית
        public static void CreateFile(string fileName)
פעולה אשר יוצרת קובץ חדש לפי הנתיב שקיבלה
        {
            File.Create(fileName).Close();
        }

        public static void AppendAllTextToFile(string fileName, string textToAppend)
פעולה אשר מוסיפה טקסט שמקבלת כפרמטר לתוך קובץ בנתיב מבוקש
        {
            File.AppendAllText(fileName, textToAppend);
        }
    }
}

על מנת להריץ ולבדוק שהתכנית אכן עובדת (מומלץ), לחץ מקש ימני על שם הפרויקט שלכם > Properties.

במסך שנפתח לחץ על Debug ותחת Command Line Arguments הכניס את הפרמטרים שתרצה להעביר כך:

שים לב: התכנית תצליח לרוץ רק אם התיקייה בה אתה רוצה לשים את הקובץ אכן קיימת.

טיפ - ניתן ליצור תיקייה מתוך סייר הקבצים באמצעות צירוף המקשים ctrl+shift+N.


הרץ וודא שהפרויקט תקין.

שלב 2: הורדת חבילות NUnit

בפוסט הקודם הסברתי כיצד להוריד חבילות NuGet ואף נתתי כדוגמה את החבילה NUnit.

כעת, נצטרך להתקין שתי חבילות - NUnit ו - NUnit3TestAdapter (חבילה שתקל את האינטגרציה עם Visual Studio).


כנסו אם אתם לא זוכרים - איך להתקין חבילות NuGet?


שלב 3: כתיבת תרחישי הבדיקה


כעת לאחר שהורדנו את חבילות NUnit והפרויקט תקין ועובד, הגיע הזמן לכתוב את הבדיקות.

כאשר אנו ניגשים לכתוב בדיקות עבור מוצר מסוים חשוב לעצור ולתכנן.

לפרוט את כל הפונקציונליות של המוצר הנבדק ולרשום את הבדיקות שאנחנו רוצים לכתוב עבורו באופן מסודר.

לצורך הדגמת תשתית NUnit אדגים שני תרחישי בדיקה:

  1. הרצת התכנית שכתבנו קודם, ווידוא כי אכן נוצר קובץ, ולאחר מכן ווידוא כי המחרוזת מהפרמטר אכן נכתבה אל הקובץ. (שפיות)
  2. הכנסת נתיב לא קיים ליצירת הקובץ כפרמטר ובדיקה האם התרחיש צלח.
לפני שנתחיל לכתוב את התרחיש עצמו, נרצה ליצור מחלקה נוספת שתפקידה לנהל את התכנית אותה אנו בודקים.

צור פרויקט חדש מסוג Class Library בשם ProgramTests תחת אותו Solution (מקש ימני על שם הSolution > לחיצה על Add ואז על New Project)



*פרויקטים מסוג Class Library לא ניתנים להרצה כישות נפרדת, יש להשתמש בהם פרויקטי עזר.



שנה את שם המחלקה שנוצרה ל ProgramHandler.



*לחיצה על שם ה Class ואז על F2 יעשו את העבודה

העתיק לפרויקט את הקוד הבא: (הסבר בהמשך)




using System.Diagnostics;

שימוש בnamespace בשם System.Diagnostics בכדי לגשת למחלקה Process.

namespace ProgramTests

{

    public static class ProgramStarter

    {

        public static void StartProgram(string fileName, string textToAppend)

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

        {

            const string programPath = @"C:\Users\TomerCohen\source\repos\FirstAutomationTest\Program\bin\Debug\Program.exe";

מיקום קובץ ה EXE של התכנית הנבדקת (בתת התיקייה bin\debug\ של הפרויקט)

            Process.Start(programPath, $"{fileName} {textToAppend}").WaitForExit();

יצירת Process חדש של התכנית שלנו עם הפרמטרים הנדרשים והמתנה עד לסיום התכנית שהרצנו.

        }

    }

}


ועכשיו, לחלק האמנותי והחשוב ביותר..

כתיבת תרחישי הבדיקה:

צור מחלקה חדשה בשם ProgramTests.



*לחיצה על ctrl+shift+A יקלו לך על החיים

העתיק את הקוד הבא למחלקה החדשה שיצרת: (הסבר בהמשך)



using NUnit.Framework;

שימוש בתשתית NUnit

using System.IO;

שימוש ב namespace בשם System.IO על מנת לגשת למחלקה File

namespace ProgramTests

{

    [TestFixture]

attribute בשם TestFixture שמטרתו להגדיר את המחלקה כמחלקת בדיקות

    class ProgramTests

    {


        [OneTimeSetUp]

attribute בשם OneTimeSetUp - מסמן פעולה שתיקרא פעם אחת בתחילת ריצת כל התרחישים מהמחלקה.

לא להיבהל אם זה לא כל כך ברור עכשיו. תכף הכל יתבהר.

        public void ClassInit()

        {

            TestContext.WriteLine("Started All Tests");

כתיבה ללוג הבדיקה שהרצת הבדיקות החלה.

        }


        [SetUp()]

attribute שמגדיר את הפעולה מעליה הוא נמצא כפעולה שרצה לפני כל Test.

לדוגמה, קיימים 4 תרחישי בדיקה אז הפעולה ClassInit תקרא פעם אחת לפני כל התרחישים, והפעולה TestInit רגע לפני כל תרחיש

        public void TestInit()

        {

            TestContext.WriteLine($"Starting {TestContext.CurrentContext.Test.Name}");

כתיבה ללוג שבדיקה ספציפית החלה

        }


        [TearDown]

attribute אשר מגדיר פעולה להופיע בסיום כל תרחיש בדיקה

        public void TestCleanUp()

        {

            TestContext.WriteLine($"{TestContext.CurrentContext.Test.Name} ended");

הדפסה ללוג שתרחיש הבדיקה הסתיים

        }


        [OneTimeTearDown]

attribute אשר מגדיר פעולה להופיע רק לאחר שכל התרחישים סיימו לרוץ

        public void ClassCleanUp()

        {

            TestContext.WriteLine("Done All Tests");

הדפסה ללוג שכל התרחישים הסתיימו

        }


        [TestCase(@"C:\tmp\test.txt", "testing")]

        [TestCase(@"C:\tmporary\test.txt", "testing")]

שני ה Attributes הנ"ל מגדירים את הפעולה כתרחיש בדיקה.
ניתן ליצור מספר רב של Attributes כאשר כל אחד מכיל פרמטרים אחרים.

        public void Sanity(string fileName, string textToAppend)

        {

            ProgramStarter.StartProgram(fileName, textToAppend);

קריאה למחלקת העזר שלנו על מנת שתריץ את התכנית.


            FileAssert.Exists(fileName, "File does not exist, could not create..");

הכשלת הבדיקה במידה והקובץ שהוכנס כפרמטר לא נמצא


            string allFileText = File.ReadAllText(fileName);

קריאת תוכן הקובץ אל תוך משתנה

            Assert.AreEqual(File.ReadAllText(fileName), textToAppend, "Could not append text to file");

ווידוא כי תוכן הקובץ בפועל תואם את התוכן שהוכנס כפרמטר לתרחיש הבדיקה.

        }

    }

}


שלב 4: הרצת התרחישים


ניתן להריץ תרחישי בדיקה שנכתבו בתשתית NUnit באמצעות NUnit3TestAdapter

NUnit3TestAdapter היא חבילת NuGet אשר מאפשרת את האינטגרציה של NUnit עם מנהל ההרצות המובנה ב Visual Studio


על מנת להריץ את תרחישי הבדיקה דרך Visual Studio בצע את השלבים הבאים:
  1. התקן את חבילת ה NuGet
  2. פתח את מנהל ההרצות המובנה של VS: (כמו תמיד, אין כמו קיצורי מקלדת - ctrl+E,T)

  3. בנה את הפרויקט (F6) על מנת לגרום לתרחישי הבדיקה להופיע ב Test Explorer
  4. לחץ על Run All בחלון שנפתח

שים לב: אחד התרחישים אמור להיכשל מכיוון שיש תקלה בתכנית - אין התמודדות עם מצב בו התיקייה לא קיימת.

שלב 5: צפייה בתוצאות הריצה

לאחר ההרצה ניתן לצפות בתוצאות על ידי לחיצה על הבדיקה אותה אנו רוצים לחקור


סיכום:

המדריך כלל -
  1. ההבדלים בין תשתיות הבדיקה השונות של NET.
  2. איך לפתח תרחיש בדיקות עבור תכנית, איך להריץ את התרחיש ואיך לצפות בתוצאות הריצה.

המדריך הנ"ל סיפק לך את העקרונות הבסיסיים בכדי להתחיל ולהיכנס לעולם פיתוח האוטומציה.

הישאר איתי כדי להמשיך ללמוד :)


תגובות

  1. הו בדיוק מה שחיפשתי. באת לי בול בזמן עם הפוסט הזה.
    כתוב מעולה, כרגיל.
    תמשיך כך!

    השבמחק
  2. הסבר קליל וממצא שמועבר בצורה קולחת וברורה.
    תודה!

    השבמחק
  3. מעולה! מקצועי ופשוט! כל הכבוד...

    השבמחק
  4. תודה רבה על ההסבר הקולח!

    השבמחק
  5. תודה רבה חבר , עזרת לי המון עם הפוסט שלך, פשוט מקצועי וברור!
    כל הכבוד.

    השבמחק
  6. איפה נמצא הלוג?

    השבמחק

הוסף רשומת תגובה

פוסטים פופולריים מהבלוג הזה

תכנות מונחה עצמים | Dependency Inversion Principle

מהם קבצי DLL ואיך להשתמש בהם?

מה ההבדל בין אוטומציה לפיתוח רגיל