Ho bisogno di un test di unità se ho già un test di integrazione?

41

Se ho già un test di integrazione per il mio programma e sono passati tutti, allora ho la sensazione che funzionerà. Allora quali sono i motivi per scrivere / aggiungere test unitari? Dato che devo già scrivere i test di integrazione, mi piacerebbe solo scrivere un test unitario per le parti che non sono coperte dai test di integrazione.

Quello che so il vantaggio del test unitario sul test di integrazione sono

  • Piccolo e quindi veloce da eseguire (ma l'aggiunta di una nuova unità per testare qualcosa è già stata testata da test di integrazione significa che la mia tuta di test totale diventa sempre più lunga da eseguire)
  • Individua i bug più facilmente perché verifica solo una cosa (ma posso iniziare a scrivere test delle unità per verificare ogni singola parte quando il mio test di integrazione ha avuto esito negativo)
  • Trova bug che potrebbero non essere scoperti nel test di integrazione. per esempio. bug mascheramento / sfalsamento. (ma se la mia integrazione verifica tutti i passaggi, il che significa che il mio programma funzionerà anche alcuni bug nascosti. Quindi trovare / correggere questi bug non sono veramente una priorità alta a meno che non inizino a interrompere futuri test di integrazione o causare problemi di prestazioni)

E vogliamo sempre scrivere meno codice, ma i test di unità di scrittura richiedono molto più codice (principalmente l'impostazione di oggetti fittizi). La differenza tra alcuni dei miei test unitari e test di integrazione è che nei test unitari, uso l'oggetto mock, e nei test di integrazione, io uso l'oggetto reale. Che hanno un sacco di duplicati e non mi piace il codice duplicato, anche nei test perché questo aggiunge un sovraccarico per modificare il comportamento del codice (lo strumento Refactor non può fare tutto il lavoro tutto il tempo).

    
posta Bryan Chen 14.07.2013 - 13:55
fonte

5 risposte

28

Hai esposto buoni argomenti a favore e contro i test unitari. Quindi devi chiederti, " Vedo valore negli argomenti positivi che superano i costi in quelli negativi? " Certamente lo faccio:

  • Piccolo-e-veloce è un aspetto gradevole dei test unitari, sebbene non sia il più importante.
  • Individuazione-bug [s] -easier è estremamente prezioso. Molti studi di sviluppo di software professionale hanno dimostrato che il costo di un bug aumenta rapidamente man mano che invecchiano e si sposta verso il basso nella pipeline di consegna del software.
  • Trovare i bug mascherati è prezioso. Quando sai che un particolare componente ha verificato tutti i suoi comportamenti, puoi usarlo in modi che non è stato usato in precedenza, con sicurezza. Se l'unica verifica è tramite test di integrazione, sai solo che i suoi attuali usi si comportano correttamente.
  • Il derisione è costoso nei casi reali, e il fatto di mantenere le prese in giro è doppiamente tale. In effetti, quando si prendono in giro oggetti o interfacce "interessanti", potrebbero anche essere necessari test per verificare che i propri oggetti finti modellano correttamente i propri oggetti reali!

Nel mio libro, i professionisti superano gli svantaggi.

    
risposta data 14.07.2013 - 15:22
fonte
8

Non vedo molto valore nel reimplementare un testcase di integrazione esistente come un unittest.

I test di integrazione sono spesso molto più facili da scrivere per applicazioni legacy non tdd perché solitamente le funzionalità da testare sono strettamente accoppiate, quindi le unità di test isolate (= non testate) possono essere difficoltose / costose / impossibili.

> Then what are the reasons to write/add unit tests?

A mio parere, lo sviluppo basato sui test è più efficace se si scrivono i test unitari prima del codice effettivo. In questo modo il codice che soddisfa i test diventa chiaramente separato con un minimo di riferimenti esterni che è facilmente testabile.

Se il codice esiste già senza i test delle unità, di solito è necessario molto lavoro extra per scrivere i test delle unità in seguito perché il codice non è stato scritto per un facile test.

Se fai TDD il codice automaticamente è facilmente testabile.

    
risposta data 14.07.2013 - 16:38
fonte
5

I test di integrazione dovrebbero solo verificare che diversi componenti stiano lavorando insieme come previsto. La correttezza o meno della logica dei singoli componenti dovrebbe essere verificata mediante test unitari.
La maggior parte dei metodi ha diversi possibili percorsi di esecuzione; pensa a if-then-else, alle variabili di input con valori sbagliati inaspettati o semplicemente sbagliati, ecc. Di solito gli sviluppatori tendono a pensare solo al percorso felice: il percorso normale che non va storto. Ma per quanto riguarda questi altri percorsi, hai due opzioni: puoi consentire al tuo utente finale di esplorare quei percorsi attraverso le azioni che eseguono nell'interfaccia utente e sperare che non blocchino la tua applicazione, oppure puoi scrivere test unitari che affermano il comportamento di questi altri percorsi e intraprendere azioni laddove necessario.

    
risposta data 15.07.2013 - 12:31
fonte
4

Alcuni dei motivi per cui hai indicato la tua domanda sono davvero importanti e di per sé potrebbero benissimo essere a favore del test unitario, ma YMMV. Ad esempio, quanto spesso esegui la tua suite di test integrata? La mia esperienza con i test integrati è che prima o poi diventeranno così lenti che non li eseguirai ogni volta che cambierai e il tempo tra l'inserimento e il rilevamento di un bug aumenterà.

Inoltre, un grosso errore che potresti fare è fidarsi di

Find bug that may not be caught in integration test. e.g. masking/offsetting bugs.

non è importante. Ti aspetti che i tuoi utenti trovino i bug per te? La fiducia nelle coperture ottenute da test integrati è pericolosa, a mio avviso, si può facilmente ottenere un'alta percentuale di copertura, ma in realtà si sta testando molto poco.

Credo che il riferimento canonico contro i test integrati siano i post di JBrains:

link

nel caso in cui non li avessi già letti.

Infine, IMO il feedback che puoi ottenere dai test unitari per il tuo progetto è inestimabile. Giudicare un design per sentimento e affidarsi a test integrati può anche essere un errore.

    
risposta data 14.07.2013 - 23:40
fonte
1

Se ti aspetti di dover modificare o riorganizzare il tuo codice, è essenziale disporre di test unitari. I test unitari esistono non solo per dimostrare bug nel momento in cui il codice viene scritto, ma per mostrare quando vengono visualizzati nuovi bug quando viene scritto più codice.

Sì, è molto meglio scrivere prima i test di integrazione e unità, ma è molto utile averli anche se sono scritti in seguito.

    
risposta data 14.07.2013 - 23:53
fonte

Leggi altre domande sui tag