Lesson 5 of 22
TDD Demo
In this lesson
Roy Osherove builds the calculator's memory feature with TDD (external link, opens in new tab): first a failing test, then the simplest code (external link, opens in new tab) that passes all tests, which he describes as code with as many assumptions as possible, near the top of the function and with few ifs. The group designs the API through the tests, and he writes future tests down as comments so there is one problem to solve at a time. He also answers questions on organizing many tests, given/when/then (external link, opens in new tab) in behavior driven development, and setup methods (external link, opens in new tab).
Transcript
[00:02] (external link, opens in new tab) כי עד שאני לא מסים את הטest אני לא יודע אם זה באמת מה שאני רוצה עכשיו נשאל את השאלה this is my definition of success שבו על זה ככה sucessס מבחינתי זה היכולת לעשות את הדבר הזה עכשיו אני גורם לעולם להתאים את עצמו אליי אוקיי סוג של משחקת אלוהים פה אז אני גרם לזה להתקמפל אבל אני חייב לראות את הטסט נחשב אוקיי לא מתקמפל זה כביכול סוג של כישלון אבל עדיין לא אבל לא הצלחתי עדיין להריץ אותו אז אני רוצה את היכולת להריץ אותו ולראות את הטest זה החוק הראשון בD
[00:33] (external link, opens in new tab) אז alt enter כדי לייצר את הפרטי הזה מה שהתכוונתי en public הוא בא לי אחרי זה אם אני רוצה לעשות איזהסט אחרי זה אני אשנה את זה כרגע testing possibly work הבעיה היא שאם אני ארץ עכשיו את הטסט הזה יהיה אפס בדפ נכון אני בכוונה רוצה לראות אותו נכשל אז אני אתחיל אותו
[01:05] (external link, opens in new tab) למינוס אח אוקיי תזכרו החוק הראשון זה לראות את הטestטב עכשיו אני רוצה שזה ירגיש כמו בט דרך אגב הטest הזה של האספtion אני יכול להגיד can't כדי שהחסד זה יבוא שומע ממשיך קשה >> קטנה >> יפה מצוין אוקיי אוקיי, עכשיו יש לנו את האפטר. בוא נוריד את האפטר שלא יהיה לנו ברש אתר. אוקיי, עכשיו יש לי בעצם
[01:38] (external link, opens in new tab) הגעתי, עברתי את השלב הראשון בTVD שזה לראות את הטest הראשון נכשל. בהתחלה הפונקציה עוד לא הייתה קיימת, גרמתי להתקיים. expected אפס 1. עכשיו אני יכול לעבור לשלב ה לשלב השני זה לגרום לכל הטestטים לעבור בצורה הפשוטה ביותר. עכשיו בוא נחזור לסימפליסityי. אז מבחינתנו simpliסityי זה אפשר לחשוב על זה בכמה דרכים אבל זה קוד שעושה כמה שיותר הסט כמה שיותר הנחות יסוד
[02:10] (external link, opens in new tab) זה הקוד הכי פחות ג'נרי שאתם יכולים לחשוב עליו וינתן הרצון להעביר את כל הטestטים אוקיי אז אם אתם יכולים לעבור את כל הטestטים אבל יש עוד הנחת שאתם יכולים לעשות שתפשט את הקוד יותר אז תעשו את זה אז איך נראה הקוד פשוט בדרך כלל יותר קרוב לתחילת הפונקציה ככל שהוא יותר נמוך בפונקציה הוא צריך לעבור שורות קוד לפני זה אז הוא פחות אז הוא יותר מסובך נכון אם הקוד אם הייתי צריך לעבור כמה אייפים בדרך אז הקוד יותר מסובך מאשר אם לא הייתי צריך לעשות כלום אז קוד יותר קרול לתחילת הפונקציה ויזואלית אז שורת בדרך כלל תהיה יותר קצרה אלא אם כן הוא בלתי קרי אז אני רוצה שהוא יהיה גם כרי והוא לאנטל כי אז בדרך כלל זה אומר שיש אי אופ או משהו בסגות אז זה קוד שככל שיותר הוא קרוב לx0 וy0
[02:54] (external link, opens in new tab) יותר טוב לי אז אם אני יכול לכתוב פתרון לטסט הזה בתחילת פונקציה כלשהי זה הרבה יותר טוב מאשר לכתוב את זה בסוף פונקציה כלשהי ואם אני יכול לכתוב את זה בלי איפים אני אכתוב את זה בלי אפים זה ככה אני חושב על סימפליסיטי כי לא הצלחתי למצוא דרך אחרת לחשוב על סימפליסיטי זה יכול להיות לא מושלם אבל לא מצאתי דרך יותר טובה לפחות לחשוב על זה למדוד אם אתה כותב משהו שהוא פשוט אמ אוקיי אז אנחנו בפרודקש קודז כרנו יש לנו test אחד שנכשל
[03:28] (external link, opens in new tab) זה הטest הזה stort value אני כרגע יכול לשים את הסטור value כאפס זה הדבר הכי פשוט שאני יכול לחשוב עליו ואני יכול לעשות אפילו פשוט ככה עניין על ה כל הטestטים עוברים מצוין הפיצ'ר עובר אפשר הביתה מצוין יופי כל אחת יש סינריות >> שייכת הביתה או לא >> סנריות לא מי סתם פונקציות לאסט יופי אוקי א' הפונקציונות נעסתה בחלקה חסרים טסים >> נכון אבל תשימו לב הפונקציונות נעסתה בחלקה יש לי פיצ'ר שעובד בעינתן שלא השתמשת בממור את מסכים איתי
[04:07] (external link, opens in new tab) אינקרמנטלי זה אינקרמנטלי זה לא חייב להרגיש מדהים אבל זה עדיין עובד חלקית אוקיי אז עכשיו אם הפיצ'ר הזה אם אתם לא מרוצים מהקוד הזה מן הסתם הקוד הזה לא מספיק טוב אפשר לשנות אותו נכון לא אי אפשר לשנות אותו נכון כי בtd D יכול לשנות קוד אם אין לך טסט שנחשב. אז אם אתם באמת אכפת לכם מהקוד הזה אתם רוצים לשנות אותו אתם צריכים לכתוב טest חדש שנחשב. כל הטסטים שלנו כרגע לצערינו עוברים אז כדי לשנות את זה אנחנו צריכים לכתוב טסט חדש שנקשר.
[04:39] (external link, opens in new tab) מה הטestט שנכתוב? גט. בואו נעשה את זה ככה. Test memורי. מה נעשה עכשיו בסנרים? Setט. >> אוקיי. הסנריו הכי פשוט שמוכיח שהקוד לא בסדר כן >> גט setסט ואז ג >> set יותר פשוט כ >> אם אני סתם עשה גט אני עדיין אקבל אפס נכון אז אני צריך את שנכשל set >> set אוקייס set ומה הבי במקרה כזהס
[05:14] (external link, opens in new tab) >> מה זהסק >> שימו לב רגע איזה איזה סוג של resultלצר retire value state אוס >> partטy state >> בסטate איך בודקים שסטate נשתנה עושים גט אוקי >> עושים גט זאת אומרת ההתנהגות של המערכת משתנה לא בודקיםסיטל אלא בודקים איזשהו פאבליק API שמחזיר איזשהו תוצאה אחרת אוקיי אז set אבל כשאם ה חזיר תוצאה אחרת מה זה אומר על ההתנהגות שלו שמemמורי שהvue is save נכון או משהו בסגנון הזה
[05:45] (external link, opens in new tab) Value save to mory אוקיי אז אני יכול להגיד ככה לא cort value שווה נכון זה מה שאתם רוצים שאני אעשה >> כן >> אחד >> שווה 1 אחלה
[06:18] (external link, opens in new tab) 1 מCסטור value כבר גט >> אז מה מה המטרה של הפיצ'ר הזה אני רוצה להבין >> זה שסתם עכשיו יש לי פילד שאני יכול לתוסט לזה אין לי מה לכות >> אם זה לא היה פילד היה פונקציה שמחורי הקלים אני עושה כל המסובות >> זהו אבל מה אכפת לי אם היא עושה את זה מאחורי הקלים מה איך זה משנה את ההתנהגות של המערכת שלי מה זאת אומרת יש לה משהו שומר ברקע אחד באותה מידה אחר כך שמשפילו של >> יפה אז זה מה שחשוב לי שאני יכול לעשות משהו עם הסט הזה זה שאני סתם לחסט לא שווה לי שום דבר אוקיי אז אם אני עושה לו סטור שווה ככה
[06:56] (external link, opens in new tab) אז יכול להיות שהדפט test שלי לא נכון יכול להיות שהדולט שלי היה צריך להיות שאני משתמש בדפולט זה כמו להשתמש באפס נכון ב1 בוד 1 אז גם את זה יכול לעשות test >> בוא נעשה את זה ככה אז איך אנחנו נשתמש בסטור value שלנו בiס פונקציה multפלי בסור value mtiply בסור value >> לא שהad שיהיה גם add שמוסיף לסור value האחרון ושגם add רגיל משנה אתסורה לי c
[07:26] (external link, opens in new tab) To to st value >> כן >> ככה >> וזה יחזיר לי תוצאה >> כמו >> פלמטר אחד >> זה מה שהתכוונת שיני >> זה גם אפשר כאילו >> חשוב שתבינו מה אנחנו עושים פה עכשיו אנחנו עושים פה את הדיזיין של של הפיצ'ר אוקיי >> כן >> זה החלטה שלכם איך הפיצ'ר הזה יראה אז אני שואל אתכם איך הפיצ'ר של ממורין נראה בטיפטר שלנו זה כל דבר שאנחנו נעשה יש שנה את הפיצא שיש פה רק דרך אחת אין דרך אחת יש את הדרך שבא אתם מאמינים שהp צריך להשתמש בו >> יכול לגרום לזה לעבוד >> מה
[08:00] (external link, opens in new tab) שהד מתחיל מהסטור משתמש פהסטור >> אוקיי אז יהיה לי add אה זאת אומרת שad אוטומטית כבר יחזיר משהו אז יהיה לי 1 ו שתיים ואני אקבל ארבע אוקיי זה כבר התנהגות יפה in resultלט
[08:31] (external link, opens in new tab) אר אוקיי עכשיו יש לנו לאן לשאוף אז שימו לב הפיצ'ר הוא קטן יש לי מטרה לשאוף אליה אני יודע כשאני אצליח אותה שתצלי יעבור ואז אני ארגיש טוב עם עצמי להרגיש טוב עם עצמך זה דבר מאוד חשוב במעלה היום אני לא יודע אם איך להגיד לכם את זה פסיכולוגית כשהיום שלי מורכב מהרבה טestטים קטנים שעוברים אז היום שלי מורכב מהרבה הצלחות עדיף מאשר שהיום שלי מורכב מפיצ'ר אחד שלא עבד כל היום ואז אולי מחר הוא יעבוד ואולי לא עבודה אינטרמנטלית זה משהו שאמור להיות כיף גם יש מצב שמישהו אחד כותב הטסט ממישהו אחר מממש את זה
[09:02] (external link, opens in new tab) כי זה נגיד לא הכי קרי זה לא לא לגמרי ברור >> בוא נעשה את זה קרי איך היית עושה את זה קר >> משנה את השם של add ל using st value add using store value זאת אומרת את הפונקציה המקורית תמיד יקרה addingסטור value יש פה כאילו שכל מסייסף את הסט נכון זה הנחה ש בדרך כלל לא נכון והתנהגות שלפ >> אבל זה מה שאנחנו כתבנו פה בסדר מחשב שמצאנו שהוא >> אבל מה אם הייתי כותב פה
[09:34] (external link, opens in new tab) C use stored value in addווה true או זה יותר קרי עכשיו נגרום לזה למה אפשר אפשר אפשר זה אחד הדברים היפים הטestטים שלנו הם עוד יוזר של המערכת אז אם הAPI לא מספיק נוח הו אז אנחנו רואים את זה בזמן שאנחנו קובעים את הטestט ומכיוון שהPI עוד לא עובד ועוד לא קיים אז העלות שיבוא שלו היא מסערית
[10:15] (external link, opens in new tab) אוקיי אז בואו נעשה נעשה את הפיל הזה אני בכוונה עושה את זה פיל הוא יותר פשוט מפורתי עד R. מצוין. יופי. אז אם עכשיו זה משהו יותר קרי אז גרמנו הטest לרוץ ולהיקשל. עכשיו אנחנו צריכים ללכת לקוד שלנו ובצורה הפשוטה ביותר לגרום לכל הטestטים לעבור. תזכרו לעשות כמה שיותר הנחות יסוד. אז מה הדבר הכי פשוט שאפשר לעשות? לבדוק אם הטרו ואם כן אז להוסיף.
[10:47] (external link, opens in new tab) >> לבדוק אם הותרו ואם כן אז להוסיף. >> רק להוסיף. רק להוסיף. אין לנו שום טestט אחר שבודק שאם שאם זהפלס אז זה לא מוסיף נכון >> בגלל שהדפולט שלו הוא אפס >> נכון אז אם אני יכול לעשות את זה וכל הטסטינג זה מצוין לי אבל לא אני הולך להשתמש בפט צריך להוסיף לו טסד defultט אפס בכל הטסטים האחרים אז אני אפילו לא צריך לבדוק את הפולס >> צריך להוסיף לו טestטים שתקו אתה >> אני מצטרך להוסיף כי החוד הזה לא יהיה מספיק טוב >> אבל זה כל הרעיון של עבודה אינקרמנטלית אם אני יכול לעשות את הספle gear אז אז אני מכריח את עצמי לכתוב את הטסטים הבא
[11:22] (external link, opens in new tab) שאולי אחר כך לא היה לי צריך לכתוב אותם כי הייתי מרגיש שהקוד כבר עובד בצורה מושלמת הבעיה הרבה פעמים טסטים שאתה כותב אחרי אתה אומר אבל הקוד הזה כבר עובד אני יכול לכתוב פיצ'ר חדש או סתם לכתוב טסטים שגם ככה יעברו אני יודע שהם יעברו אבל אם אתה מתייחס לזה כבג כי הטסטים באמת לא קיימים הפונקציה לא קיימת או פונקציונליות לא קיימת אז אתה מוכח את עצמך גם לכתוב את הטסטים האלה שמתעדים את הפונקציונליות פלוס st בוא נראה
[11:53] (external link, opens in new tab) דם אוקיי זה באמת היה פשוט אז כרגע יש לנו פיצר שעובד חלקית שזה עבודה עם סטור יכול להיות שיש לו בגט שהוא לא שאני לא יכול לכבות אותו בי defaultט אבל הוא עובד חלקית אני כרגע יכול לעשות אפילו דליבר לדבר הזה כן >> אני מרגיש שכשאתה עושה את זה ככה בצורה כזאת אז בעצם אתה צריך לזכור שאמנם הטסטים עוברים אבל יש איזה סנריו מאוד ספציפי למשל הסנריו שבו stדו הוא פלס כן >> ש שלא ש שלא חשבת על שאתה לא צריך לכתוב לו טestטים נכון >> אז זה לא יותר פשוט אתה יודע מראש מה אתה רוצה שיקרה אז תכתוב את כל הטestטים תחסה את כל המקרים ש זה מסודר לך בראש אתה יודע מה כל מקרה צריך לעשות הם כולם יקשלו ואז ואז תכתוב את המימוש למה לא לעשות את זה ככה
[12:36] (external link, opens in new tab) >> שאלה מצוינת יש לי אפילו סלייד על הדבר הזה זה אומר שזה סילה ממש טובה אם יש לי סלייד מוכן לדבר הזה אני לא כותב את כל הטסטים מראש אני כותב לי קומנטים על טestטים שאני לא רוצה רוצה לשכוח והסיבה היא שאני רוצה שכל פעם יהיה לי רק דבר אחד לפתור כי אני רוצה להתמקד בפתרון הבעיה הכי פשוט אם יש לי עכשיו 20 טסטים לפתור אני הולך לתוף את הקוד הכי ג'נרי בעולם עכשיו ואז יכול להיות מאוד להיות שאני גם אכתוב פיצ'רים שהם לא נבדקו בקוד ג'נרינ הכל יכול לקרות אם אני עושה את הדברים אחד אחרי השני על הסיכוי שאני אכניס לו שם פיצ'ר שלא נבדק הוא מאוד נמוך ככה אני מוודא לא רק שלא חסרים מטestטים אלא שאני לא אכתוב קוד כל כך הג'נרי שלא רק שה-20 טסים שכתבתי עוברים יש גם עוד 40 טסטים שיכולתי לכתוב לדבר הזה אבל למי יש כוח משתויות האלה מבין את הנדנט הקוד שלי יהיה הרבה יותר מסובך אם יש לי בעיה גדולה לפתור ש אם יש לי בעיה קטנה לפתור ואז בעיה קטנה לפתור ואז בעיה קטנה לפתור הרבה פעמים הקוד יוצא יותר פשוט ממה שחשבנו שהוא יצא וזה אחד הדברים היפים שקורה עבודה אינקרמנטלית יכולה להוביל לקוד הרבה יותר פשוט ממה שאנחנו חושבים
[13:37] (external link, opens in new tab) שהוא יכול להיות וגם אני לא רוצה לסבלות היום בהגשה שאני לא מצליח לעשות משהו חי לרות היום בהצלחה שאני מצליח הרבה דברים קטנים אוקיי אז אז בגלל זה אני כותב את זה בקומנטים לא חייב להיות אוקיי לא שכנע אין לי לא צריך לשכנע אותך זה עניין של איזשהו משהו שצריך להרגיש בגלל זה הרבה מהקורס הזה הוא קידוד ועבודה אינקרמנטלית עכשיו זה לא אומר שהטestטים האלה לא יעשו אבל אני רוצה לוודא שכשאני עושה אותם אני עושה רק אותם אני עושה רק את מה שצריך לדוגמה
[14:07] (external link, opens in new tab) ה handלciס מחר אוקיי עכשיו אני לא עובד עם דסמלס בכלל נכון אה אנדל יופי and doubles הפצ'רים או testים שלא חשבתי עליהם מה קורה עם נגטiveסimal מה קורה עם דברים אחרים אז אני אכתוב לי בקמנטים את הדברים האלה ואחרי זה אני אמלא אותם אבל אני אחד אחד ואז בכל שלב יש לי משהו שעובד יש לי עוד בראש איזשהו בקלוק קטן שאני עובד בסדר אם יש לי 20 טסים שנכשלים
[14:38] (external link, opens in new tab) אני כל הזמן רואה אותם כל הזמן רואה אותם אומרים לי אתה לא מספיק טוב אתה לא מספיק טוב וככה אני יודע שיש לי מטרות קטנות וקצרות אני לא אשאל לך את זה. בסדר? אוקיי. אז הפיצ'ר שלנו עובר אבל חלקית אנחנו בכלל לא בודקים אם הפג תחשבו על זה עכשיו. עכשיו זה בעצם באג. אין לי שום בעיה לשחזר את הבאג הזה. אני יכול להגיד אה יש לך סטורד ממור אבל אתה לא אמור להשתמש בו.
[15:09] (external link, opens in new tab) ואז אני אחזוב את הטest הזה והטסט הזה יתקשר ואז אני אוסיף את האיף הזה בצורה הכי פשוטה ואז נמשיך הלאה. ככה הייתי עובד על זה בינתיים זה אפילו לא פרerטי למה אני צריך שזה יהיה propפרerטy propפרטי בדרך כלל זה כשיש לך לוגיקה בפנים בינתיים אין לנו שום לוגיקה בפנים נכון אז זה שחשבתם שזה יהיה propפרerטי זה לא אומר שזה יהיה propפרטי וז נושא של simpפליסityי מאוד מאוד עובד פה אוקיי הנושא שהנחות יסוד שלכם הרבה פעמים לגבי איך שאתם ממשו את הפוד מה שבאמת קורה כשמגיע הזמן לממש משהו בצורה הכי פשוטה
[15:41] (external link, opens in new tab) הם הם יכולות להיות מאוד מאוד שונות לנושא של לעשות דברים בצורה כלה פשוטה משנה משנה מאוד הרבה פעמים את הדיזיין שלנו ב עכשיו זה לא אומר שהדיזיין שלנו יהיה מושלם בגלל הדבר הזה וtd זאת לא הדרך היחידה לעשות דיזיין אני מאמין שדיזינר גרוע לא משנה אם הוא יעשה TTD או לא יצא לו דיזיין גרוע אוקיי זאת אומרת אם אתם לא יודעים דיזיין זה לא משנה כמה TDD (external link, opens in new tab) תעשו הקוד שלכם בסוף יהיה איכשהו לא נוח לא לא נעים לא כיף לראות אותו גם אם הוא יהיה הכי טסטable שבעולם
[16:12] (external link, opens in new tab) דיזיין זה מלאכה שלומדים בנפרד ויש ספרים על זה ויש קורסים על זה אנקל גוב יש לו כל רוברט מטין יש לו כמה ספרים יפים על קleן קורד אני ממליץ בחום עוד שאלות שלvידd יש לי משהו לעשות פה ריפאקטורי שאלה לגבי ארכיטקטורה כן >> זאת אומרת עכשיו הוספנו פיצ'ר חדש שרון >> ואתה כרגע כותב את כל הטestטים
[16:42] (external link, opens in new tab) בקלאס אחד >> יהיו אלפי טestט קייסים למחשבון יהיו אלפי טestטים >> מאוד אוקיי >> אוקיי >> יכול להיות >> שאלה איך איך לארגן את זה בצורה נכונה זה די מאורגן תשים לב אם אני מסתכל פה זה כבר מסודר לי לפי פיצ'רים זאת אומרת בגלל הניing convention כל הדברים של נמצאים אחד ליד השני אז יחסית קל לי למצוא את הדברים האלה בגלל name לפעמים וזה קורה מאוד להתים רחוקות אני מפריד את זה גם קלאס פרונקציה או קלאס פרat זה גם בסדר לעשות כל זמן שקל לי למצוא את זה אז זה לא לא צריך להיות דתי בנושא הזה זה רק איזשהו משהו להתחיל איתו בפריים התחלתי שאתם לא בטוחים מה לעשות תשתמשו בזה כשתמצאו משהו יותר טוב תמשו במשהו הזה גם בסדר היום בBDD בפריורקים אחרים יש גם את הנושא של לשים nameספי ולשים דברים שהם nested ונסד clesס אבל בסופו של דבר שלושת חלקי המידע מה אתה בודק
[17:43] (external link, opens in new tab) באיזה סנר ומה אפ תמיד קיימים אוקיי רק שלפעמים קיימים מקומות שונים ברמת הקס ברמת הנס ברמת הפונקציה then מישהו שמע פעם את הדבר הזה given when then given when then זה כשאנשים רואים behavior driven development (external link, opens in new tab) שזה סוג של אבולוציה של לאן TDD מגיע אחר כך זה TDD יותר קרי תחשבו על זה או משהו שאתה יכול לעשות גם קצת יותר עם הלקוח מתמשגן זה סנר
[18:13] (external link, opens in new tab) זה גם זה סוג של act זה behav זה גם הפ שאתה בודק השלושה חלקים האלה גם קיימים במתודולוגיות האחרות אחרי שכבר יהיה לכם ניסיון יהיה לכם יותר קל להתחיל להחליט במה לעבוד זה לא משנה איפה השלושת החלקים האלה כתובים כל זמן שיש לכם אותם הקרירות משתנה מאוד כשיש לכם אז אם אתה רוצה לחלק את זה לקס אחר אין בעיה כל זמן שאתה לא מאבד לי את המידע הזאת >> עדיין אני רוצה אבל שיקריא הסטאפיר דאם אני יש יש פה setup יותר >> כרגע לא >> בדרך כלל דינ בדרך כלל דינ גם בטסטים המסובכים גם כשתמש במק objects setup זה לא כבר רעיון טוב למקובקס גם כי הרבה פעמים משתמשים בהם רק בחלק מהטestי ואז אתה צריך לקרוא את הטestי ואתה חושב שמה שיש בסטנטאפ כולם משתמשים בו ורק חלק משתמשים בו זה כמעט אף פעם לא רוב להשתמש בסטאפ באינטגרש test זה כבר מתחיל להיות רון מעניין אתה רוצה להבי דטב סו דברים כאלה אבל ביני testingים כמעט אף פעם אתה לא תצטרך יהיה לך factטורy methods ובדרך כלל הטest עצמו הואסטקט.
[19:15] (external link, opens in new tab) בסדר? עוד שאלות. הפסקת צהריים מי מעוניין? אוקיי, הפסקה. אה, כמה זמן הפסקה? חצי ש