Ogni test di unità può essere eseguito indipendentemente da altri test?

21

Supponiamo di avere prove per due metodi di una classe. Il primo metodo raccoglie i dati da un altro livello e li inserisce in una sorta di memoria indipendente dal runtime (come una tabella SQL), quindi tutti i dati gestiti da questo test sono codificati nel test. Il secondo metodo è responsabile della presa dei dati da dove il primo metodo lo ha lasciato e trasformandolo in qualche modo (calcolo, spostamento di alcune parti altrove, ecc.).

Ora questo secondo metodo potrebbe avere input hardcoded come il primo, o si potrebbe presumere che i due test sarebbero eseguiti in sequenza e potrebbe riprendere da dove il primo test è stato interrotto, prendendo i dati che erano realmente memorizzati dal primo test.

Se avessi optato per la seconda opzione, avresti davvero una buona idea che i due metodi funzionino bene insieme, tuttavia, se il primo test fallisse, tutti i test successivi fallirebbero, portando via il vantaggio dei test nell'aiutare a isolare i bug più rapidamente.

Se avessi optato per la prima opzione, ogni metodo sarebbe stato isolato e testato in modo indipendente, ma non avresti mai saputo che potevano davvero lavorare insieme correttamente.

Qual è l'opzione migliore qui? C'è una sorta di alternativa come avere un singolo test per ogni metodo isolato con hardcoding e quindi test più grandi che contengono entrambi i metodi in uno?

    
posta Morgan Herlocker 01.04.2011 - 15:15
fonte

4 risposte

11

If you went with the first option, each method would be isolated and tested independently, but you would never really know that they can really work together properly.

Se i tuoi metodi sono veramente indipendenti, questo non dovrebbe avere importanza. Il tuo secondo metodo dovrebbe:

a) Funziona correttamente se presentato con dati validi.

b) Errore in modo sensibile e coerente quando vengono presentati dati non validi.

Allo stesso modo il tuo primo metodo dovrebbe fare lo stesso. Quindi, se gestisci i casi di errore, funzioneranno correttamente insieme.

Se vuoi verificare che i metodi funzionino correttamente, allora questo è test di integrazione, non test di unità.

    
risposta data 01.04.2011 - 15:26
fonte
27

Se i test non possono essere eseguiti indipendentemente, non si tratta di test unitari.

Un test unitario non deve basarsi su nessuno stato esterno, come il contenuto di una tabella del database. Dovrebbe semplicemente testare un'unità di codice in isolamento.

I test che alterano o richiedono un determinato stato sono validi, ad esempio possono costituire parte dei test di integrazione e in tali casi è importante garantire che venga eseguita l'impostazione appropriata, ma questi non sarebbero test unitari. In questo caso non consiglierei ancora che un test ne richieda un altro per essere eseguito. Se si è in questo caso, è probabilmente necessario calcolare il codice richiesto in un metodo di installazione separato. Potresti avere un test che chiama solo il codice di configurazione e verifica che non venga lanciata alcuna eccezione, ad esempio, e poi un altro test che utilizza in modo attivo i dati impostati nel metodo di configurazione.

    
risposta data 01.04.2011 - 15:20
fonte
9

Sono sicuro che ora sembra OK avere il test unitario B che dipende dallo stato lasciato dal test dell'unità B. Ma considera un anno da oggi quando hai migliaia di test unitari. Vuoi davvero aspettare dieci minuti per completare l'intera suite di test ogni volta che devi apportare una modifica?

Dipende ovviamente dal tuo stile di sviluppo, ma se vuoi sperare in uno sviluppo basato su test decente, in cui potresti eseguire un test individuale più volte durante lo sviluppo di una funzione, ti suggerisco di dare a ciascun test la possibilità di stare da solo .

    
risposta data 01.04.2011 - 15:26
fonte
3

Sembra che tu stia parlando della configurazione del test, che può essere eseguita in diversi modi. Vuoi una copia pulita dei dati del test (chiamata fixture) per ogni test, quindi ognuno di essi non dovrebbe dipendere l'uno dall'altro.

Esistono diversi framework che consentono questo tipo di test e strumenti come DBUnit che ti consentono di creare e amp; abbattere rapidamente le strutture dati all'inizio e alla fine di test e suite di test.

    
risposta data 01.04.2011 - 15:19
fonte

Leggi altre domande sui tag