Prüfberichte erstellen

Cloud Firestore und Realtime Database basieren beide auf leistungsstarken, präzisen Regelsprachen, die speziell für die Informationssicherheit und Zugriffskontrolle entwickelt wurden. Da 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, wie die einzelnen Unterausdrücke ausgewertet wurden, wenn Sie einen Fehler reproduzieren. Die Berichte liefern auch Informationen darüber, wie häufig in jedem Testfall eine Regel verwendet wurde, ähnlich wie bei herkömmlichen „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 zu erhalten, fragen Sie einen verfügbar gemachten Endpunkt auf dem Emulator ab, während dieser ausgeführt wird. Für eine browserfreundliche Version verwenden Sie die folgende URL:

Cloud Firestore

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

Echtzeitdatenbank

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 zu erhalten, einschließlich der Anzahl der Auswertungen und zurückgegebenen Werte. Für die JSON-Rohversion dieser Daten fügen Sie die folgende URL in Ihre Abfrage ein:

Cloud Firestore

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

Echtzeitdatenbank

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

Beispielregeln zum Debuggen

Um ganz einfach einen Testbericht zu erstellen, verwenden Sie die Emulator-Schnellstarts, die auf GitHub für Cloud Firestore und Realtime Database verfügbar sind. Diese Schnellstartanleitungen führen Sie durch die ordnungsgemäße Installation und Initialisierung der Emulatoren und anschließend durch die Generierung von Beispieltests anhand eines Beispielregelsatzes.

Stellen Sie sich eine Beispiel-App vor, die Cloud Firestore verwendet und 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 genannten URL verfügbar ist:

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

Der Bericht zeigt die folgenden undefinierten Fehler und Nullwertfehler:

Das Problem bei diesem speziellen Beispiel besteht darin, dass die Regeln nicht zwischen der Erstellung des Dokuments und der Aktualisierung des Dokuments unterscheiden. Folglich ist der Schreibvorgang nicht zulässig, wenn das Dokument nicht vorhanden ist, und das Dokument kann nicht erstellt werden, da es nicht vorhanden ist. Durch die Unterteilung des „Schreibvorgangs“ in zwei spezifischere Vorgänge – „Erstellen“ und „Aktualisieren“ – wird das Problem gelöst.

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 oft jede Regel verwendet wurde und was zurückgegeben wurde.