Testberichte erstellen

Cloud Firestore und Realtime Database basieren beide auf leistungsstarken, prägnanten Regelsprachen, die speziell für die Informationssicherheit und Zugriffssteuerung entwickelt wurden. Wenn Regeln jedoch länger und komplexer werden, benötigen Sie möglicherweise Hilfe bei der Fehlerbehebung.

Die Firebase-Emulatoren bieten die Möglichkeit, Berichte zur Regelabdeckung zu erstellen. So können Sie genau sehen, wie jeder Teilausdruck ausgewertet wurde, wenn Sie einen Fehler reproduzieren. Die Berichte enthalten auch Informationen dazu, wie oft für jeden Testlauf eine Regel verwendet wurde, ähnlich wie bei herkömmlichen Techniken zur „Zeilenabdeckung“.

Bericht generieren

Nachdem Sie eine Reihe von Tests ausgeführt haben, können Sie auf Berichte zur Testabdeckung zugreifen, die Aufschluss darüber geben, wie die einzelnen Sicherheitsregeln bewertet wurden.

Um die Berichte abzurufen, fragen Sie einen bereitgestellten Endpunkt im 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
 

Realtime Database

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

Dadurch werden Ihre Regeln in Ausdrücke und Teilausdrücke aufgeteilt. Bewegen Sie die Maus auf einen Ausdruck oder Teilausdruck, um weitere Informationen zu erhalten, einschließlich der Anzahl der Bewertungen und der zurückgegebenen Werte. Fügen Sie für die JSON-Rohversion dieser Daten die folgende URL in Ihre Abfrage ein:

Cloud Firestore

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

Realtime Database

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

Beispiel für das Debugging von Regeln

Verwenden Sie die Emulator-Kurzanleitungen auf GitHub für Cloud Firestore und Realtime Database, um ganz einfach einen Testbericht zu erstellen. In diesen Kurzanleitungen wird beschrieben, wie Sie die Emulatoren richtig installieren und initialisieren und dann anhand eines Beispielsatzes von Regeln Beispieltests generieren.

Nehmen wir an, eine Beispiel-App verwendet Cloud Firestore, um zu zählen, wie oft Nutzer 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;
     }
   }
 }
 

Verwenden Sie den folgenden JavaScript-Test, um die Fehler in den oben gezeigten Regeln zu beheben:

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 enthält die folgenden Fehler für undefinierte und Nullwerte:

Das Problem bei diesem Beispiel besteht darin, dass die Regeln nicht zwischen dem Erstellen und dem Aktualisieren des Dokuments unterscheiden. Daher 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 Problem lässt sich beheben, indem der „Schreibvorgang“ in zwei spezifischere Vorgänge unterteilt wird: „Erstellen“ und „Aktualisieren“.

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

Im generierten Bericht sehen Sie, wie oft die einzelnen Regeln verwendet wurden und was zurückgegeben wurde.