Perché scriviamo oggetti finti quando scriviamo casi di test unitari?


11

Attualmente stiamo scrivendo casi di unit test nel nostro progetto. Le implementazioni per i metodi di database esistono e funziona bene. In questo caso, perché dobbiamo scrivere oggetti finti? C'è qualche motivo specifico? Perché non riesco a testare direttamente l'implementazione DAO?

Risposte:


6

Non dovresti deridere le chiamate al database perché ciò vanificherebbe lo scopo. Ciò che DOVREBBE deridere sono, ad esempio, le chiamate al tuo DAO, ad esempio, da un livello di servizio. Il derisione ti consente di testare i metodi in modo isolato.

Supponi di avere una simulazione di un ristorante con un'architettura come questa:

Cook <=> Server <=> Customer

Vuoi testare ogni strato in modo indipendente. Qui Serverè il tuo livello di servizio e Cookpuò essere pensato come un DAO. Il Serverè ciò che si vuole prendere in giro durante il test Customer, e Cookè quello che si vuole finto durante il test del Server. I Cooktest unitari, tuttavia, dovrebbero verificare che l'implementazione stia restituendo un hamburger quando è stato ordinato un hamburger e non una gomma.


3
Non sono d'accordo con l'affermazione Non dovresti deridere le chiamate al database perché ciò vanificherebbe lo scopo. perché sembra troppo generico. Come altri dicono di seguito, è necessario testare tutto in isolamento. Se la cosa che stai testando l'unità è l'accesso al database, certo, il tuo commento è corretto. Se la cosa che stai testando l'unità non è l'accesso al database, la tua prima frase non è corretta. Sono d'accordo con tutto il resto che dici. +0. :-)
Peter K.

6

È perfettamente ok testare businesslogic insieme al database. ma questi test vengono chiamati test di integrazione anche se si utilizzano nunit o junit o phpunit per eseguirli.

Gli unittest sono test spezializzati in cui i test in isolamento (vale a dire buisinesslogic senza il database) sono importanti. Derisioni / falsi / stups sono usati per imporre questo isolamento.


2

Semplicemente: per testare il DAO effettivo e non il contenuto del database.

Supponiamo che la tua classe DAO Person abbia un metodo getByName (). Scrivi un test e chiami Person.getByName ("John Smith"). Supponiamo che il test fallisca, perché qualcuno ha rimosso il record di John dal database. Ora, ogni software CI e i vostri supervisori / revisori possono affermare che il vostro software è difettoso, mentre in realtà non lo è. Se deridi DB, puoi provare che il tuo DAO funziona se viene fornita la riga corretta dalla tabella corretta.

Se vuoi davvero testare il database stesso, cioè: se l'esecuzione di un determinato metodo DAO mette i dati in un certo stato, allora è anche possibile. Inoltre, è davvero utile con modelli di dati stravaganti (EAV, set di alberi nidificati) in cui non ci si può aspettare che il database fornisca integrità a prova di proiettile. Dai un'occhiata a DBUnit per semplificarti la vita.


1

Un altro motivo è evitare i tempi di esecuzione dell'esecuzione effettiva dei comandi del database. Potrebbe non sembrare molto, ma il sovraccarico di impostazione e smantellamento delle connessioni alla fine si sommerà e molto probabilmente aumenterà in modo significativo il tempo complessivo di esecuzione della suite di test rispetto all'utilizzo di oggetti finti.


0

Per isolare la classe che stai testando. Altrimenti se il test fallisce come fai a sapere se il problema è nella classe che stai testando o in una delle sue dipendenze.


Chiamate e testate direttamente i metodi nell'impianto DAO?
Vinoth Kumar CM
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.