Saya benar-benar berjuang untuk menulis unit test yang efektif untuk proyek Django besar. Saya memiliki cakupan tes yang cukup baik, tetapi saya menyadari bahwa tes yang saya tulis jelas merupakan tes integrasi / penerimaan, bukan tes unit sama sekali, dan saya memiliki bagian penting dari aplikasi saya yang tidak diuji secara efektif. Saya ingin memperbaiki ASAP ini.
Inilah masalah saya. Skema saya sangat relasional, dan sangat berorientasi waktu, memberikan objek model saya kopling internal yang tinggi dan banyak keadaan. Banyak model metode saya kueri berdasarkan interval waktu, dan saya punya banyak hal auto_now_add
terjadi di bidang timestamped. Jadi ambil metode yang terlihat seperti ini misalnya:
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)
Bagaimana satu pendekatan menguji sesuatu seperti ini?
Di sinilah saya sejauh ini. Terjadi pada saya bahwa tujuan pengujian unit harus diberikan beberapa perilaku mengejek by key_method
pada argumennya, apakah summary
benar penyaringan / agregasi untuk menghasilkan hasil yang benar?
Mengolok-olok datetime.now () cukup mudah, tetapi bagaimana saya bisa mengejek perilaku lainnya?
- Saya bisa menggunakan perlengkapan, tapi saya sudah mendengar pro dan kontra menggunakan perlengkapan untuk membangun data saya (rawatan yang buruk menjadi con yang membuat saya pulang).
- Saya juga bisa mengatur data saya melalui ORM, tapi itu bisa membatasi, karena dengan begitu saya harus membuat objek terkait juga. Dan ORM tidak membiarkan Anda mengacaukan
auto_now_add
bidang secara manual. - Mengejek ORM adalah pilihan lain, tetapi tidak hanya sulit untuk mengejek metode ORM yang bersarang, tetapi logika dalam kode ORM akan diejek dari tes, dan mengejek tampaknya membuat tes benar-benar tergantung pada internal dan dependensi dari tes fungsi
Kacang yang paling sulit retak tampaknya adalah fungsi-fungsi seperti ini, yang terdapat pada beberapa lapisan model dan fungsi tingkat yang lebih rendah dan sangat tergantung pada waktu, walaupun fungsi-fungsi ini mungkin tidak terlalu rumit. Masalah saya secara keseluruhan adalah bahwa tidak peduli bagaimana saya mengirisnya, pengujian saya terlihat jauh lebih kompleks daripada fungsi yang mereka uji.