2008-10-17 42 views
28

Ho appena letto l'articolo di Wikipedia su mock objects, ma non sono ancora del tutto chiaro sul loro scopo. Sembra che siano oggetti creati da un framework di test quando l'oggetto reale sarebbe troppo complesso o imprevedibile (si sa al 100% quali sono i valori dell'oggetto mock perché li si controlla completamente).Che cos'è un mock e quando dovresti usarlo?

Tuttavia, ho avuto l'impressione che tutti i test vengano eseguiti con oggetti con valori noti, quindi mi manca qualcosa. Ad esempio, in un progetto di corso, ci è stata assegnata una applicazione per il calendario. La nostra suite di test consisteva di oggetti evento che sapevamo esattamente di cosa erano, così da poter testare le interazioni tra più oggetti evento, vari sottosistemi e l'interfaccia utente. Immagino che questi siano oggetti finti, ma non so perché non lo faresti perché senza gli oggetti di valori noti, non puoi testare un sistema.

risposta

26

Un oggetto fittizio non è solo un oggetto con valori noti. È un oggetto che ha la stessa interfaccia di un oggetto complesso che non è possibile utilizzare in test (come una connessione di database e set di risultati), ma con un'implementazione che è possibile controllare nel test.

Ci sono quadri di derisione che ti permettono di creare questi oggetti al volo e in sostanza ti permettono di dire qualcosa come: Fammi un oggetto con un metodo foo che prende un int e restituisce un bool. Quando passo 0, dovrebbe restituire true. Quindi puoi testare il codice che usa foo(), per assicurarti che reagisca in modo appropriato.

Martin Fowler ha un grande articolo su beffardo:

+0

Collegamento di articolo impressionante. Grazie –

9

Pensa al caso classico di avere software client e server. Per testare il client, è necessario il server; per testare il server, è necessario il client. Ciò rende praticamente impossibile la verifica delle unità, senza l'utilizzo di mock. Se prendi in giro il server, puoi testare il client da solo e viceversa.

Il punto della finta non è quello di duplicare il comportamento delle cose per il suo beffardo però. È più di agire come una semplice macchina a stati i cui cambiamenti di stato possono essere analizzati dal framework di test. Quindi un client mock potrebbe generare dati di test, inviarlo al server e quindi analizzare la risposta. Ti aspetti una certa risposta a una richiesta specifica, quindi puoi testare se la ottieni.

6

Sono d'accordo con tutto quello che dice @Lou Franco e si dovrebbe assolutamente leggere l'eccellente articolo di Martin Fowler sulla prova raddoppia che i punti @Lou Franco tu a.

Lo scopo principale di ogni doppio test (falso, stub o mock) è isolare l'oggetto sottoposto a test in modo che il test dell'unità stia testando solo quell'oggetto (non le sue dipendenze e gli altri tipi con cui collabora o interagisce).

Un oggetto che fornisce l'interfaccia dalla quale dipende l'oggetto può essere utilizzato al posto della dipendenza effettiva in modo che sia possibile posizionare le aspettative sul verificarsi di determinate interazioni. Questo può essere utile, ma c'è qualche controversia riguardo ai test basati sullo stato e quelli basati sull'interazione. L'uso eccessivo di finte aspettative porterà a test fragili.

Un ulteriore motivo per i duplicati del test è la rimozione delle dipendenze da database o file system o altri tipi che sono costosi da configurare o eseguire operazioni che richiedono molto tempo. Ciò significa che puoi mantenere il tempo necessario per testare l'oggetto che ti interessa al minimo.

2

Ecco un esempio: se si sta scrivendo il codice che popola un database, è possibile controllare se un determinato metodo ha aggiunto dati al database.

L'installazione di una copia del database per il test ha il problema che se si presuppone che non vi siano record prima della chiamata al metodo testato e un record successivo, è necessario ripristinare il database in uno stato precedente, quindi aggiungendo al sovraccarico per l'esecuzione del test.

Se si presuppone che ci sia solo un record in più rispetto a prima, potrebbe essere in conflitto con un secondo tester (o anche un secondo test nello stesso codice) che si collega allo stesso database, causando così dipendenze e rendendo i test fragili.

La simulazione consente di mantenere le prove indipendenti l'una dall'altra e facili da configurare.

Questo è solo un esempio: sono sicuro che altri possono fornire di più.

Sono d'accordo al 100% con gli altri contributori su questo argomento, in particolare con la raccomandazione per l'articolo di Martin Fowler.

Problemi correlati