Lesson 22 of 22

Summary and Discussion Day 3

Duration: 18:48 Watch on YouTube (external link, opens in new tab) Spoken in Hebrew

Markdown version

In this lesson

Roy Osherove explains that a fixture setup (external link, opens in new tab) runs once before all tests and usually means something slow is initialized, and agrees that the refactorings (external link, opens in new tab) made the code more testable, not better designed (external link, opens in new tab). On whether to fake (external link, opens in new tab) the method that parses the links out of the content, he prefers to keep as much code in the unit of work (external link, opens in new tab) as stays fast, in memory and readable, fakes threads, processes and the file system, and calls the choice the art of unit testing (external link, opens in new tab); a debate on testing private methods (external link, opens in new tab) follows. Each pair then writes two or three tests for real production code that go into source control.

Transcript

2,872 words

[00:01] (external link, opens in new tab) בDSM שמתם לב שיש בסטestי יש פה אבט שנקרא testure setup וtest feure setup זה אטריוט שקורה פעם אחת לפני כל לפני כל הטestטים זאת אומרת גם אם יש לכם 10ה טestטים הפונקציה הזאת תרוץ רק פעם אחת קס בMS זה נקרא קס לדעתי אבל יש גם פונקציה setטאפ בחלק מהקלאסים שיורשים ממנה שהיא קוראת פעם אחת לפני כל טest משתמשים ב כדי להתחיל את כל הטestטים

[00:34] (external link, opens in new tab) אז בדרך כלל אם אתם תרא תראו testפק setup זה אומר כמעט בטוח שיש לכם בידיים כי מאתחילים משהו שלוקח הרבה זמן להתחל אם זה היה קורה לפני כל טest אז משתמשים בזה פעם אחת לפני כל הטestטים לדוגמה להרים סביבה כלשהיא לנקות משהו לסגור את כל האינטרנט אקספלוררים או מה שזה לא יהיה אוקיי איך המרגש לגבי הטסם שכתבתם עד עכשיו הרגשות טענות איזה שהם אינסייטס מעניינים

[01:08] (external link, opens in new tab) אה שור >> קיאור אוקוד המקורי >> קיאור הקוד המקורי שהיה יפה קודם פתאום נהיה מכוער אוקיי >> נהיה פחות קר >> הוא נהיה פחות קר אוקיי בסדר הריפקטורים של הוא רק עושה אותו יותר testable הוא לא עושה אותו יותר דזי תשים לב תשימו לב זאת אומרת לכן ההבדל ביןסטב לדין מאוד גדול בסדר עדיין יכול מאוד מכוער ומאוד טסable אוקיי זה אינסט חשוב מה עוד היה משהו >> היה אצלנו בחדר ששמנו לב ש

[01:41] (external link, opens in new tab) חלק מהאנשים קראו לה פונקציה כשהם נתנו קונטנפט מסומלץ כאילו ממש סטרינג שמכיל תוכן עם לינקים >> ואומרים ואני בחרנו דווקא להתעלם מזה כאילו לעשות שם פייק (external link, opens in new tab) לחלק הזה ולהחזיר ממש כזה פשוט את התוצאה שממש מחילה כבר URLים מפורסרים והיה שם איזשהו דיון כזה שבעצם הבנו שזה לא שחור ולבן אין פה תשובה בהכרח 100% טובה לתת את הURLים כסטרינגים אומר שאתה בודק יותר פיסות קוד כי אתה נכנס ליותר חלקים

[02:15] (external link, opens in new tab) ואני אישית מרגיש שזה מוריד קצת מהקריאות אנשים חיים חושבים שזה מוסיף לקריאות לשים את הלינקים בטestטים אז זה קצת עניין של טעם אבל מה שלי היה חשוב העיקר שם אני חושב זה לדעת לבחור במודע אם אתה מכניס או מוציא את הפיסה כזאת מהסקופ של הטסט שלך כאילו לדעת שאתה מסוגל להוציא את זה או להשאיר את זה ולדעת מה במה אתה בוחר ולמה אוקיי אז אני אסביר בגדול הוא דיבר על הגest from content

[02:46] (external link, opens in new tab) היכולת לעשות פרסing בעצם get your content משתמש בגular expression כדי לעשות פס לכל הURים בקונטנט אז היו כאלה שבחור פשוט לתת content שמכיל את הURLים היו כאלה שבחו לעשות fake (external link, opens in new tab) לגט ופשוט להחזיר מה שהם רוצים ואז לא צריך לכתובנט נורא מסובך שמכיל את הURLים בפנים. שתי הדרכים הם בסדר. דרך אחת כוללת יותר אפלמנטש בתוך היוט ודרך אחת כוללת פחות. זאת אומרת אם אתם בוחרים לשלוח item נק שכבר מכיל את הURL אז בעצם אתם אומרים get your from content הוא חלק מהtest שלי.

[03:22] (external link, opens in new tab) אם הוא אם הוא לא עובד אז הטest שלי לא עובד. אבל זה גם אומר שהייטם content האינפוט שלי נהיה הרבה יותר מסובך אז יש מקרים שבהם באמת הייתי עושה פיק לגנ ויש מקרים שלא בדפולט אם אני יכול וזה לא עולה לי ברידביליות או במטנביליות או שלא זה לא מכשנה לכתוב את הטסט יותר מדי אני מעדיף לכלול כמה שיותר דברים בטסט שלי לא להוריד זאת אומרת אני מעדיף שהיוניט of work שלי יהיה כמה שיותר מנופח ויכיל כמה שיותר קוד בצפנים כל הזמן שזה רץ בזיכרון רץ מהר יש לשיטה על כל הדברים readable mable

[03:57] (external link, opens in new tab) והסיבה היא שבאמת הדבר הזה הוא נכלל בינט אבור הסיבה היחידה שלי לעשות לזה פייק זה אם נורא קשה לעשות את האינפוט הזה או נורא בלתי קרי הטest שיוצא מזה ואז באמת הייתי עושה לזה פייק כי זה מבחינתי נהיה depפendנency depפendנency זה משהו שאין לי שליטה עליו או שנורא קשה לייצר משהו שיעמוד בסטנדרטים שלי תארו לכם לייצר משהו שהוא out of memory exception זה גם אפט שנורא קשה לייצר אז עושים לו פייק זה סוג של depפendנסing

[04:28] (external link, opens in new tab) שתי הדרכים הם בסדר היו כאלה שהצליחו לעשות את הדרך שבה הם לא עושים פיק לגט והטest עדיין מאוד קרי בגלל שהשתמשו בים מאוד פשוטים סידרו את הקוד בצורה פשוטה ובויזואלית הפרידו דברים יפה עם ספייסים הויזואלית של הקוד מאוד חשובה בדברים האלה ואם אתם יכולים לגרום לזה לקרות עם משהו בפנים אז תעשו את אפילו הייתי אומר וואלה אולי אני אפילו יכול לעשות משהו עם remמוט פייל כל זמן שזה משהו לוקי על הדבר הזה ואפילו לקרוא לזהרש test אם אני לא צריך לעשות לזה אקסטרctט וואלה אני אולי אני לא אעשה לזה אקסטר

[05:05] (external link, opens in new tab) אני לא דתי בנושא שחייבים לכתוב unit test (external link, opens in new tab) אם הטest עדיין ירוץ מהר והוא יהיה אטגרש test אז מה אף אחד לא עומד מזה אלא אם כן הטest הוא למחשב יחוי זהגרש ואז מישהו יכול לק >> אבל כן >> הבעיה הייתה מבחינתי בזה שכבע בURL הייתה מכשילה את כל הטestטים בבת אחת כולם עכשיו כל הטestטים תלויים בHRF למרות שיש הרבה לוגיקה מעבר טוב אז ולכן זה זה משהו שנתון לשיקול אם אתם רואים שוואלה האינפוט הזה מסובך וגם האינפוט הזה צריך להשתנות כל הזמן כי הדרישות לאיך URL נראה משתנות כל הזמן אז זה משהו שהוא תן לזה

[05:47] (external link, opens in new tab) בסדר אין פה תשובה אחת בגלל זה אני קורא לזה The Art of Unit Testing (external link, opens in new tab) שזה זה החוכמה היא למצוא את השביל הדג שמחבר בין משהו שהוא readable ומטable לפי מה שאתה אומר וואלה אם אני כולל את זה זה לא בכלל מטable כי מחר אני משנה משהו ופתאום אני צריך לשנות את הרגול אקפרש ובום שברתי מלא test >> אבל לא לא תעדיף פונקציה שתתמקד רק בזה כשאתה רוצה לבדוק את זה ושהשאר ידלגו על החלק הזה אם יכולות >> יכול להיות שאני אבחר שאני אגיד זה depפendנency ואז יהיה לי test במיוחד לג אבל יש יש לי בעיה עם get your content

[06:26] (external link, opens in new tab) הוא private method private method ב implementation detail מחר get content לאח regular expression מחר הוא הסתמך על איזה webסרס שעושה ומקבל את זה מface.com איכשהו מאיזשהי צריך שוב כל הטestטים יפלו בגלל שהם ימשו את זה עם זה הם פתאום יהיו איתיים מאוד ואז אני אעשה לזה פלמנטשטל עד אותו רגע לא שינה לי אז לא השתמשתי בו זה פישט להתס ברב אם זה מסבך לי את הטest כשאני צריך לעשות פייק למשהו הטסט הקוד נהיה קצת יותר ארוך זה לא דבר רע אני בדפאולט בדרך כלל הנטייה שלי תמיד הייתה לעשות איזה פייק לאחרונה הנטייה שלי היא קצת אחרת והיא אומרת ככה תכנון יותר דברים אל תהיה יותר מדי דתי בדעות שלך בקטע הזה כי

[07:11] (external link, opens in new tab) ככל שאתה תכנון יותר דברים הסיכויים בדרך כלל בדברים האלה שהם expression parcing של url זה בדרך כלל לא משתנה טרקבק זה לא זהסטנדרט זה לא פורמט שמשתנה סתם בתור דוגמה למקרה הזה הספציפי אז יש מקרים שכן יש מקרים שלא זה כל דבר הוא ממש ממש ל ל ל ל ל ל ל ל לגופו ברוב המקרים אני רואה אנשים עושים לזה פייק כי זה פשוט זה הרבה יותר פשוט כי מה שאנחנו בודקים זה את האלגוריתם ואז אם זה מחזיר משהו וזה מחזיר משהו אז זה נקרא

[07:45] (external link, opens in new tab) נוגם לא >> לא הפשטות האמתי ההפרדה וזה אני בגלל זה אני לא לגמרי מבין איך זה כי זה או שאתה מפריד את זה או שלא. ואם אתה לא מפריד את זה אז זה תמיד יהיה לא מופרד. תמיד כל בדיקה עכשיו של הפונקציה הזאת תכלול בוודאות את זה. >> נכון בגלל זה זה מפריע לי. לא כיף >> וזה זה ההחלטה שלכם איך לעשות את זה. אני חשוב מאוד שזא תהיה בחירה ולא משהו שהוא לא מודע. ואני חושב שזה מה שאלד אמר והוא צודק >> שצריך להיות בחירה מודעת לא לעשות את זה. לא לא לעשות את זה בגלל שלא ידעת שאתה יכול דווקא לדעת אני יכול לעשות את זה ואני בוחר לא.

[08:20] (external link, opens in new tab) ואני יודע מה ההשלחות של הדבר הזה ויש לזה השלחות שאלות עוד או דברים חשובים דברים מעניינים שהגיליתם תוך כדי אני אמשיך לגבי זה אני מרגיש שאני לא לא ברור לי סטפטסט מה ההפרדה בין אסטר פארטי למשל לבין לא כלומר האם פונקציה פאבליק באותו קלאס היא מבחינתי צריכה שלה עכשיו כמו כאילו האם היא פייק פייק צריכה או או לא כלומר האם גם אם זה צריך לחלק מהבדיקה שלי או לא >> אני מרגיש שפהגם

[08:54] (external link, opens in new tab) שאני עשיתי את הטestטים אני לא יודע שאני יש לי איזשהו חוק שאומר מתי כן מתי לא הבנתי אוקיי אז אני אתן לכם א' אני אתן לכם שני חוקים קודם כל אני בדרך כלל קורא פ לדברים שהם אין לי שליטה עליהם טרדים procסים דברים כאלה נגיעה בפיילסיסטם זה בטוח אני אעשה לזה פיק דבר נוסף לגבי הסקופ אתה אומר אני לא יודע מה לבדוק באיזה API לבדוק באיזה API לקבל את את התוצאה לדוגמה יש איזה שורי אומר תמיד שהאינפוטים והאוטפוטים בטסט שלך יהיו באותו לבל זאת אומרת אם בדקת בלבל של הקלאס אז תבדוק את את השאר בלבל של הקלאס אל תבדוק משהו פנימית יותר בקלאס תבדוק בלבל באותו לבל זאת אומרת מבחינת הסקורפט אם אתה בלבל מסוים אל תראה רמה אם אתה לא חייב אוקיי אז לדוגמה הסרט פארטי אם אתה ברמת הקלאס אז קלאס אחר יכול להיות סרט פארטי מבחינתך

[09:48] (external link, opens in new tab) טרקבק ‏send זה דוגמה לזה נכון נסנ זה קס אחר אני אני לא חייב לעשות בפיק אבל אז הפוך להיות אגרשט test אבל אני יכול לעשות פיק לדברים בתוך טרקבק נקסנ אם אני באמת רוצה נכון אני יכול לעשות לזה אקסטר ולהפוך לטרקבק לאינסance וכל הדברים האלה אבל מבחינתי היוטור מתחיל פה ונגמר פה אז זה מבחינתי כבר לא באותו סקופ כבר בלבל אחר אוקיי זה עונה לך קצת על השאלה זה נראה יותר מה שאנחנו צריך כאילו להגדיר בתוך הריגון

[10:23] (external link, opens in new tab) להגדיר בתוך הערגון לא הייתי אני לא בטוח אם צריך להגדיר בתוך הרגון חשוב שתהיו מודעים לזה שלא תמיד תהיה לכם תשובה נכונה תמיד לא תמיד יש תשובות נכונות יש לי הרבה פעמים הרבה שאלות והרבה תהיות והרבה ניסיונות זה לא משנה כמה ניסיון יהיה לכם תמיד אתם תגיעו למצב שבו לא תדעו מה דרך הכי טובה או הכי נכונה פשוט תצטרכו לנסות ומקסימום תגלו שאולי הייתם צריכים ללכת בדרך אחרת אז זאת אחת העבונות הכי מעניינות שאתה מגיע לאיזשהו שלב אתה אומר אין מצב שאני אדע תמיד מה לעשות

[10:54] (external link, opens in new tab) שלב אני חייב להתחיל לקבל איזשהי החלטה וזה לא תלוי רבי אני אז אני יכול לעבוד עם עם עם זוג ואז אפשר לקבל החלטה ביחד אפשר להתייעץ עם עוד אנשים אבל זה בהחלט משהו שאפשר לעשות איתו עליו דיון לא צריך להיות בירוקרטים בנושא צריך לקבל החלטה כל נושא לגופו אסור שלדעתי שיהיה יהיה רק דרך אחת לכתוב את הטestטים האלה. צריך לתת לאנשים שקודים את הטestטים את ה את החופש לבחור את הסקופ שבו הטestטים האלה כתובים.

[11:27] (external link, opens in new tab) אבל זה לא אומר שלא צריכים להיות דיונים בנושא הזה. אוקיי? כמו שיש דיונים על הנימינג יש גם דיונים על הנושא של איך לדאוק את הדבר הזה ומה הדרך הנכונה ביותר. ואתם תגלו שזה קורה הרבה. איך כדאי לי לבדוק את הדבר הזה? באיזה סקור, מאיפה נקבל את האינפוט? האם כדאי לעשות פייק לדבר הזה או לא? זה דברים שהם חלק מהעבודה. זה לא דברים שאתם אף שאתם אי פעם תעברו ותמיד יהיה לכם תשובה נוחה לי אין תשובה נוחה אז אני מניח שגם לכם אחרי זמן מסוים לא תהיה תשובה אלא אם כן תגלו מן תיאוריה של התאוריה של הכל שאומרת אה במקרה כזה תמיד תמיד תמיד כדאי לעשות ככה וככה

[12:04] (external link, opens in new tab) התשובה היא שמהניסיון שלי לפעמים זה עובד לפעמים זה עובד זאת אומרת היום מקרים שבהם הייתי עושה לזה פייק ושמחתי היום מקרים שאני לא שמח לעשות את זה פייק בגלל שהגליתי הרבה יותר ערך ולא לעשות את זה לכן אין תשובה אחת זה תמיד משתנה בהתם לקונטקסט בקשר הדבר הזה הרי המתודה הזאת היא prive >> המתודה הזאת >> לא get your cont get your contct היא prate prate st >> אוקיי אז אם היא prיבט זה אומר שאני לא יכול לעשות testing שבודקים אותה >> קודם כל אתה יכול >> אם אני לא עושה את הפרט >> אתה יכול לעשות שבודקים אותה אתה יכול לעשות עם reflection אין שום בעיה לisolate יש גם apנקרא isolate הוא מפעיל לך פורים שהם prיט בלי שתעשה את כל העבודה

[12:50] (external link, opens in new tab) של הבילר פלי של לעשות אבל אתה יכול היום להפעיל מה שאתה רוצה >> אז אם זה ככה אני ישנה את השאלה שלי האם באמת אנחנו צריכים להתייחס ליבט לפאבליק אחרת שאנחנו בונים טסטים >> אני מתייחס לזה אחרת בגלל שגיליתי שאם אני לא מתייחס לזה אחרת אז הטestטים שלי נהיים הרבה פחות מטם אבל יש גם הסכולה שאומרת וואלה חבר'ה אם אם באמת get your content זה פונקציה שהייתם רוצים לבדוק לבד זה אומר שהפונקציה ש צועקת לכם תהפכו אותי לפאבליק תהפכו אותי לפאבליק הלפר מט בקלאס נפרד והיא אומרת לכם שהדיזיין שלכם יכול להיות שצריך להשתנות זה בהחלט משהו שהוא ולידי להגיד אוקיי זה prיט אבל זה לא אומר שזה חייב להיות פרייט אולי אני אעשה את זה פריט ואני אכתוב לזה טestי במקרד בהחלט אפשרות אה אני אני רוצה להוסיף על זה ולהגיד אני חושב שזאת לא אפשרות עם דוקטורים שהם prיבט

[13:39] (external link, opens in new tab) כאילו אני חושב שכדאי שנעבור תהליך של הגדרת קונבנציות פה של מה מה כדאי לעשות ואני אני באופן אישי הולך להיות >> בלגסיקוד זה קצת בעיה להגיד שאין אפשרות כי בלגסיק all better off >> אני לא מסכים לא מסכים איתך >> למה מה אתה הפונקציה הזאת >> הפונקציה הזאת כאילו נגיד אם אם הרגשת דגדג לך שאתה רוצה לבדוק את הקטע שמפרסר אז זה בדיוק מה שהייתי עושה הייתי עושה את זה פאבליקסטיק whatבר במקום אחר פשוט חשוף והייתי בודק אותו הלוationשן

[14:10] (external link, opens in new tab) אי אפשר לקחת את האמירה שזה לגס זה המערב הפרוח ולכתוב שם טestטים שהם קקה אי אפשר לעשות את זה צריך כאילו להיות רוב הסיכויים שיהיה לכם טסטים אתם לא תהיו גאים בהם אבל הם מביאים עכשיו רמה מסוימת של ידע של משהו עובד ואחרי זה אתם יכולים לאט לאט לשנות את הקוד ואז להיפטר אחרי זה הסיבה לכתסטים יותר טובים אבל אתה לא יכול לחיות בעולם מושלם ולא יהיה לך זמן לשנות את הכל ולהפוך אותו לפאבליק וכן בעולם האמיתי שלי הייתי הופך את זה לפאבליק והייתי בודק אותו ונפרד כן לחלוקים אבל זה לא אומר שמה שנכון בקונטקט שלי נכון בקונטקסט שלכם הייתי אומר וואלה זה נכון זה משהו זה גול לשאוף אליו לא לבדוק prייטים

[14:50] (external link, opens in new tab) אני לא ראיתי עולם מושלם שבו אתה תמיד עומד בעקרונות שלך בקוד של >> אני לא פשוט לא מצליח לעשות על דעתי דוגמה שבה אני לא אצליח להזיז את זה מהפרייבט אם אני רוצה לבדוק את זה >> בסדר אבל זה לא אומר שאין דוגמה יש לך >> בצות שלכם אני עוד לא מכיר אותו מספיק השאלה שלם אתה יכול לעשות את זה פבליקט בשביל שתוכל לבדוק את זה זה גם שאלה >> שמ הייתן לך דוגמה למשהו משהו שכמעט בלתי אפשרי לבדוק בלי בלי לעשות משהו ברמה שהיא לא פאבלי כשיש לך קוד שהדפendנס שלו הוא סתם הוא לא סתם קריע למשהו שהוא חיצוני אופר prיט אלא קוד שיורש ממשהו שהוא לא שאתה תלוי בו והוא לא המימוש שלך קוד שהביס שלך לדוגמה הואפ

[15:32] (external link, opens in new tab) ואתה רוצה למחוק את הדependencies ואז אתה צריך להתחיל לעשות פייקים בפרי בגלל שאין לך ברירה כזה כי הטייפים שאתה יורש מהם הם prיט וסיד וכל הדברים דברים האלה ואז הם נחמות אז זה מאוד תלוי בדיזיין ובפרימוורק שאתה תלוי איתו אז ברגע שיש לך נגד קוד שחי בתוך פריימורק שהוא לא שלך זה סוג הדברים שבהם הדפנס כל כך חזק שכלים פרופיילר basols אין לך כמעט ברירה ואתה צריך מה שנקרא ממש לגדוע ככה מלמטה ולהגיד זה פייק זה פייק זה פייק הדברים האלה כל מה שהוא בטיפ הזה הם פייק גם prיטינג וגם כל הדברים האלה זה שונה ממה שדיברנו >> אתה לא יכול להפוך אותם לפסיק זה לא הקוד שלך אתה אתה אתה אתה מבלבל פה בין אתה דיברת על לקחת פרייטים ולעשות להם פייק כי זה אחלה אוקיי הוא דיבר על לקחת את הפרייט ולבדוק אותו שני דברים שונים

[16:22] (external link, opens in new tab) לקחת פרייט ולבדוק אותו שנראה זה שונה וזה לא שונה גם זה יכול להיות אחד תראה זה זה לא דיון תיאורטי כן יש מקרים כאלה שאסור לך להפוך משהו לפאבליקסקיורטי טריפס כל הדברים האלה יודע להפוך משהו מאינטרנל ללא אינטרנל זה אפילו לפני פרפורמנס יכול להיות שינוקש גם >> יש יש סיבות לא להפוך משהו לוטואל אני שמעתי מפה כמה אנשים שאומרים אם תהפכו את זה לוירטואל זה יערוץ לך הרבה יותר לאט

[16:52] (external link, opens in new tab) אצלכם פרפורמנס יכול להיות משנה C++ זה מאוד משנה אז זה לא שזה הייתי נמנע מהצרות גרופות אבל הייתי אומר יש איזשהו איזשהו אידיאה לשאוף אליו וזה מין איזשהו משהו מכבה זה לא אומר לתת איזשהו אה קו אדום שאפשר להזיז אותו זה אומר שבקוד רויו אם יש ברירה אז יש ברירה עורסים אותה תמיד וזהו אבל אם אין ברירה אז אין ברירה לא צריך אה

[17:23] (external link, opens in new tab) עברתי מספיק כדי לא לתת הצרות גורפות כל העצרות הגורפות הם לא נכונות זה מה שאני אומר תמיד אוקיי כן עוד שאלות אוקיי מה שנעשה עכשיו עד סוף היום כל זוג הולך לבחור חתיכת קוד אמיתית פרודקש קוד ולנסות לבדוק אותם. אל תלכו על משהו מסובך מדי. תיקחו משהו שבא לכם לבדוק שאתם חושבים שאתם יודעים איך לגשת אליו. תבחרו משהו ששניכם נראה לכם שיהיה לכם כיף לבדוק אותו.

[17:55] (external link, opens in new tab) יכול להיות משהו שמפחיד אותכם, יכול להיות משהו שסתם מעניין אותכם לראות איך לבדוק את הדבר הזה. ואנחנו ננסה לפתור את זה עד הצופים. אוקיי? לכתוב לפחות שניים שלושה טestטים על קודקשן על הקוד האמיתי שלכם. והטestטים האלה הולכים להיכנס לסור קנטרול ולרוץ בקר >> למי שלא מודע יש פרויקט לטestטים גם בסולט וגם בסולוטו אוקיי כאילו יש כבר פרויקטים לצלם את זה >> שכבר רצים שלום אז כאילו תחברו לזה אותו דבר >> אם אני מזכיר לכם לגבי זה שיהיה לכם לשים אם אין לכם פרויקט שיש לו בשם unit test אז זה הזמן להתחיל אחד כזה

[18:38] (external link, opens in new tab) >> אוקיי כן