הפקת דוחות בדיקה

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

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

יצירת דוח

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

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

Cloud Firestore

http://localhost:8080/emulator/v1/projects/<database_name>:ruleCoverage.html
 

Realtime Database

http://localhost:9000/.inspect/coverage?ns=<database_name>
 

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

Cloud Firestore

http://localhost:8080/emulator/v1/projects/<database_name>:ruleCoverage
 

Realtime Database

http://localhost:9000/.inspect/coverage.json?ns=<database_name>
 

ניפוי באגים בכללים לדוגמה

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

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

Cloud Firestore

 service cloud.firestore {
   match /databases/{database}/documents {
     match /counters/{counter} {
       allow read;
       allow write: if request.resource.data.value == resource.data.value +1;
     }
   }
 }
 

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

const counter0 = db.collection("counters").doc("0");
await firebase.assertSucceeds(counter0.set({value: 0}));

האמולטור יוצר דוח שזמין בכתובת ה-URL שצוינה למעלה:

http://localhost:8080/emulator/v1/projects/<database_name>:ruleCoverage.html

בדוח מוצגות השגיאות הבאות של ערכים לא מוגדרים וערכי null:

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

Cloud Firestore

 service cloud.firestore {
   match /databases/{database}/documents {
     match /counters/{counter} {
       allow read;
       allow create: if request.resource.data.value == 0;
       allow update: if request.resource.data.value == resource.data.value +1;
     }
   }
 }
 

בדוח שנוצר אפשר לראות באיזו תדירות נעשה שימוש בכל כלל ומה הוחזר.