2009-02-27 11 views
13

Mi considero ancora piuttosto nuovo per la scena TDD. Ma trovo che non importa quale metodo io usi (mock framework o stubing miei oggetti) trovo che devo scrivere molto codice per creare dati mock. Mi piace l'idea di caricare gli oggetti per creare un database in memoria. Ma quello che non mi piace è ingombrare i miei test con una tonnellata di codice al solo scopo di creare dati falsi. Questo è specialmente il caso in cui i dati devono tener conto di tutti i diversi casi.Creazione di dati fittizi per il test dell'unità

Mi piacerebbe qualche suggerimento per un modo migliore di farlo.

Mi sembra che dovrei essere in grado di caricare i dati una volta in uno stato noto da qualche archivio dati e quindi potrei usare un'istantanea di quello stato che viene caricato nel setup di test/inizializzare prima di ogni metodo di test viene eseguito. Ciò consentirà di soddisfare le corrette pratiche di test fornendo al contempo comodità e mi consentirà di concentrarmi sulla scrittura di test anziché sulla scrittura di codice per creare dati di test "a mano".

risposta

6

Potrebbe essere possibile provare la libreria NBuilder. Fornisce un'interfaccia molto fluida ed è facile da usare. Puoi usarlo per generare istanze singole di una classe con valori defualt o generare liste con valori predefiniti o sovrascritti. Puoi dare un'occhiata a this uno.

+0

Bello, questo è proprio quello che stavo cercando. Mi ero arreso dal momento che non avevo trovato nulla che mi piacesse davvero. Questo è bello quando i valori dei dati non sono così importanti se corrispondono ai valori originali generati. –

0

So esattamente cosa intendi. Penso che un buon approccio per risolvere questo problema sia quello di avere un progetto MockFramework separato che ospita tutti i tuoi dati simulati, al di fuori del progetto di test. In questo modo è possibile generare dati di simulazione separatamente, memorizzarli in memoria se si desidera, o meno, e quindi fare riferimento al framework di simulazione dal progetto di test. Se usi un framework di terze parti per fare questo, tanto meglio, ma puoi ancora avvolgere quel framework di terze parti nel tuo finto framework in modo da poter ottenere tutto quel "colla" che crea i dati simulati nel modo in cui ne hai bisogno i tuoi test quindi i test possono essere davvero solo ciò di cui hanno bisogno.

+0

Questo risolve il problema della confusione, ma ho ancora bisogno di prendere in giro tutti i dati, solo in un progetto separato. Forse, come hai suggerito, potrei usare un framework di terze parti per caricare i dati e tradurli nel mio modello a oggetti. nDbUnit potrebbe funzionare, come suggerito da webjedi. –

1

È possibile avere classi Builder che ti aiutano a creare le istanze necessarie/in questo caso quelle che useresti correlate al repository. Chiedi al Builder di utilizzare i valori predefiniti appropriati e sui test puoi sovrascrivere quello che ti serve. Questo ti aiuta a evitare di dover scambiare ogni singolo caso di "dati" per tutti i diversi test (che introduce problemi, perché di solito ci sono casi che non sono compatibili per test diversi).

** Aggiornamento 1: ** Date un'occhiata a www.markhneedham.com/blog/2009/01/21/c-builder-pattern-still-useful-for-test-data

+0

Grazie per il link, che mi ha aiutato a vedere meglio cosa intendevi. Ciò richiede ancora che io scriva gli oggetti a mano, solo in modo diverso. Tuttavia, si fa un buon punto per non mettere ogni singolo caso nei "dati". –

+0

Si noti che il punto di default è quello di abilitare l'utente a disporre di tale configurazione/dati condivisi, ma non di averli tutti persi con casi specifici. – eglasius

1

Se usate Net Prova NDBUnit

Si popolano tuo negozio e poi si ritorna vostro DB ad uno stato noto in fase di test, per ogni test. La serie di cast dello schermo Autumn of Agile mostra questo in modo abbastanza dettagliato.

Oppure è possibile farlo manualmente ... creare una stored procedure o qualsiasi altra cosa per troncare le tabelle e copiare i dati nel metodo di smontaggio.

+0

Funzionerebbe solo per i test di integrazione. – eglasius

+0

Freddy Rios ha ragione riguardo al tuo secondo commento. nDbUnit è vicino, ma non riesco a trovare alcun documento. Ho scaricato il codice di esempio da Autumn of Agile e sembra che abbia bisogno di un xsd e sto già utilizzando Entity Framework, quindi dovrei copiare tutto da xsd a EF. –

+0

L'XSD ha il solo scopo di sputare i dati correnti in un file xml e quindi di leggerli di nuovo dopo che il test è terminato. @Freddy Non lo so ... lo sto facendo dal primo passo ... non considererei un test di integrazione di per sé. – Webjedi

0

Grazie per tutti i suggerimenti, penso che la soluzione richieda un po 'di tutto. Non voglio che questi test finiscano per essere test di regressione, ma senza qualche tipo di archivio dati esistente tutto si riduce ancora alla creazione dei dati "manualmente" costruendo gli oggetti.

Quello che sarebbe davvero bello sarebbe un framework che mi permettesse di usare il mio DAL esistente per scrivere i dati in codice per me o ottenere i dati in memoria e accedervi come un database in memoria.

0

Untils.org copre in questo modo meglio di quanto potrei mai.

La loro intera guida è in realtà molto buona.

In pratica, se le unità richiedono "molti dati", potrebbero non essere più test unitari. Consiglierei di provare a testare i pezzi più piccoli individualmente.

+0

Il collegamento a Untils.org non funziona. – Torleif

Problemi correlati