สร้างรายงานการทดสอบ

Cloud Firestore และ Realtime Database ต่างก็ใช้ภาษากฎที่มีประสิทธิภาพและรัดกุมซึ่งสร้างขึ้นโดยเฉพาะเพื่อควบคุมความปลอดภัยของข้อมูลและการควบคุมการเข้าถึง อย่างไรก็ตาม เนื่องจากกฎมีความยาวและซับซ้อนมากขึ้น คุณอาจต้องการความช่วยเหลือในการแก้ไขข้อผิดพลาดในการทำงาน

Firebase Emulators รวมความสามารถในการสร้างรายงานความครอบคลุมของกฎ ดังนั้นคุณจึงสามารถเห็นได้อย่างชัดเจนว่าแต่ละนิพจน์ย่อยได้รับการประเมินเมื่อคุณสร้างข้อผิดพลาดซ้ำ รายงานยังให้ข้อมูลว่าแต่ละกรณีทดสอบใช้กฎบ่อยเพียงใด เช่น เทคนิค "การครอบคลุมบรรทัด" แบบดั้งเดิม

สร้างรายงาน

หลังจากเรียกใช้ชุดการทดสอบ คุณสามารถเข้าถึงรายงานความครอบคลุมการทดสอบที่แสดงการประเมินกฎความปลอดภัยแต่ละข้อของคุณ

หากต้องการรับรายงาน ให้สอบถามจุดสิ้นสุดที่เปิดเผยบนโปรแกรมจำลองในขณะที่กำลังทำงาน สำหรับเวอร์ชันที่เหมาะกับเบราว์เซอร์ ให้ใช้ 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>
 

กฎตัวอย่างการดีบัก

หากต้องการสร้างรายงานทดสอบอย่างง่ายดาย ให้ใช้โปรแกรมจำลองการเริ่มต้นอย่างรวดเร็วบน GitHub สำหรับ Cloud 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

รายงานแสดงข้อผิดพลาดที่ไม่ได้กำหนดและค่า 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;
     }
   }
 }
 

รายงานที่สร้างขึ้นจะแสดงความถี่ในการใช้กฎแต่ละข้อและสิ่งที่ส่งคืน