ฉันพยายามอย่างหนักที่จะเขียนการทดสอบหน่วยที่มีประสิทธิภาพสำหรับโครงการขนาดใหญ่ Django ฉันมีความครอบคลุมการทดสอบที่ดีพอสมควร แต่ฉันได้ตระหนักว่าการทดสอบที่ฉันเขียนคือการทดสอบการรวม / การยอมรับไม่ใช่การทดสอบหน่วยเลยและฉันมีส่วนสำคัญของแอปพลิเคชันที่ไม่ได้รับการทดสอบอย่างมีประสิทธิภาพ ฉันต้องการแก้ไขโดยเร็วที่สุดนี้
นี่คือปัญหาของฉัน สคีมาของฉันนั้นมีความสัมพันธ์ลึกซึ้งและมุ่งเน้นไปที่เวลาอย่างมากทำให้วัตถุต้นแบบของฉันมีความสัมพันธ์ภายในสูงและมีสถานะเป็นจำนวนมาก แบบสอบถามวิธีการแบบจำลองของฉันจำนวนมากขึ้นอยู่กับช่วงเวลาและฉันมีจำนวนมากauto_now_add
เกิดขึ้นในเขตข้อมูลที่ประทับเวลา ดังนั้นลองใช้วิธีที่มีลักษณะเช่นนี้:
def summary(self, startTime=None, endTime=None):
# ... logic to assign a proper start and end time
# if none was provided, probably using datetime.now()
objects = self.related_model_set.manager_method.filter(...)
return sum(object.key_method(startTime, endTime) for object in objects)
วิธีใดวิธีหนึ่งในการทดสอบบางอย่างเช่นนี้
ที่นี่ฉันอยู่ไกล เกิดขึ้นกับฉันว่าวัตถุประสงค์การทดสอบหน่วยควรได้รับพฤติกรรมเยาะเย้ยby key_method
บนข้อโต้แย้งของมันคือการsummary
กรอง / รวมอย่างถูกต้องเพื่อให้ได้ผลลัพธ์ที่ถูกต้อง?
การเยาะเย้ย datetime.now () ตรงไปตรงมาเพียงพอ แต่ฉันจะเยาะเย้ยส่วนที่เหลือของพฤติกรรมได้อย่างไร
- ฉันสามารถใช้อุปกรณ์ติดตั้งได้ แต่ฉันได้ยินข้อดีและข้อเสียของการใช้อุปกรณ์ติดตั้งสำหรับการสร้างข้อมูลของฉัน (การบำรุงรักษาไม่ดีเป็นอุปกรณ์สำหรับบ้านที่ฉัน)
- ฉันสามารถตั้งค่าข้อมูลของฉันผ่านทาง ORM ได้ แต่นั่นก็สามารถ จำกัด ได้เพราะฉันต้องสร้างวัตถุที่เกี่ยวข้องเช่นกัน และ ORM ไม่อนุญาตให้คุณยุ่งกับ
auto_now_add
ฟิลด์ด้วยตนเอง - การเยาะเย้ย ORM เป็นอีกทางเลือกหนึ่ง แต่ไม่เพียง แต่เป็นการยากที่จะจำลองวิธีการ ORM ที่ซ้อนกันอย่างลึกซึ้ง แต่ตรรกะในโค้ด ORM ได้รับการเยาะเย้ยจากการทดสอบและการเยาะเย้ยดูเหมือนจะทำให้การทดสอบขึ้นอยู่กับ internals และการพึ่งพา ฟังก์ชั่นภายใต้การทดสอบ
ถั่วที่ยากที่สุดที่จะทำการแคร็กดูเหมือนจะเป็นฟังก์ชั่นเช่นนี้ซึ่งนั่งอยู่ในโมเดลไม่กี่เลเยอร์และฟังก์ชั่นระดับล่างและขึ้นอยู่กับเวลามากถึงแม้ว่าฟังก์ชั่นเหล่านี้อาจไม่ซับซ้อนมากนัก ปัญหาโดยรวมของฉันคือไม่ว่าฉันจะฝืนมันอย่างไรการทดสอบของฉันดูซับซ้อนกว่าฟังก์ชั่นการทดสอบ