Come fare banca dati test di unità?
-
04-10-2019 - |
Domanda
Ho sentito dire che quando lo sviluppo di applicazioni che utilizza un database che si dovrebbe fare unit testing del database. Quali sono le migliori pratiche nel test di unità base di dati? Quali sono le principali preoccupazioni quando si fanno test di unità db e come farlo "giusto"?
Soluzione
Quali sono le migliori pratiche nel test di unità base di dati?
Il DBUnit quadro (un framework di test che permette di mettere un database in uno stato conoscere e di eseguire affermazione contro il suo contenuto) ha un database pagina di elenco testare migliori pratiche che, per la mia esperienza, sono vere.
Quali sono le principali preoccupazioni quando si fa il test delle unità db
- Creazione di un fino a schema di data, la gestione dello schema cambia
- Configurazione dei dati (dati di riferimento, dati di test) e mantenendo i dati di test
- Keeping test indipendenti
- permettendo agli sviluppatori di lavorare simultaneamente
- Velocità (test che coinvolgono dati sono in genere più lenti e renderà la vostra intera costruzione richiedere più tempo)
e come farlo "giusto"?
Come accennato, seguire note le buone pratiche e utilizzare dedicati strumenti / quadri:
- Prefer in-memory database, se possibile (per la velocità)
- Utilizzare uno schema per sviluppatore è un must (per consentire il lavoro simultaneo)
- Utilizzare uno strumento di "database di migrazione" (à la RoR) per gestire le modifiche allo schema e aggiornare uno schema per l'ultima versione
- Costruire o utilizzare un test harness che permette di mettere il database in uno stato conosciuto prima di ogni prova e per eseguire afferma contro i dati dopo l'esecuzione (o per eseguire i test all'interno di una transazione che si rollback alla fine del test).
Altri suggerimenti
Un elenco di elementi che dovrebbero essere esaminato e considerato quando fissando con unit testing del database
- Ogni tester ha bisogno di un database separato, al fine di evitare di interferire con le attività di altri tester / sviluppatore
- Per avere un modo semplice di creare una banca dati da testare (questo è legato ad avere un database SQL Server sotto controllo di versione). Questo è particolarmente utile quando si cerca di trovare ciò che è andato storto se alcuni test falliscono
- Focus su aree specifiche e test creando un singolo modulo invece di coprire tutto in una volta. Aggiunta test granularly è un buon modo per essere efficace
- Assicurati di fornire il maggior numero di dettagli possibile quando un test fallisce, per consentire una più facile il debug
- Utilizzare uno e gli stessi dati di test per tutti i test
Se il test vengono implementati utilizzando il framework tSQLt, il processo di test di unità potrebbe essere complicata quando si tratta di un sacco di basi di dati provenienti da più istanze di SQL Server. Al fine di mantenere, eseguire e gestire i test di unità direttamente da SQL Server Management Studio, ApexSQL Unit Test lattina essere utilizzato come soluzione
Date un'occhiata al questo link . Si va oltre alcuni dei principi fondamentali per la creazione di unità di test stored procedure in SQL Server, nonché i diversi tipi di test di unità e quando si dovrebbe usarli. Io non sono sicuro di quello che si sta utilizzando DBMS ma ovviamente questo articolo è orientata verso SQL Server.
Stolen dall'articolo:
Test Feature
Il primo e probabilmente più diffuso classe di unit test del database è un test di funzionalità. Nella mia mente, caratteristica test testare le caratteristiche-o Core API, se si vuole, del database dalla prospettiva banca dati del consumatore. Test programmabilità di un database oggetti è lo scenario mainline qui. Così, testando tutte le stored procedure, funzioni e trigger all'interno della vostra banca dati costituiscono prove di funzionalità in la mia mente. Per provare una stored procedure, si dovrebbe eseguire la stored procedure e verificare che sia l'atteso i risultati sono stati restituiti o Si è verificato un comportamento appropriato. Tuttavia, è possibile testare più di una semplice questi tipi di oggetti. Puoi immaginare che vogliono assicurare che una vista, per esempio, restituire l'appropriato calcolo da una colonna calcolata. Come si può vedere, le possibilità in questo reame sono grandi.
Schema Test
Uno degli aspetti più critici di un banca dati è il suo schema, e test di garantire è che si comporta come previsto un'altra classe importante di banca dati unit test. Qui, spesso si vuole al fine di garantire che la vista restituisce il attesi set di colonne dello appropriato tipo di dati nella ordine appropriato. Potresti volere assicurarsi che il database fa, in infatti, contengono le tabelle che 1.000 che ci si aspetta.
Sicurezza Test
Nel giorno di oggi e di età, la sicurezza dei dati memorizzati all'interno base di dati è fondamentale. Così, un altro importante classe di unit test del database sono quelli che prova il database sicurezza. Qui, si vuole assicurano che particolari utenti esistono in il database e che siano assegnate le autorizzazioni appropriate. Spesso Si vuole creare negativo test che tentano di recuperare i dati da tabelle o viste con restrizioni e assicurare che l'accesso sia opportunamente negato.
Immagine-Data Test
Molti database contengono dati di stock, o i dati di semi. Questi dati cambiano di rado ed è spesso usato come occhiata dati per applicazioni o fine utenti. ZIP codici e la loro associati le città e gli stati sono ottimi esempi di questo tipo di dati. Pertanto, è utile per creare test affinché il tuo magazzino di dati fa, infatti, esiste nel database.
Sono contento che hai chiesto di test di unità, e non prova in generale.
Database hanno molte caratteristiche che hanno bisogno di essere testati. Alcuni esempi:
- Tipi di dati / formato / set di caratteri (provate l'inserimento di un nome svedese, o gli URL lunghi o numeri provenienti dal mondo reale, e vedere se le definizioni delle colonne sono ok)
- Trigger
- Vincoli (chiavi esterne, l'unicità ...)
- Vista (verificare che i dati vengono correttamente inclusi / esclusi / trasformata)
- stored procedure
- UDF
- Permessi
- ...
Questo è utile non solo quando si cambia qualcosa nel database, ma anche quando si aggiorna il DBMS, o il cambiamento qualcosa nelle impostazioni.
In generale, l'integrazione test è fatto. Ciò significa che si crea una suite di test in un linguaggio di programmazione come PHP o Java, e le prove rilasciano alcune query. Ma se qualcosa non riesce, o ci sono alcune eccezioni, è più difficile capire il problema, per 2 motivi:
- Il problema potrebbe essere nel codice PHP, o in configurazione di PHP, o in rete, o ...
- Le istruzioni SQL sono più difficili da leggere e modificare, se sono inseriti in un altro linguaggio di programmazione.
Quindi, a mio parere, per database complessi è necessario utilizzare un quadro Unit Testing che è scritto in SQL (utilizzando stored procedure e tabelle). Devi scegliere con attenzione, perché questo tipo di strumenti, non è ampiamente utilizzato (e quindi non ampiamente testato). Ad esempio, se si utilizza MySQL So che questi strumenti:
Io uso unit test / NUnit / etc e il codice del database JUnit con Java o C #. Questi possono poi essere eseguito su un server di integrazione magari utilizzando uno schema separato per il database di test.
L'ultima Oracle SQL Developer è dotato di una costruito nel quadro unit testing. Ho dato un'occhiata a questo, ma sarebbe non usarlo. Esso utilizza un'interfaccia grafica per creare ed eseguire test e memorizza tutti i test nel database in modo non così facile da mettere casi di test sotto il controllo di versione. Ci sono probabilmente altri framework di test là fuori immagino che potrebbe essere specifico per il database.
Le buone pratiche sono simili a test di unità regolari:
- mettere i test sotto il controllo di origine
- test make che corrono veloci - non lo fanno di prova troppo in una volta ??li>
- fare le vostre prove riproducibili
Date un'occhiata sul quadro DBTestDriven. E le grandi opere per noi. Scaricalo da GitHub o il loro sito web.
Per quanto riguarda lo sviluppo JVM, unit test possono beneficiare di JDBC astrazione:. Non appena si sa quali dati JDBC sono sollevate da un accesso DB, questi dati possono essere JDBC 'riprodotto'
Così caso l'accesso DB può essere 'riprodotto' per il test, senza l'obiettivo di DB:. Nessuna prova / dati Separazione complessità, la facilità di integrazione continua
Il mio quadro Accolito è un framework utile in questo modo (compresi strumento GUI studio per 'record' risultato DB): https://github.com/cchantep/acolyte