Join us in person and online for Firebase Summit on October 18, 2022. Learn how Firebase can help you accelerate app development, release your app with confidence, and scale with ease. Register now

生成測試報告

透過集合功能整理內容 你可以依據偏好儲存及分類內容。

Cloud Firestore 和實時數據庫都依賴於專門為管理信息安全和訪問控製而創建的強大、簡潔的規則語言。但是,隨著規則變得越來越長和越來越複雜,您可能需要一些幫助來調試其行為中的錯誤。

Firebase 模擬器包括生成規則覆蓋率報告的能力,因此您可以準確地看到重現錯誤時每個子表達式的評估結果。報告還提供有關每個測試用例使用規則的頻率的信息,例如傳統的“線路覆蓋”技術。

生成報告

運行一套測試後,您可以訪問測試覆蓋率報告,顯示您的每個安全規則是如何評估的。

要獲取報告,請在模擬器運行時查詢其暴露的端點。對於瀏覽器友好的版本,請使用以下 URL:

雲防火牆

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

實時數據庫

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

這會將您的規則分解為表達式和子表達式,您可以將鼠標懸停以獲取更多信息,包括評估的數量和返回的值。對於此數據的原始 JSON 版本,請在查詢中包含以下 URL:

雲防火牆

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

實時數據庫

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

調試示例規則

要輕鬆生成測試報告,請使用 GitHub 上針對Cloud FirestoreRealtime Database提供的模擬器快速入門。這些快速入門指導您正確安裝和初始化模擬器,然後從一組示例規則生成示例測試。

考慮一個使用 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

該報告顯示以下未定義和空值錯誤:

這個特定示例的問題在於規則沒有區分創建文檔和更新文檔。因此,如果文檔不存在,則不允許寫入,並且無法創建文檔,因為它不存在。將“寫入”區分為兩個更具體的操作——“創建”和“更新”——解決了這個問題。

雲防火牆

 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;
     }
   }
 }
 

生成的報告顯示每條規則的使用頻率以及返回的內容。