רווחים:
- יכולת לייצר בדיקות יחידה, אינטגרציה ומקרה קצה עם טענה משמעותית עם AI
- יכולת לחלץ באופן שיטתי כיסוי בדיקות, ערכי גבול ותרחישים שליליים עם תמיכה בבינה מלאכותית
- יכולת לוודא שהבדיקות שמפיקות ה-AI אכן מאמתות התנהגות ולא רק חוזרות על קוד קיים
בדיקה היא המנגנון שמוכיח שהתוכנה אכן מתנהגת כפי שהובטחה. חבילת בדיקה טובה אומרת לך תוך שניות אם שינוי שובר משהו ונותנת למהנדס את החופש לפעול בביטחון. בינה מלאכותית מזרזת את החלק הכי מייגע והכי מדלג בכתיבת מבחנים: יצירת תרחישים רבים, נקודות שבירה ומקרים שליליים. אבל יש כאן מלכודת ערמומית: בינה מלאכותית עשויה לכתוב בדיקות המאמתות את ההתנהגות הנוכחית (אולי השגויה) של הקוד, לא את ההתנהגות שלו לכאורה; או שהוא יכול לייצר בדיקות ריקות שתמיד עוברות, לא ממש בודקות שום דבר. הערך של מבחן הוא לא האם הוא עובר, אלא האם הוא בודק את הדבר הנכון והופך לאדום כאשר הוא לא בסדר.
ביחידה זו תלמדו כיצד לייצר מבחני יחידה, אינטגרציה ומקרי קצה עם קביעות משמעותיות; כיצד לחלץ באופן שיטתי כיסוי מבחן, נקודות שבירה ותרחישי חסרון; ונראה כיצד תוכל לבדוק שהבדיקות שה-AI מייצרת אכן מאמתות התנהגות.
מושגים: בדיקת יחידה: בודק פונקציה/מעמד בודד בבידוד. בדיקת אינטגרציה: בודקת שחלקים מרובים עובדים יחד בצורה נכונה. טענה: הצהרה הבודקת שהתוצאה שווה למה שהיה צפוי; זה לב המבחן. כיסוי: כמה מהקוד מופעל על ידי בדיקות; כיסוי גבוה אינו מבטיח איכות.
הפקת מבחנים משמעותיים
מבחן טוב עושה שלושה דברים בצורה ברורה: הוא קובע מצב, הוא מבצע פעולה, הוא קובע את התוצאה. בעת הדפסת בדיקות ל-AI, ציין איזו התנהגות ברצונך לאמת ואילו תרחישים היא אמורה לכסות; אחרת, זה מייצר מבחנים שטחיים שתמיד עוברים.
- הגדר את ההתנהגות שיש לבדוק. "מה נחשב נכון?" ענה על השאלה בצורה ברורה.
- בקש סוגי תרחישים. רגיל, גבול, שלילי, מצב שגיאה.
- ייבא טענה משמעותית. זה לא רק "זרק שגיאה", זה "החזיר את הערך הנכון".
- בדוק את דיוק הבדיקה. האם המבחן הופך לאדום כאשר שוברים את הקוד במודע?
הנחיה להפקת בדיקה מקיפה: "כתוב בדיקות יחידה עבור הפונקציה הבאה 'applydiscount(amount, coupon)'. יש לפחות תרחיש אחד בקטגוריות הבאות: (1) קופון תקף רגיל, (2) נקודות שבירה (0 סכום, 100% הנחה), (3) שלילי (קופון לא חוקי, סכום שלילי צפוי), (4) במקרה של שגיאה CONC. (לא רק 'עבד').
הנחיה לחילוץ ערך גבול: "בצע ניתוח ערכי גבול עבור הקלט של פונקציה זו. עבור כל פרמטר, חלץ את הערכים 'רק בגבול', 'ממש מתחת לגבול', 'ממש מעל הגבול' כטבלה. לאחר מכן רשום את תרחישי הבדיקה המכסים את הגבולות הללו. אל תכתוב עדיין קוד, רק ניתוח ורשימת תרחישים. פונקציה: [חתימה
זהירות: כיסוי בדיקה גבוה (למשל 90%) אינו מוכיח שהקוד נכון. כיסוי מודד כמה שורות בוצעו; לא שהקווים האלה מייצרים את התוצאה הנכונה. בדיקה ללא טענה משמעותית מגדילה את הכיסוי אך אינה מבטיחה דבר. התוכן של הטענה קובע את האיכות, לא את מספר הטענות.
בדיקת המבחן עצמו: ההיגיון של המוטציה
הדרך המעשית ביותר להבין האם מבחן ה-AI אכן עובד היא לשבור בכוונה את הקוד (לוגיקת בדיקת מוטציות). הפוך תנאי, עשה סימן + -; אם אף בדיקה לא הופכת לאדום, הבדיקות שלך לא ממש שומרות על התנהגות זו.
הנחיה לבדיקת נקודות תורפה: "תגיד לי אילו באגים פוטנציאליים בקוד הזה הבדיקות הבאות עשויות לא לתפוס. הצע 5 מוטציות קטנות שניתן לבצע בקוד (למשל >= במקום >, - במקום +) וציין עבור כל אחד אם בדיקות קיימות יתפסו אותו. למי שלא נתפס, הצע בדיקה שיש להוסיף. קוד: [קוד] בדיקות: [test]
הנחיה חלשה / הנחיה חזקה
WEAK: "כתוב מבחן לפונקציה הזו." (תוצאה: בדרך כלל תרחיש מאושר אחד, טענה חלשה; מפספס שגיאות.) STRONG: "כתוב מבחן לפונקציית 'סיסמה חזקה' זו. כלל: לפחות 8 תווים, אות גדולה אחת, חובה ספרה אחת. כסו את התרחישים הבאים כמבחנים נפרדים: בדיוק 8 תווים (מגבלה), 7 תווים (מתחת לגבול), ללא מחרוזת ריקה מדי, אותיות רישיות ריק מדי, אותיות גדולות מדי. (1000 תווים) טען במפורש את הערך הצפוי נכון/שקר בכל בדיקה ותן שם לבדיקה לפי מה שהיא בודקת."
הנחיה עוצמתית נותנת כללים ותרחישי גבול מלאים. צמדי גבול כמו "בדיוק 8/7 תווים" הם המקומות הנפוצים ביותר לעשות טעויות (מבלבל > עם >=). הנחיה חלשה עוקפת את הגבולות הללו ומעבירה את השגיאה לייצור.
סוגי בדיקה והיכן להשתמש
סוג בדיקה
מה זה מאשר?
תרומת AI
תשומת לב
יחידה
פונקציה/מעמד יחיד
מייצר ריבוי תרחישים במהירות
נדרשת טענה משמעותית
אינטגרציה
חלקים עובדים יחד
טיוטה של תרחיש ונתונים מדומה
התנהגות ממכרת אמיתית
לסיים/לקבל
זרימת המשתמש המלאה
רשימת צעדים וציפייה
נוטה לשבירות
רגרסיה
שגיאה ישנה לא חוזרת
בדיקה ספציפית לתקלה
יש להוסיף לכל תיקון
מיני מארזים
מקרה 1 - המבחן שתמיד עובר. AI כותב 12 בדיקות לפונקציה וכולם עוברים. המהנדס הופך לחשוד ומעוות בכוונה את ערך ההחזר של הפונקציה; רק 3 מהבדיקות הופכות לאדומות. 9 המבחנים האחרים אינם מכילים הצהרות משמעותיות. הבדיקה מתחזקת על ידי ציד מוטציות; הגנה אמיתית מושגת ב-9 תרחישים.
מקרה 2 - טעות גבול. פונקציית אימות גיל צריכה לומר "18 ומעלה בתוקף" אבל כתוב >18, כלומר גיל 18 נדחה. השגיאה מופיעה מיד בבדיקה מכיוון שה-AI מייצר את תרחיש "בדיוק 18" באמצעות ניתוח נקודות שבירה. בדיקת מגבלה אחת מונעת תלונות אמיתיות של משתמשים.
מקרה 3 - תיקון התנהגות נוכחית. כאשר נאמר ל-AI "לכתוב מבחן על סמך הקוד הזה", הוא מייצר מבחן שמקבל כ"נכון" שגיאת עיגול שכבר קיימת בקוד. כאשר המהנדס מדפיס את הבדיקה לפי הדרישה (הערך הנכון הצפוי) ולא הקוד, הבדיקה הופכת לאדום והשגיאה האמיתית מתרחשת. מבחנים צריכים להיגזר מציפייה, לא מקוד.
טעויות נפוצות
- טענה חסרת טעם. "לא זרק שגיאה" זה לא מספיק; יש לאמת את הערך הנכון.
- מבלבל בין היקף לאיכות. כיסוי גבוה אינו ערובה לתוצאות מדויקות.
- הדפסת הבדיקה לפי קוד. מתקן את השגיאה הנוכחית ל"נכון"; המבחנים צריכים לנבוע מציפייה.
- דילוג על ערכי גבול. לבלבל > עם >= היא הטעות הנפוצה ביותר; יש לבדוק זוגות גבול.
- לא מבקר את הבדיקה עצמה. בדיקה שלא הופכת לאדום כששבורים את הקוד לא מספקת הגנה.
לסיכום
חבילת בדיקות טובה היא המפתח לביצוע שינויים בביטחון. AI מייצר במהירות שפע של תרחישים, גבולות ומצבים שליליים; אבל אם הוא שואב בדיקות מקוד ולא מדרישות, הוא יכול לתקן באגים קיימים או לכתוב מבחנים חסרי משמעות שתמיד עוברים. קבע את הערך הצפוי הקונקרטי בכל מבחן, כלול צמדים קשורים, וודא שהבדיקות שלך אכן מגנות על ידי שבירת הקוד בכוונה. התוכן של הטענה, לא מספר ההיקפים, קובע את האיכות.
משימת יישום
בחר פונקציה ובקש ממנה ליצור בדיקות בארבע קטגוריות (רגיל, מגבלה, שלילי, שגיאה) עם הנחיה מקיפה להפקת בדיקה; קבע את הערך הצפוי הקונקרטי בכל מבחן. לאחר מכן הפעל את הפקודה לחיפוש פגיעות בדיקה, הצע 5 מוטציות קטנות בקוד, והפעל את הבדיקות כדי לבדוק אילו מהן הם תופסים. הוסף בדיקה חדשה למוטציה אחת לפחות שלא נתפסה והראה שהיא כעת במינוס.
רשימת בדיקה
- [ ] הדפסתי את הבדיקות על סמך ההתנהגות הצפויה/נכונה, לא על הקוד.
- [ ] כיסיתי תרחישים רגילים, מגבלה, שליליים ושגיאות.
- [ ] טענתי את הערך הצפוי הקונקרטי בכל מבחן.
- [ ] בדקתי זוגות גבול (ממש מעל מתחת / ממש מעל מתחת).
- [ ] על ידי שבירת הקוד בכוונה, אישרתי שהבדיקות הפכו לאדומות.
- [ ] הוספתי בדיקה חדשה למוטציות שלא זוהו.