Come faccio a prova di unità di persistenza?

voti
43

Come un principiante nella pratica di sviluppo test-driven, che spesso finiscono in un dilemma su come unità di prova di persistenza in un database.

So che tecnicamente questo sarebbe un test di integrazione (non una prova di unità), ma voglio scoprire le migliori strategie per la seguente:

  1. query di prova.
  2. Test inserti. Come faccio a sapere che l'inserto che è andato storto se non riesce? Posso provarlo inserendo e poi l'interrogazione, ma come faccio a sapere che la query non era sbagliato?
  3. Test aggiornamenti ed eliminazioni - stesso come inserti di test

Quali sono le migliori pratiche per fare questi?


Per quanto riguarda i test di SQL: Mi rendo conto che questo potrebbe essere fatto, ma se uso un Mapper O / R come NHibernate, che annette alcune verruche denominazione nei alias utilizzati per le query di uscita, e come quello è un po 'imprevedibile non sono sicuro ho potuto testare per questo.

Devo solo, abbandonare tutto e semplicemente fidarsi di NHibernate? Io non sono sicuro che sia prudente.

È pubblicato 05/08/2008 alle 10:43
fonte dall'utente
In altre lingue...                            


10 risposte

voti
16

Se vuoi in Unità DB. Si tratta di una libreria Java, ma ci deve essere un C # equivalenti. Esso permette di preparare il database con una serie di dati in modo da sapere ciò che è nel database, allora si può interfacciarsi con DB Unità di vedere ciò che è presente nel database. Può funzionare contro molti sistemi di database, in modo da poter utilizzare la configurazione del database vero e proprio, o utilizzare qualcos'altro, come HSQL in Java (un'implementazione del database Java con l'opzione di memoria a).

Se si desidera verificare che il codice utilizza il database correttamente (che molto probabilmente dovrebbe fare), allora questo è la strada da percorrere per isolare ogni test e garantire il database ha atteso i dati preparati.

Risposto il 11/08/2008 a 10:40
fonte dall'utente

voti
15

Come ha detto Mike Stone , DBUnit è grande per ottenere il database in uno stato conosciuto prima di eseguire i test. Quando i test sono finiti, DBUnit può mettere il database back nello stato in cui era prima è stato eseguito il test.

DBUnit (Java)

DbUnit.NET

Risposto il 25/08/2008 a 14:22
fonte dall'utente

voti
4

Tu fai il test delle unità deridendo la connessione al database. In questo modo, è possibile costruire gli scenari in cui le query specifiche nel flusso di una chiamata di metodo esito positivo o negativo. Io di solito costruisco le mie aspettative finti in modo che il testo della query reale è ignorato, perché ho davvero voglia di testare la tolleranza ai guasti del metodo e come si gestisce - le specifiche di SQL sono irrilevanti a tal fine.

Ovviamente questo significa che il test non sarà effettivamente verificare che il metodo funziona , perché lo SQL può essere sbagliato. Questo è dove i test di integrazione calci in. Per questo, mi aspetto che qualcun altro avrà una risposta più approfondita, come sto appena cominciando a fare i conti con chi me stesso.

Risposto il 05/08/2008 a 10:47
fonte dall'utente

voti
3

Ho scritto un post qui relativa unità di testare il livello di dati , che si occupa di questo problema esatto. Ci scusiamo per il tappo (vergognoso), ma l'articolo è troppo lungo per postare qui.

Spero che ti aiuta - ha funzionato molto bene per me nel corso degli ultimi 6 mesi su 3 progetti attivi.

Saluti,

Rob G

Risposto il 13/08/2008 a 00:23
fonte dall'utente

voti
2

Per i progetti basati su JDBC, quadro Accolito può essere utilizzato: http://acolyte.eu.org . Permette di mockup l'accesso ai dati che si desidera test, beneficiando di JDBC astrazione, senza dover gestire una specifica DB di prova.

Risposto il 09/07/2014 a 10:20
fonte dall'utente

voti
2

Per NHibernate, mi piacerebbe sicuramente sostengo appena beffardo il NHibernate APIper i test unitari - fiducia in biblioteca per fare la cosa giusta. Se si vuole garantire che i dati va in realtà al DB, fare un test di integrazione.

Risposto il 05/08/2008 a 12:20
fonte dall'utente

voti
2

Il problema che ho vissuto quando il test delle unità di persistenza, soprattutto senza un ORM e beffardo quindi il database (connessione), è che non so davvero se le vostre domande successo. Potrebbe essere che le query sono specificamente progettati per una particolare versione del database e avere successo solo con quella versione. Non troverete mai che se si deridere il database. Quindi, a mio parere, unit testing persistenza è di scarsa utilità. Si deve sempre aggiungere test in esecuzione sul database mirati.

Risposto il 05/08/2008 a 11:29
fonte dall'utente

voti
1

Io di solito creare un repository e l'uso che per salvare la mia entità, quindi recuperare uno nuovo. Poi affermo che il recuperata è uguale alla salvato.

Risposto il 27/08/2008 a 22:17
fonte dall'utente

voti
1

Tecnicamente test di unità di persistenza non sono prove di gruppo a cui test di integrazione.

Con C # utilizzando MbUnit, è sufficiente utilizzare gli attributi SqlRestoreInfo e rollback

    [TestFixture]
    [SqlRestoreInfo(<connectionsting>, <name>,<backupLocation>]
    public class Tests
    {

        [SetUp]
        public void Setup()
        {

        }

        [Test]
        [RollBack]
        public void TEST()
        {
           //test insert. 
        }
    }

Lo stesso può essere fatto in NUnit, excpet i nomi degli attributi differiscono leggermente.

Per quanto riguarda la verifica se la query era succeful, di solito è necessario seguire con una seconda query per vedere se il database è stato modificato come previsto.

Risposto il 05/08/2008 a 12:27
fonte dall'utente

voti
1

Vorrei anche prendere in giro il database, e verificare che le query sono quello che vi aspettavate. V'è il rischio che il test verifica la sql sbagliato, ma questo sarebbe stato rilevato nei test di integrazione

Risposto il 05/08/2008 a 11:19
fonte dall'utente

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more