Domanda

Questo sembrava suscitare un po 'di conversazione su un'altra domanda ed io pensava che degno di girare nella sua stessa domanda.

Il principio DRY sembra essere la nostra arma-di-scelta per la lotta contro la manutenzione problemi, ma per quanto riguarda il mantenimento della codice di test ? Fare le stesse regole del pollice applicare?

Qualche voci forti nella comunità degli sviluppatori di test sono del parere che setup e teardown sono nocivi e dovrebbero essere evitati ... solo per citarne alcuni:

Infatti, xUnit.net ha li rimosso dal quadro complessivamente per questa ragione (Anche se ci sono modi per aggirare questo autoimposta limitazione ) .

Qual è stata la tua esperienza? Fare setup / teardown male o aiuto test di manutenibilità?

Aggiorna :? Fare costrutti più a grana fine, come quelli disponibili in JUnit4 o TestNG (@BeforeClass, @BeforeGroups, etc.) fare la differenza

È stato utile?

Soluzione

La maggior parte (se non tutti) di valida utilizza per l'impostazione e teardown metodi può essere scritta come metodi di fabbrica, che permette di asciugare senza entrare in questioni che sembrano essere afflitto con l'installazione / teardown paradigma .

Se stai attuazione del teardown, di solito questo significa che non stai facendo una prova di unità, ma piuttosto un test di integrazione. Un sacco di gente utilizzare questo come una ragione per non avere un teardown, ma IMO non ci dovrebbe essere sia di integrazione e test di unità. Io personalmente separarli in assemblee separate, ma penso che un buon ambiente di test dovrebbe essere in grado di supportare entrambi i tipi di test. Non tutti bene di test sta per essere unit testing.

Tuttavia, con la messa a punto sembra che ci sia una serie di motivi per cui è necessario fare le cose prima di un test sia effettivamente eseguito. Ad esempio, la costruzione dello stato dell'oggetto di preparazione per la prova (ad esempio la creazione di un quadro di iniezione di dipendenza). Questo è un motivo valido per una messa a punto, ma potrebbe facilmente essere fatto con una fabbrica.

Inoltre, v'è una distinzione tra classe e livello di metodo di impostazione / teardown. Che deve essere tenuto presente quando si considera quello che stai cercando di fare.

Il mio problema più grande che ho avuto con l'utilizzo del paradigma di setup / teardown è che i miei test non sempre seguono lo stesso schema. Questo mi ha portato ad utilizzare i modelli di fabbrica, invece, che mi permette di avere, mentre DRY allo stesso tempo di essere leggibile e non è affatto fonte di confusione per gli altri sviluppatori. Andare via in fabbrica, sono stato in grado di avere la mia torta e mangiarla a.

Altri suggerimenti

Hanno davvero aiutato con la nostra manutenzione di prova. I nostri test "unità" sono in realtà pieni test di integrazione end-to-end che scrivono al DB e verificare i risultati. Non è colpa mia, erano così quando sono arrivato qui, e sto lavorando per cambiare le cose.

In ogni caso, se un test è fallito, è andato a quello successivo, cercando di inserire lo stesso utente dal primo test nel DB, violando un vincolo di unicità, e gli insuccessi appena cascata da lì. Spostando la creazione dell'utente / delezione nel [Fixture] [Setup | tearDown] metodi ha permesso di vedere l'un test che non è riuscita, senza tutto ciò che accade in tilt, e ha reso la mia vita molto più facile e meno stabby

.

Credo che il principio DRY vale tanto per i test come avviene per il codice, ma la sua applicazione è diversa. Nel codice si va a lunghezze molto maggiori a letteralmente non fare la stessa cosa in due diverse parti del codice. Nei test la necessità di farlo (fare un sacco dello stesso setup) è certamente un odore, ma la soluzione non è necessariamente di scomporre la duplicazione in un metodo di impostazione. Può essere a rendere lo stato più facile da impostare nella classe stessa o per isolare il codice in prova quindi è meno dipendente da questa quantità di Stato per essere significativo.

Dato l'obiettivo generale di solo testare una cosa per test, in realtà non è possibile evitare di fare un sacco della stessa cosa più e più volte, in alcuni casi (come la creazione di un oggetto di un certo tipo). Se si scopre di aver un sacco di che, può valere la pena ripensare l'approccio di test, come ad esempio l'introduzione di test parametrizzate e simili.

Credo setup e teardown dovrebbero essere in primo luogo per stabilire l'ambiente (come iniezioni per rendere l'ambiente di un test di uno piuttosto che una produzione uno), e non devono contenere misure che sono parte integrante del test.

Sono d'accordo con tutto ciò che Giuseppe ha da dire, in particolare la parte che riguarda tearDown essere segno di scrivere test di integrazione (e il 99% del tempo è quello che ho usato per), ma in aggiunta a quello direi che l'uso di installazione è un buon indicatore di quando prove devono essere logicamente raggruppati e quando dovrebbero essere suddivise in più classi di test.

Non ho alcun problema con le grandi metodi di impostazione quando si applicano i test di codice legacy, ma la messa a punto dovrebbe essere comune a ogni test nella suite . Quando vi trovate a dover il metodo di impostazione realmente facendo più bit di configurazione, allora è il momento di dividere i test in più casi.

A seguito gli esempi di "test Driven" , il metodo di impostazione avviene da di rimuovere la duplicazione nei casi di test.

Io uso l'installazione abbastanza frequentemente in Java e Python, spesso per impostare collaboratori (reale o di prova, a seconda). Se l'oggetto in prova non ha costruttori o solo i collaboratori come costruttori Creerò l'oggetto. Per una semplice classe di valori che di solito non si preoccupano con loro.

Io uso teardown molto raramente in Java. In Python è stato utilizzato più spesso perché ero più propensi a cambiare stato globale (in particolare, i moduli scimmia patching per ottenere gli utenti di questi moduli in prova). In questo caso voglio un teardown che verrà garantito di essere chiamato se un test fallito.

test di integrazione e test funzionali (che spesso utilizzano il quadro xUnit) hanno maggiori probabilità di avere bisogno di setup e teardown.

Il punto da ricordare è quello di pensare a infissi , non solo SECCO.

Non ho un problema con i metodi di impostazione e teardown di prova per sé.

Il problema per me è che se si dispone di una configurazione di prova e il metodo teardown, implica che lo stesso oggetto di prova viene riutilizzata per ogni test. Questo è un potenziale vettore di errore, come se ci si dimentica di ripulire qualche elemento di Stato tra i test, i risultati del test possono diventare ordine-dipendente. Ciò che vogliamo veramente è test che non condividono qualsiasi stato.

xUnit.Net si libera di setup / teardown, perché crea un nuovo oggetto per ogni test che viene eseguito. In sostanza, il costruttore diviene il metodo di configurazione, ed il finalizzatore diventa il metodo teardown. Non c'è (oggetto di livello) stato tenuto fra le prove, l'eliminazione di questo potenziale vettore di errore.

La maggior parte dei test che scrivo avere una certa quantità di messa a punto, anche se è solo creare le deride ho bisogno e il cablaggio l'oggetto in fase di sperimentazione fino agli prende in giro. Quello che non fanno è condividere qualsiasi stato tra i test. Teardown è solo fare in modo che io non condivido quello stato.

Non ho avuto il tempo di leggere sia di quello che hai postato, ma in particolare è piaciuto commento:

  

ogni test è costretto a fare l'inizializzazione per quello di cui ha bisogno per funzionare.

Impostazione e abbattere sono metodi di convenienza - non dovrebbero tentare di fare molto di più di inizializzare una classe utilizzando il suo costruttore di default, ecc codice comune che tre prove hanno bisogno in una classe di cinque test non dovrebbe apparire lì - ciascuno di le tre prove devono chiamare direttamente il codice. In questo modo anche le prove da pestare i piedi a vicenda e rompendo una serie di test solo perché hai cambiato una routine di inizializzazione del comune. Il problema principale è che questo sarà chiamato prima di tutte le prove - non solo test specifici. La maggior parte dei test dovrebbero essere semplici e quelli più complessi avranno bisogno di codice di inizializzazione, ma è più facile vedere la semplicità dei semplici test, quando non si dispone di tracciare attraverso un complesso di inizializzazione distruzione impostare e complessa allo strappo verso il basso mentre pensare a ciò che il test è in realtà dovrebbe realizzare.

Personalmente, ho trovato setup e teardown non sono sempre il male, e che questa linea di ragionamento è un po 'dogmatica. Ma non ho alcun problema loro una chiamata codice odore per unit test. Sento il loro uso dovrebbe essere giustificato, per alcuni motivi:

  1. Codice di prova è per sua natura procedurale. In generale, l'installazione / teardown do tendono a ridurre la leggibilità di prova / messa a fuoco.
  2. Metodi di tendono a inizializzare più di ciò che è necessario per ogni singolo test. Quando abusato possono diventare ingombrante. Object Madri, Test Data Costruttori, forse framework come factorygirl sembrano meglio a inizializzazione dati di test.
  3. Incoraggiano "contesto gonfiare" -. Più grande è il contesto test diventa, meno mantenibile Sarà

Nella misura in cui il mio setup / teardown non fa questo, penso che il loro uso è giustificato. Ci saranno sempre alcuni doppioni nei test. Neal Ford afferma questo come "I test possono essere bagnato, ma non ammollo ..." Inoltre, penso che il loro utilizzo è più giustificata quando non stiamo parlando di test di unità specifico, ma i test di integrazione in senso più ampio.

Lavorare per conto mio, questo non è mai stato veramente un problema. Ma ho trovato molto difficile mantenere suite di test in un ambiente di squadra, e tende ad essere perché non capiamo il codice a vicenda immediatamente, o non vogliamo fare un passo attraverso di essa per comprenderla. Dal punto di vista di prova, ho trovato consentendo una certa duplicazione nei test facilita questo fardello.

Mi piacerebbe sentire come gli altri si sentono su questo, però.

Se avete bisogno di setup e teardown di fare il test di unità di lavoro, forse quello che davvero è necessità oggetti fittizi?

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top