ขณะนี้เรากำลังเขียนกรณีทดสอบหน่วยในโครงการของเรา การใช้งานสำหรับวิธีการฐานข้อมูลที่มีอยู่และทำงานได้ดี ในกรณีนี้ทำไมเราต้องเขียนวัตถุจำลอง มีเหตุผลพิเศษหรือไม่? เหตุใดฉันจึงไม่สามารถทดสอบ DAO ได้ดำเนินการโดยตรง
ขณะนี้เรากำลังเขียนกรณีทดสอบหน่วยในโครงการของเรา การใช้งานสำหรับวิธีการฐานข้อมูลที่มีอยู่และทำงานได้ดี ในกรณีนี้ทำไมเราต้องเขียนวัตถุจำลอง มีเหตุผลพิเศษหรือไม่? เหตุใดฉันจึงไม่สามารถทดสอบ DAO ได้ดำเนินการโดยตรง
คำตอบ:
คุณไม่ควรเยาะเย้ยการโทรไปยังฐานข้อมูลเพราะนั่นจะทำให้การดำเนินการไม่สำเร็จ สิ่งที่คุณควรจะล้อเลียนยกตัวอย่างเช่นการโทรไปยัง DAO ของคุณจากนั้นคือเลเยอร์บริการ การเยาะเย้ยช่วยให้คุณสามารถทดสอบวิธีการแยก
สมมติว่าคุณมีร้านอาหารจำลองพร้อมสถาปัตยกรรมเช่นนี้:
Cook <=> Server <=> Customer
คุณต้องการทดสอบแต่ละเลเยอร์อย่างอิสระ นี่Server
คือชั้นบริการของคุณและCook
สามารถคิดได้ว่าเป็น DAO Server
คือสิ่งที่คุณต้องการที่จะเยาะเย้ยในขณะที่การทดสอบCustomer
และเป็นสิ่งที่คุณต้องการที่จะเยาะเย้ยในขณะที่การทดสอบCook
Server
อย่างไรก็ตามCook
การทดสอบหน่วยควรตรวจสอบว่าการใช้งานกำลังส่งคืนแฮมเบอร์เกอร์เมื่อมีคำสั่งแฮมเบอร์เกอร์และไม่ใช่ยางยาง
การทดสอบ businesslogic เข้ากับฐานข้อมูลเป็นเรื่องที่ดี แต่การทดสอบเหล่านี้เรียกว่าการทดสอบการรวมแม้ว่าคุณจะใช้ nunit หรือ junit หรือ phpunit เพื่อดำเนินการเหล่านี้
Unittestsคือการทดสอบ spezialized ที่การทดสอบแยก (เช่น buisinesslogic ที่ไม่มีฐานข้อมูล) เป็นสิ่งสำคัญ Mocks / fakes / stups ถูกใช้เพื่อบังคับใช้การแยกนี้
เพียงแค่: ทดสอบ DAO จริงไม่ใช่เนื้อหาฐานข้อมูล
สมมติว่าคลาส DAO Person ของคุณมีเมธอด getByName () คุณเขียนทดสอบและโทร Person.getByName ("John Smith") สมมติว่าการทดสอบล้มเหลวเพราะมีคนลบบันทึกของจอห์นออกจากฐานข้อมูล ตอนนี้ซอฟต์แวร์ CI ทุกตัวและหัวหน้างาน / ผู้ตรวจสอบของคุณสามารถอ้างได้ว่าซอฟต์แวร์ของคุณมีข้อบกพร่อง แต่ในความเป็นจริงมันไม่ใช่ หากคุณจำลองฐานข้อมูลคุณสามารถพิสูจน์ได้ว่า DAO ของคุณทำงานได้หากได้รับแถวที่ถูกต้องจากตารางที่ถูกต้อง
หากคุณต้องการทดสอบฐานข้อมูลเองเช่น: หากการเรียกใช้งานเมธอด DAO ที่แน่นอนทำให้ข้อมูลอยู่ในสถานะที่แน่นอนก็เป็นไปได้เช่นกัน มีอะไรเพิ่มเติมที่เป็นประโยชน์จริง ๆ กับตัวแบบข้อมูลที่แปลกประหลาด (EAV, ชุดต้นไม้ซ้อน) ที่คุณไม่สามารถคาดหวังได้ว่าฐานข้อมูลจะมีความสมบูรณ์แบบกันกระสุน ดูที่DBUnitเพื่อทำให้ชีวิตของคุณง่ายขึ้น
อีกเหตุผลหนึ่งคือเพื่อหลีกเลี่ยงเวลาดำเนินการของการรันคำสั่งฐานข้อมูลจริง อาจดูเหมือนไม่มากนัก แต่ค่าใช้จ่ายในการตั้งค่าและการเชื่อมต่อที่ขาดลงในที่สุดจะเพิ่มขึ้นและมีแนวโน้มมากที่สุดที่จะเพิ่มเวลาโดยรวมในการรันชุดทดสอบเมื่อเทียบกับการใช้วัตถุจำลอง
เพื่อแยกชั้นที่คุณกำลังทดสอบ หรืออื่น ๆ หากการทดสอบล้มเหลวคุณจะรู้ได้อย่างไรว่าปัญหาอยู่ในชั้นเรียนที่คุณกำลังทำการทดสอบหรือหนึ่งในนั้นคือการอ้างอิง