Büyük bir Django projesi için etkili birim testleri yazmakta gerçekten zorlanıyorum. Oldukça iyi bir test kapsamım var, ancak yazdığım testlerin birim testleri değil kesinlikle entegrasyon / kabul testleri olduğunu fark ettim ve uygulamamın etkili bir şekilde test edilmeyen kritik kısımlarım var. Bu en kısa sürede düzeltmek istiyorum.
İşte benim sorunum. Şemam derinden ilişkisel ve çok zaman odaklı, model nesnesime yüksek iç bağlantı ve çok fazla durum sağlıyor. Model yöntemlerimin çoğu zaman aralıklarına göre sorgular ve auto_now_add
zaman damgalı alanlarda çok şey oluyor. Öyleyse şöyle görünen bir yöntem alın örneğin:
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)
Birisi böyle bir şeyi test etmeye nasıl yaklaşıyor?
İşte şimdiye kadar buradayım. Bana göre birim test amacına argümanlarında alaycı davranışlar verilmeli by key_method
, summary
doğru bir sonuç elde etmek için doğru bir şekilde süzülüyor / toplanıyor mu?
Alay datetime.now () yeterince basittir, ancak davranışın geri kalanını nasıl alay edebilirim?
- Fikstürleri kullanabilirdim, ancak verilerimi oluşturmak için fikstürleri kullanmanın artılarını ve eksilerini duydum (zayıf sürdürülebilirlik benim için eve çarpan bir con).
- Verilerimi ORM aracılığıyla da kurabilirim, ancak bu sınırlayıcı olabilir, çünkü o zaman ilgili nesneleri de oluşturmam gerekiyor. ORM,
auto_now_add
alanları manuel olarak karıştırmanıza izin vermez . - ORM'yi taklit etmek başka bir seçenektir, ancak yalnızca derinden iç içe ORM yöntemlerini taklit etmek zor değildir, aynı zamanda ORM kodundaki mantık testten alay edilir ve alay etmek, testi gerçekten fonksiyon test altındaki.
Çatlamak için en zor somunlar, birkaç model modeli ve daha düşük seviyeli fonksiyonlara dayanan ve bu fonksiyonlar çok karmaşık olmasa bile, zamana çok bağlı olan bu gibi fonksiyonlar gibi görünüyor. Genel sorunum, nasıl dilimlediğim önemli değil, testlerimin test ettikleri işlevlerden çok daha karmaşık görünmesi.