Domanda

Come principiante nella pratica dello sviluppo basato sui test, spesso mi ritrovo in difficoltà su come testare l'unità di persistenza in un database.

So che tecnicamente questo sarebbe un test di integrazione (non un test unitario), ma voglio scoprire le migliori strategie per quanto segue:

  1. Testare le query.
  2. Inserti di prova.Come faccio a sapere che l'inserto che è andato storto se fallisce?Posso testarlo inserendo e quindi interrogando, ma come posso sapere che la query non era sbagliata?
  3. Testare aggiornamenti ed eliminazioni: come testare gli inserimenti

Quali sono le migliori pratiche per fare tutto questo?


Per quanto riguarda il test SQL:Sono consapevole che ciò potrebbe essere fatto, ma se utilizzo un O/R Mapper come NHibernate, allega alcuni problemi di denominazione negli alias utilizzati per le query di output e poiché ciò è alquanto imprevedibile non sono sicuro di poterlo testare Quello.

Dovrei semplicemente abbandonare tutto e fidarmi semplicemente di NHibernate?Non sono sicuro che sia prudente.

È stato utile?

Soluzione

Esamina l'unità DB.È una libreria Java, ma deve esserci un equivalente C#.Ti consente di preparare il database con una serie di dati in modo da sapere cosa c'è nel database, quindi puoi interfacciarti con DB Unit per vedere cosa c'è nel database.Può essere eseguito su molti sistemi di database, quindi puoi utilizzare la configurazione effettiva del database o utilizzare qualcos'altro, come HSQL in Java (un'implementazione del database Java con un'opzione in memoria).

Se vuoi verificare che il tuo codice utilizzi correttamente il database (cosa che molto probabilmente dovresti fare), allora questa è la strada da percorrere per isolare ciascun test e garantire che il database abbia preparato i dati previsti.

Altri suggerimenti

COME Mike Stone ha detto, DbUnit è ottimo per portare il database in uno stato noto prima di eseguire i test.Al termine dei test, DbUnit può riportare il database nello stato in cui si trovava prima dell'esecuzione dei test.

DbUnit (Java)

DbUnit.NET

Esegui il test unitario simulando la connessione al database.In questo modo, puoi creare scenari in cui query specifiche nel flusso di una chiamata al metodo hanno esito positivo o negativo.Di solito costruisco le mie finte aspettative in modo che il testo effettivo della query venga ignorato, perché voglio davvero testare la tolleranza agli errori del metodo e il modo in cui si gestisce: le specifiche dell'SQL sono irrilevanti a tal fine.

Ovviamente questo significa che il tuo test non verificherà effettivamente che il metodo lavori, perché l'SQL potrebbe essere sbagliato.È qui che entrano in gioco i test di integrazione.Per questo, mi aspetto che qualcun altro abbia una risposta più approfondita, dato che sto appena iniziando a prendermene cura io stesso.

Ho scritto un post qui riguardo unità che testano il livello dati che copre esattamente questo problema.Ci scusiamo per il (vergognoso) plug-in, ma l'articolo è troppo lungo per poterlo pubblicare qui.

Spero che questo ti aiuti: ha funzionato molto bene per me negli ultimi 6 mesi su 3 progetti attivi.

Saluti,

RobG

Il problema che ho riscontrato durante il test unitario della persistenza, soprattutto senza un ORM e quindi deridendo il tuo database (connessione), è che non sai veramente se le tue query hanno esito positivo.È possibile che le tue query siano progettate specificamente per una particolare versione del database e abbiano esito positivo solo con quella versione.Non lo scoprirai mai se prendi in giro il tuo database.Quindi, a mio avviso, la persistenza dei test unitari è solo di utilità limitata.Dovresti sempre aggiungere test in esecuzione sul database di destinazione.

Per NHibernate, Sosterrei sicuramente semplicemente di prendere in giro il NHibernate API per i test unitari: fidati che la libreria faccia la cosa giusta.Se vuoi assicurarti che i dati vadano effettivamente al DB, esegui un test di integrazione.

Per i progetti basati su JDBC, è possibile utilizzare il mio framework Acolyte: http://acolyte.eu.org .Permette di simulare l'accesso ai dati che si desidera testare, beneficiando dell'astrazione JDBC, senza dover gestire uno specifico DB di test.

Vorrei anche deridere il database e verificare che le query siano quelle previste.C'è il rischio che il test controlli l'SQL sbagliato, ma questo verrebbe rilevato nei test di integrazione

Tecnicamente i test unitari di persistenza non sono test unitari, sono test di integrazione.

Con C# che utilizza mbUnit, usi semplicemente 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, tranne che i nomi degli attributi differiscono leggermente.

Per quanto riguarda la verifica se la tua query ha avuto successo, normalmente devi farla seguire da una seconda query per vedere se il database è stato modificato come previsto.

Di solito creo un repository e lo utilizzo per salvare la mia entità, quindi recuperarne una nuova.Quindi affermo che ciò che è recuperato è uguale a ciò che è salvato.

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