Generowanie raportów z testów

Zarówno Cloud Firestore, jak i Realtime Database korzystają z zaawansowanych, zwięzłych języków reguł, które zostały stworzone specjalnie do zarządzania bezpieczeństwem informacji i kontrolą dostępu. Jednak z upływem czasu reguły stają się coraz dłuższe i bardziej złożone, więc może być Ci potrzebna pomoc w rozwiązywaniu błędów związanych z ich działaniem.

Emulatorów Firebase można używać do generowania raportów pokrycia reguł, dzięki czemu po odtworzeniu błędu możesz sprawdzić, jak dokładnie została oceniona każda podwyrażenie. Zawierają też informacje o tym, jak często w każdym przypadku testu używano reguły, np. tradycyjnych technik „zasięgu linii”.

Generowanie raportu

Po uruchomieniu zestawu testów możesz uzyskać dostęp do raportów o zakresie testów, które pokazują, jak oceniono każdą z reguł bezpieczeństwa.

Aby uzyskać raporty, prześlij zapytanie do odsłoniętego punktu końcowego w emulatorze, gdy jest on uruchomiony. Aby wyświetlić wersję przyjazną przeglądarce, użyj tego adresu URL:

Cloud Firestore

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

Realtime Database

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

Dzięki temu reguły są dzielone na wyrażenia i podwyrażenia, nad którymi możesz najechać kursorem, aby uzyskać więcej informacji, w tym liczbę zwracanych ocen i wartości. Aby uzyskać wersję tych danych w postaci surowego pliku JSON, dodaj do zapytania ten adres URL:

Cloud Firestore

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

Realtime Database

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

Debugowanie przykładowych reguł

Aby łatwo wygenerować raport testowy, użyj quickstartów emulatora dostępnych na GitHubie dla Cloud FirestoreRealtime Database. Te krótkie przewodniki zawierają instrukcje prawidłowego instalowania i inicjowania emulatorów, a następnie generowania przykładowych testów na podstawie przykładowego zbioru reguł.

Rozważ przykładową aplikację korzystającą z elementu Cloud Firestore, który zlicza, ile razy użytkownicy kliknęli przycisk. Aplikacja stosuje te reguły:

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

Aby debugować błędy w regułach pokazanych powyżej, użyj tego przykładowego testu JavaScript:

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

Emulator generuje raport dostępny pod podanym wyżej adresem URL:

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

Raport zawiera te błędy z niezdefiniowanymi wartościami i wartościami NULL:

W tym konkretnym przykładzie problem polega na tym, że reguły nie rozróżniają tworzenia dokumentu od jego aktualizowania. W związku z tym operacja zapisu nie jest dozwolona, jeśli dokument nie istnieje, a dokumentu nie można utworzyć, ponieważ nie istnieje. Rozróżnienie operacji „write” na 2 bardziej szczegółowe operacje – „create” i „update” – rozwiązuje ten 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;
     }
   }
 }
 

Wygenerowany raport pokazuje, jak często używano poszczególnych reguł i co zwracały.