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

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

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

יצירת דוח

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

כדי לקבל את הדוחות, שולחים שאילתות על נקודת קצה (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;
     }
   }
 }
 

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