生成測試報告

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上的雲計算公司的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

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

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

雲防火牆

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

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