產生測試報告

Cloud FirestoreRealtime Database 都仰賴功能強大、精簡的規則語言,以管理資訊安全和存取權控管。但是,隨著規則日趨複雜與複雜,您可能會需要一些協助,對其行為錯誤進行偵錯。

Firebase Emulator 可產生規則涵蓋率報表,讓您在重現錯誤時,確切查看每個子運算式評估的結果。報表也會提供資訊,說明每個測試案例使用規則的頻率 (例如傳統「涵蓋率」技巧)。

產生報表

執行一系列測試後,您可以查看測試涵蓋率報表,瞭解每項安全性規則的評估方式。

如要取得報表,請在模擬器執行期間查詢公開的端點。如果是適用於瀏覽器的版本,請使用下列網址:

Cloud Firestore

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

Realtime Database

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

這會將規則分解為運算式和子運算式,您可以將滑鼠游標懸停在運算式上,取得更多資訊,包括評估次數和傳回的值。如要取得這項資料的原始 JSON 版本,請在查詢中加入下列網址:

Cloud Firestore

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

Realtime Database

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

對規則範例執行偵錯

如要輕鬆產生測試報告,請使用 GitHub 提供的模擬器快速入門指南,適用於 Cloud FirestoreRealtime 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}));

模擬器會產生報表,可透過上方所述的網址存取:

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

報表會顯示下列未定義和空值錯誤:

此具體範例的問題是,規則無法區分建立文件與更新文件的情況。因此,如果文件不存在,系統就不會允許寫入作業,而文件不存在,因此也無法建立。將「寫入」區分為兩個更明確的作業:「建立」和「更新」,即可解決問題。

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

產生的報表會顯示各項規則的使用頻率和傳回內容。