Catch up on highlights from Firebase at Google I/O 2023. Learn more

Создание тестовых отчетов

Cloud Firestore и Realtime Database опираются на мощные, краткие языки правил, специально созданные для управления информационной безопасностью и контролем доступа. Однако по мере того, как правила становятся длиннее и сложнее, вам может понадобиться помощь в устранении ошибок в их поведении.

Эмуляторы Firebase включают возможность генерировать отчеты о покрытии правил, поэтому вы можете точно увидеть, что оценивается каждым подвыражением при воспроизведении ошибки. Отчеты также предоставляют информацию о том, как часто в каждом тестовом случае использовалось правило, например традиционные методы «покрытия строк».

Создать отчет

После запуска набора тестов вы можете получить доступ к отчетам о покрытии тестами, которые показывают, как оценивалось каждое из ваших правил безопасности.

Чтобы получить отчеты, запросите открытую конечную точку в эмуляторе во время его работы. Для удобной для браузера версии используйте следующий URL-адрес:

Облако Firestore

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

База данных реального времени

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

Это разбивает ваши правила на выражения и подвыражения, на которые вы можете навести указатель мыши для получения дополнительной информации, включая количество вычислений и возвращаемых значений. Чтобы получить необработанную версию этих данных в формате JSON, включите в запрос следующий URL-адрес:

Облако Firestore

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

База данных реального времени

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

Пример правил отладки

Чтобы легко создать отчет о тестировании, воспользуйтесь кратким руководством по эмулятору, доступным на GitHub для Cloud Firestore и Realtime Database . Эти краткие руководства помогут вам правильно установить и инициализировать эмуляторы, а затем создать образцы тестов на основе примерного набора правил.

Рассмотрим пример приложения, использующего Cloud Firestore, которое подсчитывает, сколько раз пользователи нажимают кнопку. Приложение использует следующие правила:

Облако Firestore

 service cloud.firestore {
   match /databases/{database}/documents {
     match /counters/{counter} {
       allow read;
       allow write: if request.resource.data.value == resource.data.value +1;
     }
   }
 }
 

Чтобы отладить ошибки в приведенных выше правилах, используйте следующий пример теста JavaScript:

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

Эмулятор создает отчет, доступный по указанному выше URL-адресу:

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

В отчете показаны следующие неопределенные ошибки и ошибки с нулевым значением:

Проблема с этим конкретным примером заключается в том, что правила не различают создание документа и обновление документа. Следовательно, запись не разрешена, если документ не существует, и документ не может быть создан, поскольку он не существует. Разделение «записи» на две более конкретные операции — «создание» и «обновление» — решает проблему.

Облако 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;
     }
   }
 }
 

Сгенерированный отчет показывает, как часто использовалось каждое правило и что было возвращено.