Catch up on everthing we announced at this year's Firebase Summit. Learn more

테스트 보고서 생성

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

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