Создавать отчеты об испытаниях

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

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

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

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

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

Cloud Firestore

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

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

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

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

Cloud Firestore

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

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

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

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

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

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

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

Чтобы отладить ошибки в правилах, показанных выше, используйте следующий пример теста 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

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

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

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

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