תפריט

נתוני בדיקה קבועים לזהות: כיצד לארגן רשומות לבדיקות מהימנות

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

פורסם

  • נתוני בדיקה
  • זהות
  • בדיקות אוטומטיות

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

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

מה שייך לנתוני בדיקה קבועים ולא למחולל?

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

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

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

מדוע הגרלה בכל הרצה הופכת כשלים לבלתי ניתנים לשחזור?

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

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

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

כיצד יש לתת שמות ולקבץ רשומות קבועות?

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

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

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

אילו מקרי קצה של זהות ראויים לרשומה קבועה?

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

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

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

כיצד רשומות קבועות נרקבות, ומה עוצר זאת?

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

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

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

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

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

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

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

למפתחים: מבנה מערך הנתונים הקבועים

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

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

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

הצעדים הבאים

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

המשך קריאה

מדריכים בנושא מחולל זהויות ונתוני בדיקה