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

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

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

יצירת דוח

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

כדי לקבל את הדוחות, שולחים שאילתה לנקודת קצה חשופה במהלך ההפעלה של הסימולטור. כדי לקבל גרסה שמתאימה לדפדפנים, צריך להשתמש בכתובת ה-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;
     }
   }
 }
 

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