Sto davvero lottando per scrivere test unitari efficaci per un grande progetto Django. Ho una copertura di prova ragionevolmente buona, ma ho capito che i test che ho scritto sono senz'altro test di integrazione / accettazione, non test unitari, e ho parti critiche della mia applicazione che non sono state testate in modo efficace. Voglio risolvere questo APPENA POSSIBILE.
Ecco il mio problema. Il mio schema è profondamente relazionale e strongmente orientato al tempo, dando al mio oggetto modello un elevato accoppiamento interno e molto stato. Molti dei miei metodi di modello interrogano in base a intervalli di tempo e ho un sacco di auto_now_add
in corso in campi con data e ora. Quindi prendi un metodo come questo, ad esempio:
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)
Come ci si avvicina a testare qualcosa del genere?
Ecco dove sono fin qui. Mi viene in mente che l'obiettivo di test dell'unità dovrebbe essere dato un comportamento simulato by key_method
sui suoi argomenti, è summary
correttamente filtraggio / aggregazione per produrre un risultato corretto?
Mocking datetime.now () è abbastanza semplice, ma come posso prendere in giro il resto del comportamento?
- Potrei usare le fixture, ma ho sentito pro e contro usare le fixture per costruire i miei dati (la scarsa manutenibilità è una truffa che mi colpisce per casa).
- Potrei anche configurare i miei dati attraverso l'ORM, ma ciò può essere limitante, perché poi devo creare anche oggetti correlati. E l'ORM non ti consente di fare confusione con i campi di
auto_now_add
manualmente. - Deridere l'ORM è un'altra opzione, ma non è solo complicato prendere in giro i metodi ORM profondamente annidati, ma la logica nel codice ORM viene derisa dal test e il mocking sembra rendere il test realmente dipendente dagli interni e dipendenze della funzione sotto test.
I dadi più difficili da decifrare sembrano essere le funzioni come questa, che siedono su pochi livelli di modelli e funzioni di livello inferiore e dipendono molto dal tempo, anche se queste funzioni potrebbero non essere super complicate. Il mio problema generale è che, a prescindere da quanto sembri affettare, i miei test sembrano molto più complessi delle funzioni che stanno testando.