生成測試報告

Cloud Firestore 和即時資料庫都依賴專門為管理資訊安全和存取控製而創建的強大、簡潔的規則語言。但是,隨著規則變得更長、更複雜,您可能需要一些幫助來調試其行為中的錯誤。

Firebase 模擬器能夠產生規則覆蓋率報告,因此您可以在重現錯誤時準確查看每個子表達式的計算結果。這些報告還提供有關每個測試案例使用規則的頻率的信息,例如傳統的「線路覆蓋」技術。

產生報告

執行一套測試後,您可以存取測試覆蓋率報告,其中顯示每個安全規則的評估。

若要取得報告,請在模擬器執行時查詢模擬器上公開的端點。對於瀏覽器友善的版本,請使用以下 URL:

雲端Firestore

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

即時資料庫

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

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

雲端Firestore

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

即時資料庫

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

調試範例規則

若要輕鬆產生測試報告,請使用 GitHub 上提供的Cloud Firestore即時資料庫模擬器快速入門。這些快速入門將引導您正確安裝和初始化模擬器,然後從一組範例規則產生範例測試。

考慮一個使用 Cloud Firestore 的範例應用,該應用程式會計算使用者點擊按鈕的次數。該應用程式採用以下規則:

雲端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

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

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

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

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