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

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

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

สร้างรายงาน

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

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

การแก้ไขข้อบกพร่องกฎตัวอย่าง

หากต้องการสร้างรายงานการทดสอบได้ง่ายๆ ให้ใช้การเริ่มต้นใช้งานโปรแกรมจำลองที่มีอยู่ใน GitHub สำหรับ Cloud Firestore และ Realtime Database การเริ่มต้นใช้งานเหล่านี้จะแนะนำวิธีติดตั้งและเริ่มต้นโปรแกรมจำลองอย่างถูกต้อง จากนั้นสร้างการทดสอบตัวอย่างจากชุดกฎตัวอย่าง

ลองพิจารณาแอปตัวอย่างที่ใช้ 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" ดังต่อไปนี้

ปัญหาของตัวอย่างที่เฉพาะเจาะจงนี้ก็คือ กฎไม่ได้แยกความแตกต่างระหว่างการสร้างเอกสารกับการอัปเดตเอกสาร ดังนั้น ระบบจะไม่อนุญาตให้ดำเนินการเขียนหากไม่มีเอกสารอยู่ และระบบจะสร้างเอกสารไม่ได้เนื่องจากไม่มีเอกสารอยู่ การแยก "เขียน" ออกเป็น 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;
     }
   }
 }
 

รายงานที่สร้างขึ้นจะแสดงความถี่ในการใช้กฎแต่ละข้อและผลลัพธ์ที่ได้