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

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

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

สร้างรายงาน

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

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

Cloud Firestore

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

Realtime Database

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

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

Cloud Firestore

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

Realtime Database

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

ตัวอย่างการแก้ไขข้อผิดพลาดของกฎ

หากต้องการสร้างรายงานการทดสอบอย่างง่ายดาย ให้ใช้การเริ่มต้นอย่างรวดเร็วของ Emulator ที่มีให้บริการใน GitHub สำหรับ Cloud Firestore และ Realtime Database การเริ่มต้นอย่างรวดเร็วเหล่านี้จะแนะนำคุณตลอดขั้นตอนการติดตั้งและเริ่มต้น Emulator อย่างถูกต้อง จากนั้นสร้างการทดสอบตัวอย่างจากชุดกฎตัวอย่าง

ลองดูแอปตัวอย่างที่ใช้ 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}));

Emulator จะสร้างรายงานที่ URL ที่ระบุไว้ด้านบน

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

รายงานจะแสดงข้อผิดพลาดของค่าที่ไม่ได้กำหนดและค่า Null ต่อไปนี้

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

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

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