ה-unit test חייב להיות עצמאי לחלוטין. תוצאתו אינה תלויה בסדר הריצה, בשעה ביום, ולא בבדיקה אחרת.
בדיקה התלויה בבדיקה אחרת — כאילו עד שתעידתו תלויה בעדות חברו. ואמרו חכמים: בדיקה שעוברת לבדה וכושלת בחבורה — בדיקה רעה היא.
מסכת בדיקות
5 הלכות
ה-unit test חייב להיות עצמאי לחלוטין. תוצאתו אינה תלויה בסדר הריצה, בשעה ביום, ולא בבדיקה אחרת.
בדיקה התלויה בבדיקה אחרת — כאילו עד שתעידתו תלויה בעדות חברו. ואמרו חכמים: בדיקה שעוברת לבדה וכושלת בחבורה — בדיקה רעה היא.
אסור ל-unit test לגשת לרשת, לבסיס נתונים, או לקבצים. הגש — חסום. הגישה — mock.
שכן unit test שגש לרשת תלוי בשרת חיצוני שעשוי לא להיות זמין. ויהי יום ויפול השרת — ויכשלו אלף בדיקות שאינן קשורות לבעיה. ויתעו המפתחים, ולא ידעו מה נשבר.
כל תלות חיצונית — חובה לעשות mock. בדיקה שגישה לרשת אינה unit test, היא בדיקת קשרים. מהירות ובידוד — הם נשמת ה-unit test.
mock יוצר בדיקות שעוברות וקוד שנכשל. בדוק את הדבר האמיתי, לא את הצל שלו. test שמסכים עם mock — לא מוכיח כלום.
ומה בסביבת CI ללא DB? ומה עם מהירות?
תעלה test container. SQLite לבדיקות. אין תירוץ.
test container לוקח 30 שניות לעלות. suite של אלף בדיקות — אינו אופציה.
אז אל תכתוב אלף unit tests. כתוב מאה integration tests טובים.
תֵּיקוּ
unit test חייב לרוץ בפחות ממאית השניה. בדיקה איטית — לא תרוץ, ובדיקה שלא תרוץ — לא קיימת.
ודרשו חכמים: test suite שלוקח עשר דקות — מפתחים ימנעו מלהריץ אותו. ומה שלא מריצים — לא מוצא באגים. הוי אומר: מהירות הבדיקה היא חלק מכשרותה.
כתוב לפי סדר: Arrange, Act, Assert — הכן, פעל, בדוק. הבדיקה שאינה מסודרת כך — קשה לקריאה ולתחזוקה.
Arrange: הכן את התנאים. Act: הפעל את הנבדק. Assert: בדוק את התוצאה. שלושה שלבים, שלושה קטעים, ורצוי שורה ריקה ביניהם. כך כל קורא מבין מיד מה קורה.
mock רק מה שבאמת צריך. הממיר הכל ל-mocks — כאילו בדק את ה-mock ולא את הקוד.
ומעשה היה בצוות שכתב unit test שכל תלויותיו mocks — ויעבור הbדיקה בהצלחה, ויכשל הקוד בייצור. ויאמרו: "אבל הבדיקות עברו!" — ותהי האי-הבנה גדולה.