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

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

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

สร้างรายงาน

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

หากต้องการรับรายงาน ให้ค้นหาปลายทางที่เปิดเผยบนโปรแกรมจำลองขณะที่เครื่องกำลังทำงานอยู่ สำหรับเวอร์ชันที่เหมาะกับเบราว์เซอร์ ให้ใช้ URL ต่อไปนี้:

คลาวด์ไฟร์สโตร์

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

ฐานข้อมูลเรียลไทม์

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

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

คลาวด์ไฟร์สโตร์

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 ซึ่งนับจำนวนครั้งที่ผู้ใช้คลิกปุ่ม แอปใช้กฎต่อไปนี้:

คลาวด์ไฟร์สโตร์

 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 ต่อไปนี้:

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

คลาวด์ไฟร์สโตร์

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

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