Genera report sui test

Cloud Firestore e Realtime Database si basano entrambi su linguaggi di regole efficaci e concisi creati appositamente per governare la sicurezza delle informazioni e il controllo dell'accesso. 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 report sulla copertura delle regole, in modo da poter vedere esattamente il valore a cui è stata valutata ogni sottoespressione quando riproduci un errore. I report forniscono inoltre informazioni sulla frequenza con cui ogni scenario di test ha utilizzato una regola, come le tecniche tradizionali di "copertura delle linee".

Genera un report

Dopo aver eseguito una suite di test, puoi accedere ai report sulla copertura dei test che mostrano in che modo è 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 ottimizzata per il browser, utilizza il seguente URL:

Cloud Firestore

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

Realtime Database

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

In questo modo le regole vengono suddivise in espressioni e sottoespressioni su cui puoi passare il mouse per visualizzare ulteriori informazioni, tra cui il numero di valutazioni e valori restituiti. Per la versione JSON non elaborata di questi dati, includi il seguente URL nella query:

Cloud Firestore

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

Realtime Database

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

Regole di esempio per il debug

Per generare facilmente un report di test, utilizza le istruzioni iniziali per l'emulatore disponibili su GitHub per Cloud Firestore e Realtime Database. Queste guide rapide ti illustrano come installare e inizializzare correttamente gli emulatori, quindi generare test di esempio da un insieme di regole di esempio.

Prendi in considerazione un'app di esempio che utilizza Cloud Firestore per conteggiare il numero di volte in cui 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 indicate sopra, utilizza il seguente test JavaScript di esempio:

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

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

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

Il report mostra i seguenti errori relativi a valori non definiti e null:

Il problema di questo esempio specifico è che le regole non fanno distinzione tra la creazione e l'aggiornamento del documento. Di conseguenza, l'operazione di scrittura non è consentita se il documento non esiste e il documento non può essere creato perché non esiste. Il problema viene risolto differenziando l'operazione "write" in due operazioni più specifiche: "create" e "update".

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 report generato mostra la frequenza con cui è stata utilizzata ogni regola e cosa è stato fornito.