Join us for Firebase Summit on November 10, 2021. Tune in to learn how Firebase can help you accelerate app development, release with confidence, and scale with ease. Register

테스트 보고서 생성

Cloud Firestore와 실시간 데이터베이스는 모두 정보 보안 및 액세스 제어를 관리하기 위해 특별히 만든 강력하고 간결한 규칙 언어를 사용합니다. 하지만 규칙이 길어지고 복잡해지면 규칙 동작의 오류를 디버깅하는 데 도움을 받아야 할 수 있습니다.

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>
 

규칙 예시 디버깅

테스트 보고서를 쉽게 생성하려면 Cloud Firestore실시간 데이터베이스용 GitHub에서 제공하는 에뮬레이터 빠른 시작을 사용하세요. 이 빠른 시작 가이드에서는 에뮬레이터를 올바르게 설치하고 초기화한 후 규칙 모음 예시에서 샘플 테스트를 생성하는 과정을 설명합니다.

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

위에 표시된 규칙의 오류를 디버깅하려면 다음의 샘플 자바스크립트 테스트를 사용하세요.

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

이 보고서에는 다음과 같이 정의되지 않은 null 값 오류가 표시됩니다.

위의 예시에는 규칙이 문서 생성과 문서 업데이트를 구분하지 않는다는 문제가 있습니다. 결과적으로 문서가 존재하지 않으면 쓰기가 허용되지 않고 문서가 존재하지 않기 때문에 문서를 생성할 수 없는 것입니다. '쓰기'를 두 가지의 더 구체적인 작업('생성' 및 '업데이트')으로 구분하면 이 문제는 해결됩니다.

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

생성된 보고서에 각 규칙이 사용된 빈도 수와 반환된 내용이 표시됩니다.