Considerare i test unitari per due (o più) livelli conseguenti in applicazioni Web, backend, ad esempio viste (si tratta di parametri del modulo di analisi, rendering della risposta) e azioni (logica dell'applicazione). Nella vista, le chiamate alle azioni vengono prese in giro. Nelle azioni vengono derise le chiamate al livello sottostante. I test sono veloci, ma sono meno utili di quanto possano essere, perché la connessione tra i livelli richiede la sincronizzazione e i test di integrazione sono lenti e rari (in teoria). Sincronizzazione significa che le funzioni / metodi simulati e derisi sono sincronizzati. Altrimenti verifichiamo una simulazione, che potrebbe facilmente perdere la connessione alla realtà se non aggiornata, e quindi la potenza dei test unitari è diminuita.
La domanda è: qualcuno ha già avuto un'idea su come mantenere le simulazioni di livello superiore con "interfacce" di livello inferiore con l'obiettivo di rendere il test più manutenibile mentre è ancora veloce? Interfacce meno stabili sono ovviamente di interesse.
Ho sempre preferito test funzionali, più integrali perché tendono a catturare più regressioni e bug che test di unità separate. In alcuni casi, la logica applicativa è solo un semplice script di transazione con N azioni, quindi il mocking non offre alcun vantaggio ai test (il test unitario segue da vicino l'implementazione). Tuttavia, quelli sono lenti, quindi sto cercando di venire con un meccanismo, e forse inventando la ruota.
Soprattutto nei linguaggi dinamici di livello superiore, come Python.
Alcuni esempi.
function my_script():
callA()
callB()
callC()
I test appariranno come (pseudocodice):
monkeypatch(callA, dummyA)
monkeypatch(callB, dummyB)
monkeypatch(callC, dummyC)
my_script()
assert dummyB.called_after(dummyA)
assert dummyC.called_after(dummyB)
- questo non prenderà
callD()
dovrebbe essere aggiunto a my_script o effetti collaterali all'interno di quelle funzioni o anche cambiamenti nelle loro firme (per esempio,callB
modificato per richiedere un parametro). Il test passerà ancora. In questo caso il test dell'unità è inutile.