מדוע בדיקות ידניות של אתר מפסיקות לתפוס רגרסיות
בדיקות רגרסיה ידניות נתקלות באופן צפוי בתקרה, כאשר מספר התרחישים גדל מהר יותר מהצוות. עבור מהדורה שבה השתנתה טופס תשלום אחד, יש להריץ את כל הקטלוג, הסל, האזור האישי והשלמת ההזמנה — והבודק עובר פיזית את אותם מסלולים כל עוד תשומת הלב מחזיקה מעמד.
עד השעה השלישית של הרצות חוזרות ונשנות מפספסים מקרי קצה: קוד קופון ריק, מוצר שאזל בין הוספה לסל לתשלום, שליחה חוזרת של טופס בלחיצה כפולה.
המחיר של טעות כזו — הוא פגם שלא נמצא בפרודקשן. הרגרסיה צפה כבר אצל הלקוחות, והניתוח אורך יותר זמן ממה שהיה אורך ההרצה, כי השחזור תלוי ברצף ספציפי של צעדים, במצב הסל ובנתוני המשתמש. ככל שהמהדורות תכופות יותר, כך חלון הזמן בין ההעלאה לגילוי קצר יותר — וכך יקר יותר כל שבר שהוחמץ.
בדיקות E2E עם Selenium סוגרות בדיוק את צוואר הבקבוק הזה: התרחיש מתואר פעם אחת בקוד ומכאן ואילך מבוצע באופן זהה בכל מהדורה, ללא עייפות וללא שונות.
הבדיקות האוטומטיות עוברות את מסלול המשתמש המלא — מפתיחת העמוד ועד אישור ההזמנה — בדפדפן אמיתי, עם מעברים אמיתיים ובדיקת מצב לאחר כל צעד. ההרצה מתבצעת במקביל על פני מספר דפדפנים ורזולוציות, ולכן הרגרסיה נתפסת לפני ההעלאה, ולא אחריה.
ההבדל המרכזי מבדיקה ידנית — הוא יכולת השחזור. הבדיקה או עוברת, או נכשלת עם צעד ספציפי, צילום מסך ולוג, ותוצאה זו אינה תלויה במי ובאיזה מצב רוח הפעיל את הבדיקה. נבחן כיצד נבנה מעגל כזה ומה נדרש כדי שהוא לא יהפוך לאוסף שברירי של בדיקות שנכשלות.
מה נותן בדיקות מקצה לקצה בדפדפן
תרחיש מקצה לקצה עובר את מסלול המשתמש כולו — מפתיחת העמוד ועד אישור ההזמנה באזור האישי. הוא תופס את מה שבדיקות יחידה לא רואות: אי-סנכרון בין הפרונטאנד ל-API, סשן שאבד לאחר הפניה מחדש, תגובה שגויה משער התשלומים, פריסה "שזזה" בשלב ביניים.
בדיוק פגמים כאלה מגיעים ללקוח ועולים הכי יקר — השבתת ביצוע הזמנות לכמה שעות בולטת יותר מכל שגיאה פנימית.
Selenium WebDriver שולט בדפדפן אמיתי בדיוק כפי שאדם עושה זאת: לוחץ, מזין נתונים, ממתין לתגובת השרת. הרצה של סט של 40-60 תרחישים מרכזיים אורכת 10-15 דקות בתהליכונים מקבילים — זה נכנס לכל קומיט, ולא להרצה לילית.
שיעור הפגמים שנתפסים לפני שחרור עולה מ-60-70% ל-90%+: מסלולי תשלום, הרשמה ואימות קריטיים מכוסים בבדיקות באופן קבוע, ולא לפני העלאה לאוויר.
יציבות השחרורים נשענת על עמידות הבדיקות עצמן. אנו בונים לוקטורים על data-attributes, ולא על שרשראות של מחלקות, מבודדים נתוני בדיקה ומסירים תלות בסדר ההרצה — הסט מפסיק "לההבהב" ומתחילים לסמוך עליו.
בנפרד אנו מנהלים דיווח: עבור כל כשל נראים השלב, צילום המסך ותגובת השרת, ולכן הבירור אורך דקות, ולא שעות של חפירה בלוגים.
סוג הכשל שנעלם יחד עם זה — רגרסיה באזורים סמוכים. תיקון בסל שובר את ביצוע ההזמנה, עדכון ספרייה מפיל רשימות נפתחות — בדיקות מקצה לקצה מראות זאת בבנייה, ולא ביום השחרור. זמן ההרצה וכיסוי התרחישים הופכים למדידים: רואים כמה מסלולים מכוסים וכמה דקות אורכת הבדיקה לפני העלאה לאוויר.
השוואת גישות לאוטומציה של בדיקות ממשק
בחירת הכלי קובעת לא את המהירות שבה נכתבות הבדיקות הראשונות, אלא כמה זמן הן ישרדו בלי להיכתב מחדש. פריימוורק קוד, בונה low-code ושירות ענן פותרים משימה אחת בדרכים שונות, ומעבר ביניהם כמעט תמיד משמעו בנייה מחדש של המערכת מאפס — לכן את ההחלטה מקבלים לפני ההתחלה, ולא תוך כדי.
| אפשרות | מתי מתאימה | מגבלות |
|---|---|---|
| פריימוורק קוד | תרחישים מורכבים, אימות, אינטגרציות, טפסים דינמיים; בדיקות במאגר משותף לצד המוצר | נדרשים מהנדסים מנוסים; זמן ארוך יותר עד לבדיקות יציבות ראשונות |
| בונה low-code | מסלולי משתמש טיפוסיים, עריכות תכופות מצד העסק, כיסוי מהיר של העמודים העיקריים | מתקשה עם לוגיקה לא סטנדרטית וציפיות מורכבות; נתקל בתקרה עם גידול התרחישים |
| שירות ענן | נדרש הרצה על סביבות ודפדפנים רבים בלי תשתית משלנו | תלות בפלטפורמה חיצונית, מגבלות בהרשאות גישה לסביבות פנימיות, תשלום לפי נפח ההרצות |
מה חשוב בפועל
פריימוורק קוד נותן שליטה מלאה על הציפיות והסנכרון, אבל דורש משמעת: בלי שכבת Page Object וציפיות מפורשות הבדיקות מתחילות ליפול על דברים של מה בכך. low-code מנצח בהתחלה — התרחישים הראשונים נבנים בתוך ימים — אבל כשהלוגיקה מסתבכת חלק מהשלבים בכל זאת עוברים לקוד. שירות ענן מסיר את שאלת התשתית, אך מוסיף מגבלות בהרשאות ובצפיות של הסביבות.
הניסיון שלנו: לרוב התוכנית העובדת היא פריימוורק קוד לנתיבים קריטיים ו-low-code לכיסוי מהיר של עמודים משניים. היבריד כזה נותן כיסוי בלי גידול בזמן התחזוקה. אנחנו מנתחים את התרחישים שלכם ובוחרים את האפשרות המתאימה להם.
כיצד אנו מיישמים בדיקות E2E עם Selenium
את היישום אנו מתחילים בסקירת תרחישים: מנתחים את מסלולי המשתמש שמניבים הכנסות ושנשברים לרוב — ביצוע הזמנה, תשלום, הרשמה, אזור אישי. עבור כל אחד מהם אנו מתעדים את התוצאה הצפויה ואת נקודות הכשל, מסננים כפילויות ומסלולים שעדיף לכסות בבדיקות יחידה. בתום התהליך מתקבלת מפת עדיפויות: מה מכסים ראשונים ומה דוחים במודע.
לאחר מכן בונים את סכמת הבדיקות ואת הסביבה. מקימים סטנד מבודד עם נתוני בדיקה, מכינים תמונות דפדפן ודרייברים, ומגדירים הרצה מקבילית כדי שהריצה לא תימשך שעות. את הבדיקות כותבים ב-Selenium WebDriver עם המתנות מפורשות במקום השהיות — כך הבדיקות לא "מהבהבות" ברשת איטית.
- סקירת תרחישים — מיפוי מסלולים, עדיפויות, קריטריוני מעבר.
- סכמת כיסוי — אילו בדיקות ב-E2E ואילו עוברות לרמה נמוכה יותר, מפת תלויות.
- הגדרת הסביבה — סטנד בדיקות, נתונים, דפדפנים, הרצה מקבילית.
- כתיבה והרצה — בדיקות ב-Selenium WebDriver, דיבוג עד לריצה ירוקה יציבה.
- בדיקת עמידות — הרצה בסדרות, איתור בדיקות לא יציבות, בידוד נתונים בין בדיקות.
- מסירה — הרצה בצינור הבנייה המשותף, דוחות, הוראות לצוות.
עבורנו יציבות אינה ריצה ירוקה חד-פעמית אלא חזרתיות: מריצים את המערך בסדרות ומנקים בדיקות שנופלות לא בגלל פגם אלא בגלל מרוץ נתונים או תזמונים. כל בדיקה מקבלת נתונים משלה ואינה תלויה בשכנותיה, ולכן נפילה מצביעה על בעיה אמיתית ולא על סדר ההרצה.
אנו מוסרים לא רק קוד אלא גם קונטור עובד: הבדיקות רצות בצינור הבנייה המשותף על כל שינוי, והדוח מראה איזה מסלול נפל ובאיזה שלב. הצוות רואה רגרסיה לפני הפריסה ולא אחרי תלונות המשתמשים.
ארטיפקטים: קונפיגורציות, דוחות ותקנות הרצה
בפלט — לא "תיקייה עם בדיקות", אלא ערכה שלפיה צוות הלקוח יכול להריץ, לקרוא ולפתח בדיקות בלעדינו. כל ארטיפקט סוגר סוג שאלות משלו: קונפיגורציות — "איך לשחזר את הסביבה", דוחות — "מה בדיוק נפל", תקנות — "מי ומתי מריץ".
- קונפיגורציות סביבות — פרופילים להרצה מקומית, סביבת קבלה וקדם-פרודקשן, עם כתובות, חשבונות וסטים של נתוני בדיקה מופרדים; סודות אינם נמצאים במאגר, אלא מוזרקים ממאגר מאובטח.
- מפת תרחישים — מפת כיסוי: אילו מסלולי משתמש מכוסים בבדיקות מקצה לקצה, היכן נותרו שלבים ידניים ומדוע; לפיה רואים מה בדיוק נבדק בכל ריצה.
- מדיניות גישה ותפקידים — אילו חשבונות נדרשים לבדיקות, אילו הרשאות ניתנו להם וכיצד הם מבודדים מנתוני עבודה, כדי שריצה לא תפגע במשתמשים אמיתיים.
- דוחות ריצה — תוצאה לכל תרחיש עם השלב שבו אירעה התקלה, צילום מסך של מצב העמוד ולוג מצורף; כשל מנותח ללא שחזור ידני חוזר.
- תקנון הרצה — מתי הבדיקות רצות אוטומטית (בכל קומיט ולפני העלאה), מתי לפי לוח זמנים, מי מסתכל על התוצאה ובאיזה פרק זמן מגיב לריצה אדומה.
- הוראות תחזוקה — כיצד להוסיף תרחיש חדש, לעדכן סלקטור לאחר שינוי בתבנית ולאן להסתכל אם בדיקה החלה ליפול ללא שינויים בקוד.
- יומן בדיקות לא יציבות — רשימת תרחישים שנופלים מעת לעת מסיבות חיצוניות, עם ציון הסיבה והחלטה: לתקן, לבודד או להסיר.
את הערכה מעבירים עם הסבר: מראים כיצד להריץ ריצה בסביבה שלכם, היכן להסתכל על הדוח ומה לעשות בעת נפילה. לאחר מכן צוות הלקוח מנהל את הבדיקות בעצמו — או שאנחנו נשארים בתמיכה לפי תקנון מוסכם.
מקרה בוחן: כיצד קוצר זמן הרגרסיה בפורטל גדול
פורטל עם אזור אישי, קטלוג והגשת בקשות התנהל על רגרסיה ידנית: שלושה מהנדסים השקיעו יומיים בהרצה מלאה לפני כל שחרור, וחלק מהבדיקות בסוף המחזור בוצעו "מהזיכרון".
במקביל הצטברו פגמים שהתגלו כבר בפרודקשן — לרוב בשרשראות "אימות → סל → תשלום", שבהן שחזור ידני של התרחיש יקר לביצוע חוזר.
פירקנו את מסלולי המשתמש הקריטיים והעברנו אותם לבדיקות E2E ב-Selenium WebDriver: אימות ושחזור גישה, חיפוש ומסנני הקטלוג, הגשת בקשה, האזור האישי, אינטגרציה עם שער התשלומים בסביבת בדיקות.
הבדיקות רצות בקונטיינרים בסביבות מבודדות, הנתונים מוכנים ומתגלגלים לאחור לפני כל תרחיש — ההרצה אינה תלויה במצב של הקודם.
מה השתנה במדדים
| מדד | לפני | אחרי |
|---|---|---|
| רגרסיה מלאה | 2 ימי עבודה | 40 דקות |
| שיעור הפגמים שנתפסו לפני שחרור | ~60% | 92% |
| בניות לא יציבות בגלל בדיקות | — | פחות מ-3% מההרצות |
| בדיקות ידניות לשחרור | כולן | רק תרחישים חדשים |
היציבות לא הושגה ב"קסם של הפריימוורק", אלא במשמעת: המתנות מפורשות במקום השהיות קבועות, לוקטורים יציבים, שכבת הכנת נתונים נפרדת והרצה מחדש אוטומטית רק לתרחישים עם תלויות חיצוניות. כל הרצת לילה נאספת לדוח עם השלב שבו נכשל הבדיקה, צילום מסך ולוג — הניתוח אורך דקות ולא חצי יום.
חודשיים לאחר ההטמעה הפסיקה הצוות לפחד משחרורים בימי שישי: הרגרסיה רצה לפי לוח זמנים, והמהנדסים עוסקים בתרחישים חדשים ובניתוח פגמים אמיתיים במקום לחזור על אותן הקלקות שוב ושוב.
במה שונה בדיקת E2E מבדיקת אינטגרציה ובדיקת יחידה?
בדיקת יחידה בודקת יחידת לוגיקה אחת מבודדת: פונקציית חישוב הנחה, מאמת שדה, המרת פורמט. כל התלויות החיצוניות — בסיס נתונים, רשת, שער תשלום — מוחלפות בתחליפים, ולכן בדיקה כזו מתבצעת במילישניות ומצביעה במדויק היכן נשבר.
בדיקת אינטגרציה הולכת צעד אחד גבוה יותר: היא בודקת את החיבור בין שניים-שלושה רכיבים — שהשירות כותב נכון לבסיס הנתונים, שמודול ההזמנות אכן קורא למודול התשלום, שהתור מעביר את ההודעה למעבד הנכון. היא תופסת שגיאות חוזים ופורמטים שבדיקות יחידה לא רואות מעצם הגדרתן.
בדיקת E2E — זהו תרחיש מקצה לקצה מנקודת המבט של משתמש אמיתי: לפתוח את האתר, להתחבר, לאסוף סל קניות, לבצע הזמנה, לראות אישור. כאן אין תחליפים — פועל דפדפן אמיתי, backend אמיתי, בסיס נתונים אמיתי.
בדיוק משום כך הבדיקה מקצה לקצה עונה על השאלה המרכזית של העסק: "האם המוצר עובד בשלמותו", ולא "האם פונקציה בודדת עובדת".
פירמידת הבדיקות מסדרת את הרמות הללו לפי יחס של מחיר ותועלת. בבסיס — מאות בדיקות יחידה: זולות, מהירות, מורצות על כל שינוי. באמצע — עשרות בדיקות אינטגרציה: יקרות יותר, אך מכסות את החיבורים. בפסגה — בודדות של תרחישי E2E על מסלולי משתמש קריטיים: ביצוע הזמנה, הרשמה, תשלום.
אסור להפוך את הפירמידה: אם בונים בדיקות רק על תרחישים מקצה לקצה, ההרצה מתארכת, הנפילות אינן יציבות, והסיבה לתקלה אינה ברורה.
בפועל הגבול מיטשטש: בדיקת אינטגרציה עם בסיס נתונים אמיתי ו-frontend מורם היא כבר כמעט E2E. אנו מסמנים את הרמות לפי מה בדיוק מוחלף בתחליף — זה נותן קריטריון חד-משמעי ועלות תחזוקה צפויה של מערך הבדיקות.
ספקות טכניים נפוצים לפני ההתחלה
לפני ההתחלה מהנדסים בדרך כלל שואלים את אותה קבוצת שאלות — ואלו שאלות נכונות. בדיקות E2E ב-Selenium WebDriver נשברות לא בכתיבת התרחישים, אלא בתפעולם: סלקטורים משתנים יחד עם המרקם, סביבות מתפצלות, נתוני בדיקה מתנגשים בין ריצות. להלן — כיצד אנו סוגרים כל אחד מהמקומות הללו.
האם הבדיקות לא יהפכו לשבריריות בעוד חודש?
שבריריות היא תוצאה של הצמדות למרקם. אנו מוציאים את הלוקטורים לשכבה נפרדת, משתמשים במאפיינים יציבים במקום שרשראות של מחלקות ומוסיפים המתנות מפורשות לתנאי במקום השהיות קבועות. בדיקה שנופלת בגלל כפתור ששמו שונה מתוקנת במקום אחד, ולא בארבעים תרחישים.
מי מתחזק את המערכת לאחר המסירה?
התחזוקה מובנית לתוך המבנה: דפים מתוארים כאובייקטים, צעדים — כפעולות לשימוש חוזר, והדיווח מראה איזה צעד בדיוק נפל ובאיזה צילום מסך. זה מפחית את עלות התיקון לדקות ומאפשר לצוות שלכם לנהל את המערכת באופן עצמאי, בלעדינו.
כיצד הבדיקות מתנהגות בסביבות שונות?
כתובות, חשבונות ופרמטרים של דפדפנים אנו מוציאים לקונפיגורציה, ולא לקוד. אותה מערכת רצה על סביבת הפיתוח, הפרה-פרודקשן והפרודקשן ללא תיקונים — משתנה רק פרופיל ההרצה.
מה עם נתוני הבדיקה?
כל ריצה מכינה את הנתונים שלה ומנקה אחריה, ולכן הבדיקות אינן תלויות בסדר ההרצה ואינן מתנגשות בהרצה מקבילה. במקומות שבהם נדרשים נתונים ממערכות חיצוניות, אנו מציבים תחליפים — המערכת מפסיקה להיות תלויה בזמינות של אחרים.
כיצד זה ישתלב בצינור הבנייה שלנו?
המערכת רצה לפי לוח זמנים ועל כל שינוי, הדוח מגיע לערוץ הרגיל של הצוות, ונפילה חוסמת את השחרור. החזרה לאחור היא פשוט השבתת הצעד: הבדיקות אינן נוגעות בקוד האפליקציה ואינן מפריעות לשחרור, אם מסירים אותן באופן זמני.
תארו את המשימה שלכם — נחזור עם הערכה ותוכנית: אילו תרחישים סוגרים ראשונים, כיצד נארגן את הנתונים ומה יידרש מהתשתית שלכם.
נדון במשימה שלכם ונחזור עם תוכנית
כדי לחזור עם הערכה ותוכנית, ולא עם מילים כלליות, עלינו להבין את המתאר שלכם: אילו תרחישים קריטיים, היכן נמצאים הבדיקות, מי מריץ אותן ובאיזו תדירות.
בדיקות E2E ב-Selenium WebDriver נשברות לא ב"כתיבת בדיקות", אלא בסביבה ובתחזוקה — לכן תחילה מבהירים את הנתונים הראשוניים, ורק אחר כך מחשבים.
מה מבהירים בשיחה הראשונה:
- אילו מסלולי משתמש סוגרים בראש סדר העדיפויות — תשלום, הרשמה, אזור אישי, ביצוע הזמנה;
- על איזו סביבה מריצים — מתאר בדיקות נפרד או סביבה דמוית-פרודקשן עם נתוני בדיקה;
- כיצד הבדיקות משתלבות בתהליך שלכם — הרצה ידנית, בנייה לילית או בדיקה לפני העלאת גרסה;
- אילו דפדפנים ורזולוציות בעדיפות אצל הקהל שלכם;
- מי מצד המזמין מקבל את התוצאה ומנתח הרצות שנכשלו;
- האם יש גישות לחשבונות בדיקה, לארגזי חול לתשלומים ול-API שהבדיקה פונה אליהם ישירות.
לפי התשובות האלה מגבשים תוכנית עבודה: מפת תרחישים, מבנה הפריימוורק, סט לוקטורים יציבים, דיווח על הרצות ותקנון תמיכה. ההערכה נעשית לפי מספר התרחישים ומורכבותם, ולא "עבור הפרויקט כולו" — כך אתם רואים על מה אתם משלמים ומה ניתן להוסיף later. לוחות הזמנים מחולקים לשלבים: סט בדיקות עבודה ראשון על המסלולים הקריטיים, ואחר כך הרחבת הכיסוי.
תארו את המשימה בצורה חופשית — מה המוצר, אילו תרחישים כואב לבדוק ידנית, איזה סטאק וסביבות. נחזור עם הערכה, תוכנית עבודה ולוחות זמנים לפי שלבים.







