אסטרטגיות בדיקה

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

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

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

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

פירמידת הבדיקות

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

*מהימנות מתייחסת לדמיון בין סביבת זמן הריצה של הבדיקה לבין סביבת הייצור.

התפלגות מספר הבדיקות לפי היקף מוצגת בדרך כלל בצורה של פירמידה.
איור 1. התפלגות מספר הבדיקות לפי היקף מוצגת בדרך כלל בצורת פירמידה.

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

מזעור העלות של באג

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

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

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

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

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

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

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

אסטרטגיית בדיקות שניתנת להרחבה

פירמידת הבדיקות מחולקת באופן מסורתי ל-3 קטגוריות:

  • בדיקות יחידה
  • בדיקות שילוב
  • בדיקות מקצה לקצה.

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

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

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

היקף

גישה לרשת

ביצוע

סוג build

מחזור חיים

היחידה

מתודה או מחלקה יחידה עם תלות מינימלית.

לא

מקומי

ניתן לבצע ניפוי באגים

לפני המיזוג

רכיב

ברמת המודול או הרכיב

כמה כיתות ביחד

לא

Local
Robolectric
Emulator

ניתן לבצע ניפוי באגים

לפני המיזוג

Feature

רמת התכונה

שילוב עם רכיבים שבבעלות צוותים אחרים

Mocked

מקומי
‫Robolectric
אמולטור
מכשירים

ניתן לבצע ניפוי באגים

לפני המיזוג

אפליקציה

רמת האפליקציה

שילוב עם תכונות או שירותים שבבעלות צוותים אחרים

מוק
שרת פיתוח
שרת ייצור

מכשירי
Emulator

ניתן לבצע ניפוי באגים

לפני המיזוג
אחרי המיזוג

גרסה מועמדת להפצה

רמת האפליקציה

שילוב עם תכונות או שירותים שבבעלות צוותים אחרים

שרת prod

מכשירי
Emulator

גרסת build מצומצמת של האפליקציה

אחרי המיזוג
לפני ההשקה

החלטה על קטגוריית הבדיקה

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

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

נושא בבדיקה

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

קטגוריית בדיקה

דוגמה לסוג הבדיקה

הלוגיקה של אימות הטופס

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

בדיקות יחידה

בדיקת יחידה מקומית של JVM

אופן הפעולה של ממשק המשתמש של טופס הכניסה

טופס עם לחצן שמופעל רק אחרי שהטופס עובר אימות

בדיקות רכיבים

בדיקת התנהגות ממשק המשתמש שפועלת ב-Robolectric

ממשק המשתמש של טופס הכניסה

טופס בהתאם למפרט חוויית משתמש

בדיקות רכיבים

Compose Preview Screenshot test

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

ממשק המשתמש ששולח אישורים למנהל ההרשאות ומקבל תשובות שיכולות להכיל שגיאות שונות.

בדיקות של תכונות

בדיקת JVM עם fakes

תיבת דו-שיח להתחברות

מסך שבו מוצג טופס הכניסה כשלוחצים על לחצן הכניסה.

בדיקות אפליקציות

בדיקת התנהגות ממשק המשתמש שפועלת ב-Robolectric

חוויית שימוש הכרחית (CUJ): כניסה לחשבון

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

גרסה מועמדת להפצה

בדיקת התנהגות של Compose UI מקצה לקצה שפועלת במכשיר

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

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

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

תשתית לבדיקות

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

אפשר לסווג את הבדיקות לפי היקף כדי להגדיר מתי ואיפה להריץ כל בדיקה. לדוגמה, בהתאם למודל של 5 שכבות:

קטגוריה

סביבה (איפה)

טריגר (מתי)

היחידה

[Local][4]

כל שמירה (commit)

רכיב

מקומי

כל שמירה (commit)

Feature

מקומיים ואמולטורים

לפני המיזוג, לפני מיזוג או שליחת שינוי

אפליקציה

מקומי, אמולטורים, טלפון אחד, מכשיר מתקפל אחד

אחרי המיזוג, אחרי מיזוג או שליחת שינוי

גרסה מועמדת להפצה

8 טלפונים שונים, טלפון אחד מתקפל וטאבלט אחד

גרסת טרום-השקה

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

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