Genera rapporti di prova

Cloud Firestore e Realtime Database si basano entrambi su linguaggi di regole potenti e concisi creati appositamente per governare la sicurezza delle informazioni e il controllo degli accessi. Tuttavia, poiché le regole diventano più lunghe e complesse, potresti aver bisogno di aiuto per eseguire il debug degli errori nel loro comportamento.

Gli emulatori Firebase includono la possibilità di generare rapporti sulla copertura delle regole, in modo da poter vedere esattamente a cosa è stata valutata ogni sottoespressione quando si riproduce un errore. I rapporti forniscono anche informazioni sulla frequenza con cui ogni test case ha utilizzato una regola, come le tradizionali tecniche di "copertura della linea".

Genera un rapporto

Dopo aver eseguito una suite di test, puoi accedere ai rapporti sulla copertura dei test che mostrano come è stata valutata ciascuna delle tue regole di sicurezza.

Per ottenere i report, esegui una query su un endpoint esposto sull'emulatore mentre è in esecuzione. Per una versione compatibile con browser, utilizzare il seguente URL:

Cloud Firestore

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

Database in tempo reale

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

Questo suddivide le tue regole in espressioni e sottoespressioni che puoi passare con il mouse per ulteriori informazioni, incluso il numero di valutazioni e valori restituiti. Per la versione JSON grezza di questi dati, includi il seguente URL nella tua query:

Cloud Firestore

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

Database in tempo reale

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

Regole di esempio di debug

Per generare facilmente un rapporto di prova, utilizza le guide di avvio rapido dell'emulatore disponibili su GitHub per Cloud Firestore e Realtime Database . Queste guide introduttiva guidano l'utente attraverso l'installazione e l'inizializzazione corretta degli emulatori, quindi la generazione di test di esempio da un insieme di regole di esempio.

Considera un'app di esempio che utilizza Cloud Firestore che conta quante volte gli utenti fanno clic su un pulsante. L'app utilizza le seguenti regole:

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

Per eseguire il debug degli errori nelle regole mostrate sopra, utilizzare il seguente test JavaScript di esempio:

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

L'emulatore genera un rapporto disponibile all'URL indicato sopra:

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

Il report mostra i seguenti errori non definiti e con valore nullo:

Il problema con questo esempio specifico è che le regole non fanno differenza tra la creazione del documento e l'aggiornamento del documento. Di conseguenza, la scrittura non è consentita se il documento non esiste e il documento non può essere creato perché non esiste. Differenziare la "scrittura" in due operazioni più specifiche - "crea" e "aggiorna" - risolve il problema.

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

Il rapporto generato mostra la frequenza con cui ciascuna regola è stata utilizzata e ciò che è stato restituito.