התלמוד של המפתחהתלמוד של המפתח

מסכת בדיקות

Unit Tests

5 הלכות

א

ה-unit test חייב להיות עצמאי לחלוטין. תוצאתו אינה תלויה בסדר הריצה, בשעה ביום, ולא בבדיקה אחרת.

בדיקה התלויה בבדיקה אחרת — כאילו עד שתעידתו תלויה בעדות חברו. ואמרו חכמים: בדיקה שעוברת לבדה וכושלת בחבורה — בדיקה רעה היא.

ב

אסור ל-unit test לגשת לרשת, לבסיס נתונים, או לקבצים. הגש — חסום. הגישה — mock.

שכן unit test שגש לרשת תלוי בשרת חיצוני שעשוי לא להיות זמין. ויהי יום ויפול השרת — ויכשלו אלף בדיקות שאינן קשורות לבעיה. ויתעו המפתחים, ולא ידעו מה נשבר.

מחלוקת
רבי ג'סט הצעיר אומר:

כל תלות חיצונית — חובה לעשות mock. בדיקה שגישה לרשת אינה unit test, היא בדיקת קשרים. מהירות ובידוד — הם נשמת ה-unit test.

רבי DHH המשוחרר חולק ואומר:

mock יוצר בדיקות שעוברות וקוד שנכשל. בדוק את הדבר האמיתי, לא את הצל שלו. test שמסכים עם mock — לא מוכיח כלום.

רבי ג'סט הצעיר:

ומה בסביבת CI ללא DB? ומה עם מהירות?

רבי DHH המשוחרר:

תעלה test container. SQLite לבדיקות. אין תירוץ.

רבי ג'סט הצעיר:

test container לוקח 30 שניות לעלות. suite של אלף בדיקות — אינו אופציה.

רבי DHH המשוחרר:

אז אל תכתוב אלף unit tests. כתוב מאה integration tests טובים.

תֵּיקוּ

ג

unit test חייב לרוץ בפחות ממאית השניה. בדיקה איטית — לא תרוץ, ובדיקה שלא תרוץ — לא קיימת.

ודרשו חכמים: test suite שלוקח עשר דקות — מפתחים ימנעו מלהריץ אותו. ומה שלא מריצים — לא מוצא באגים. הוי אומר: מהירות הבדיקה היא חלק מכשרותה.

ד

כתוב לפי סדר: Arrange, Act, Assert — הכן, פעל, בדוק. הבדיקה שאינה מסודרת כך — קשה לקריאה ולתחזוקה.

Arrange: הכן את התנאים. Act: הפעל את הנבדק. Assert: בדוק את התוצאה. שלושה שלבים, שלושה קטעים, ורצוי שורה ריקה ביניהם. כך כל קורא מבין מיד מה קורה.

ה

mock רק מה שבאמת צריך. הממיר הכל ל-mocks — כאילו בדק את ה-mock ולא את הקוד.

ומעשה היה בצוות שכתב unit test שכל תלויותיו mocks — ויעבור הbדיקה בהצלחה, ויכשל הקוד בייצור. ויאמרו: "אבל הבדיקות עברו!" — ותהי האי-הבנה גדולה.