תפריט

מחולל כתובות אקראיות: למה אקראי לא צריך להיות כאוטי

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

פורסם

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

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

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

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

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

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

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

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

מה צריך להיות אקראי ומה צריך להיות קבוע?

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

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

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

מדוע שחזור עדיף על מגוון?

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

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

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

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

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

כיצד ייצוא באצווה משנה את חבילת הבדיקות?

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

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

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

מה נשבר ראשון כשמערבבים מדינות?

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

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

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

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

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

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

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

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

מה רשומה אקראית אינה יכולה להיות?

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

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

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

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

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

המשך קריאה

כלים פופולריים ומדריכי שימוש