Test end-to-end vs. test unitari, i test dovrebbero essere disaccoppiati?


23

Nella nostra azienda in genere ci assicuriamo di scrivere un test end-to-end per i nostri siti Web / app Web. Ciò significa che accediamo a un URL, compiliamo un modulo, inviamo il modulo a un altro URL e controlliamo i risultati della pagina. Facciamo questo per testare la validazione dei moduli, verificare che i modelli HTML abbiano le variabili di contesto corrette, ecc.

Lo usiamo anche per testare indirettamente la logica sottostante.

Mi è stato detto da un collega che la ragione di ciò è che possiamo strappare e cambiare l'implementazione sottostante in qualsiasi momento finché i test end-to-end passano.

Mi chiedo se questo tipo di disaccoppiamento abbia senso o se sia solo un modo per evitare di scrivere test per unità di codice più piccole?


6
was told by a co-worker that the reason for this is that we can rip out and change the underlying implementation at any point as long as the end-to-end tests pass.- Questo vale anche per i test unitari. Mi sembra che i test end-to-end vengano usati come scusa per non scrivere test unitari.
Robert Harvey,

12
Ciò non vale per i test unitari. La modifica / rimozione / creazione di metodi o classi richiede l'aggiornamento di tutti i test unitari per tali metodi o classi. Non così nei test end-to-end a meno che la funzionalità dell'utente finale non cambi. Finché si tratta di un refattore a livello di sistema (nessuna modifica della funzionalità dell'utente finale) non sono necessarie modifiche ai test end-to-end.
dietbuddha,

2
@dietbuddha, penso che il concetto generale sia vero per i test unitari, ma in un ambito più piccolo (unitario).
Sam,

Risposte:


38

Sono inoltre necessari test end-to-end. In quale altro modo puoi sapere di aver collegato correttamente tutte le unità? Su un codice molto semplice, è possibile testare tutti i percorsi attraverso il codice solo con test end-to-end, ma man mano che si ottengono più livelli, diventa proibitivamente più costoso farlo.

Ad esempio, supponiamo di avere tre livelli, ciascuno con cinque possibili percorsi. Per testare tutti i percorsi attraverso l'intera applicazione richiederebbero 5 3 test end-to-end, ma è possibile testare tutti i percorsi attraverso ciascuna unità con solo 5 · 3 test unitari. Se esegui solo test end-to-end, molti percorsi finiscono per essere trascurati, principalmente nella gestione degli errori e nelle condizioni al contorno.


Questa è una buona risposta Vedo il valore di entrambi, ma vedere il numero di possibilità per testare completamente tutti i percorsi con test end-to-end è utile per spiegare perché i test unitari devono essere fatti più di quanto non sia
Rudolf Olah,

14
Considero i test unitari preziosi soprattutto perché localizzano rapidamente i problemi. Gli end-to-end sono preziosi perché ti danno la sicurezza che tutto funzioni insieme.
Jason Swett,

20

Sì, i test end-to-end (o test di integrazione) hanno molto senso, ma anche i test unitari. Idealmente, li avete entrambi, poiché entrambi in genere catturano diversi tipi di bug. Pertanto, avere test end-to-end non dovrebbe mai essere una scusa per non avere test unitari.


2
Una breve nota sulla formulazione; anche se non è una scienza esatta, molte persone diranno che i test end-to-end e i test di integrazione sono cose diverse. Vedere stackoverflow.com/questions/4904096/...
sbrattla

6

Dopo qualche altro anno di programmazione e di elaborazione di progetti, fornirò una risposta alla mia domanda.

Sì, dovresti scrivere unit test. I test end-to-end sono più difficili da scrivere e fragili soprattutto se si basano su componenti dell'interfaccia utente.

Se si utilizza un framework come Django o Rails (o le proprie classi personalizzate), è necessario disporre di una classe di modulo che gestirà la convalida del modulo. Avrai anche classi di visualizzazione che visualizzano modelli renderizzati e il modulo e gestiscono le richieste GET e POST.

In un test end to end dovresti:

  1. ottenere l'URL
  2. compila il modulo con dati validi
  3. invia il modulo all'URL
  4. verificare che il database sia stato aggiornato o che sia stata eseguita qualche azione come risultato del modulo valido

Stai testando un sacco di codice e la tua copertura sarà piuttosto buona, ma stai solo testando il percorso felice quando tutto va bene. Come assicurate che il modulo abbia la giusta validazione in esso? Cosa succede se quel modulo viene utilizzato su più pagine? Scrivi ancora un altro test end-to-end?

Riproviamo con i test unitari:

  1. prova il metodo GET della vista
  2. prova il metodo POST di visualizzazione con un modulo falso / finto
  3. prova il modulo con dati validi
  4. prova il modulo con dati non validi
  5. testare gli effetti collaterali del modulo

Usando unit test, stai testando piccoli pezzi di codice e i test sono specifici e più facili da scrivere. Combinando questo con TDD (Test Driven Development) si ottiene un codice di qualità superiore.

La facilità di scrittura dei test unitari non dovrebbe essere ignorata perché quando sei su un progetto che non ha test automatici, devi iniziare da qualche parte. Iniziare con i test unitari è più semplice e veloce e consente di iniziare immediatamente i test per i bug piuttosto che solo per il percorso felice.


un altro punto dati, Google Testing Blog dice di no a più test end2end
Rudolf Olah

5

In realtà test end-to-end o test di integrazione sono più importanti dei test unitari poiché assicurano che tu abbia un sistema completamente funzionante. I test unitari non coprono la parte di integrazione di un sistema, il che è un compito complicato soprattutto nei grandi progetti.

Tuttavia, come è stato detto, è necessario eseguire anche test unitari, poiché è più complicato individuare i casi limite nei test di integrazione.


1

Verifica il comportamento del sistema, mentre i test unitari verificano il comportamento dell'unità. I vantaggi e i costi per ciascuno sono diversi. Potresti fare l'uno o l'altro o entrambi.

Nel mio lavoro facciamo lo sviluppo guidato dai test di accettazione senza test unitari che sembrano simili a quelli che hai descritto. Abbiamo iniziato a fare entrambe le cose e, nel tempo, alla fine abbiamo eliminato i test unitari a un costo superiore ai benefici per noi.

Detto questo, penso che il costo / beneficio per il tuo dominio e ambiente problematico dovrebbe guidare le decisioni a impegnarsi in qualsiasi pratica di sviluppo, incluse diverse pratiche di test automatizzati. Piuttosto che la fede, preferisco che tutte le pratiche abbiano prove empiriche nel contesto in cui vengono utilizzate per sostenerle.


Ciò di cui sono preoccupato è che codificheremo i test di accettazione che portano a classi o metodi di grandi dimensioni anziché a unità più piccole.
Rudolf Olah,

@Mouse: Solo perché non stai scrivendo unit test non c'è motivo per non scrivere un buon codice. Tuttavia, se si dispone di programmatori inesperti o con cattive abitudini, i vantaggi potrebbero essere superiori ai costi. In entrambi i casi dovresti fare l'analisi e ridurla a una semplice equazione. For Any Practice: Practice iff Benefit > Cost
dietbuddha,
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.