Prüfberichte erstellen

Cloud Firestore und Realtime Database stützen sich beide auf leistungsstarke, prägnante Regelsprachen, die speziell für die Regelung der Informationssicherheit und Zugriffskontrolle entwickelt wurden. Da die Regeln jedoch länger und komplexer werden, benötigen Sie möglicherweise Hilfe beim Debuggen von Fehlern in ihrem Verhalten.

Die Firebase-Emulatoren bieten die Möglichkeit, Regelabdeckungsberichte zu erstellen, sodass Sie genau sehen können, was jeder Unterausdruck ausgewertet hat, wenn Sie einen Fehler reproduzieren. Die Berichte liefern auch Informationen darüber, wie oft jeder Testfall eine Regel verwendet hat, wie herkömmliche „Line Coverage“-Techniken.

Erstellen Sie einen Bericht

Nachdem Sie eine Reihe von Tests ausgeführt haben, können Sie auf Testabdeckungsberichte zugreifen, die zeigen, wie jede Ihrer Sicherheitsregeln bewertet wurde.

Um die Berichte abzurufen, fragen Sie einen exponierten Endpunkt auf dem Emulator ab, während er ausgeführt wird. Verwenden Sie für eine browserfreundliche Version die folgende URL:

Cloud-Firestore

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

Echtzeit-Datenbank

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

Dadurch werden Ihre Regeln in Ausdrücke und Unterausdrücke unterteilt, über die Sie mit der Maus fahren können, um weitere Informationen anzuzeigen, einschließlich der Anzahl der zurückgegebenen Auswertungen und Werte. Für die rohe JSON-Version dieser Daten fügen Sie die folgende URL in Ihre Abfrage ein:

Cloud-Firestore

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

Echtzeit-Datenbank

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

Beispielregeln debuggen

Verwenden Sie zum einfachen Generieren eines Testberichts die auf GitHub verfügbaren Emulator-Schnellstarts für Cloud Firestore und Realtime Database . Diese Schnellstartanleitungen führen Sie durch die ordnungsgemäße Installation und Initialisierung der Emulatoren und die anschließende Generierung von Beispieltests aus einem Beispielsatz von Regeln.

Betrachten Sie eine Beispiel-App mit Cloud Firestore, die zählt, wie oft Benutzer auf eine Schaltfläche klicken. Die App verwendet die folgenden Regeln:

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

Um die Fehler in den oben gezeigten Regeln zu debuggen, verwenden Sie den folgenden Beispiel-JavaScript-Test:

const counter0 = db.collection("counters").doc("0");
await firebase.assertSucceeds(counter0.set({value: 0}));

Der Emulator generiert einen Bericht, der unter der oben angegebenen URL verfügbar ist:

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

Der Bericht zeigt die folgenden undefinierten und Nullwertfehler:

Das Problem bei diesem speziellen Beispiel besteht darin, dass die Regeln nicht zwischen dem Erstellen des Dokuments und dem Aktualisieren des Dokuments unterscheiden. Folglich ist das Schreiben nicht zulässig, wenn das Dokument nicht vorhanden ist, und das Dokument kann nicht erstellt werden, da es nicht vorhanden ist. Das Unterscheiden des „Schreibens“ in zwei spezifischere Operationen – „Erstellen“ und „Aktualisieren“ – löst das Problem.

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

Der generierte Bericht zeigt, wie häufig jede Regel verwendet wurde und was zurückgegeben wurde.