Faccio davvero fatica a scrivere test unitari efficaci per un grande progetto Django. Ho una copertura dei test ragionevolmente buona, ma mi sono reso conto che i test che ho scritto sono sicuramente test di integrazione / accettazione, non test unitari e ho parti critiche della mia applicazione che non sono state testate in modo efficace. Voglio riparare questo al più presto.
Ecco il mio problema Il mio schema è profondamente relazionale e fortemente orientato al tempo, offrendo al mio oggetto modello un elevato accoppiamento interno e molto stato. Molti dei miei metodi di modello eseguono query in base a intervalli di tempo e ho molto da auto_now_add
fare nei campi con data e ora. Quindi prendi un metodo simile a questo per 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 si può provare qualcosa del genere?
Ecco dove sono finora. Mi viene in mente che l'obiettivo del test unitario dovrebbe avere un comportamento beffardo by key_method
sui suoi argomenti, sta summary
filtrando / aggregando correttamente per produrre un risultato corretto?
Deridere datetime.now () è abbastanza semplice, ma come posso prendere in giro il resto del comportamento?
- Potrei usare gli infissi, ma ho sentito i pro e i contro dell'usare gli infissi per costruire i miei dati (la scarsa manutenibilità è una truffa che mi colpisce).
- Potrei anche impostare i miei dati tramite ORM, ma ciò può essere limitante, perché quindi devo creare anche oggetti correlati. E l'ORM non ti consente di pasticciare
auto_now_add
manualmente con i campi. - Deridere l'ORM è un'altra opzione, ma non solo è difficile deridere i metodi ORM profondamente annidati, ma la logica nel codice ORM viene derisa dal test e il derisione sembra rendere il test realmente dipendente dagli interni e dalle dipendenze del funzione sotto test.
I dadi più difficili da decifrare sembrano essere le funzioni come questa, che si trovano su alcuni strati di modelli e funzioni di livello inferiore e sono molto dipendenti dal tempo, anche se queste funzioni potrebbero non essere super complicate. Il mio problema generale è che, indipendentemente da come sembri tagliarlo, i miei test sembrano molto più complessi delle funzioni che stanno testando.