Domanda

È possibile eliminare tutti i dati nel database utilizzando Nibernate.Voglio farlo prima di iniziare ogni test dell'unità.Attualmente cado il mio database e lo creò di nuovo ma questa non è una soluzione accettabile per me.

==========================================================

OK, ecco i risultati.Sto testando questo su un database (postgre).Testerò Createschema (1), Soluzione DANP (2) e Soluzione ApolloDude217 (3).Eseguo i test 5 volte con ogni metodo e prendi il tempo medio.

Round 1 - 10 test
(1) - ~ 26 sec
(2) - 9,0 sec
(3) - 9,3 sec

TOVS ROUND 2 - 100
(1) - Dai, non lo farò sulla mia macchina (2) - 12,6 sec
(3) - 18,6 sec

Penso che non sia necessario testare con più test.

È stato utile?

Soluzione

Personalmente, uso una procedura memorizzata per farlo, ma potrebbe essere possibile con HQL eseguibile (vedere questo post per maggiori dettagli: http://fabiomaulo.blogspot.com/2009/05/NH21-Executable-hql.html )

Qualcosa lungo le linee di sessione.Delete ("Object Object");

Altri suggerimenti

Sto usando la classe SchemaExport e ricreare lo schema prima di ogni test.Questo è quasi come far cadere il database, ma è solo caduta e ricreando le tabelle.Suppongo che l'eliminazione di tutti i dati da ciascuna tabella non sia più veloce, allora potrebbe anche essere più lento.

I nostri test dell'unità sono solitamente in esecuzione su SQLite in memoria, questo è molto veloce.Questo database esiste solo finché la connessione è aperta, quindi l'intero database viene ricreato per ogni test.Stiamo passando a SQLServer modificando la configurazione di build.

Non reclamo più veloce, ma puoi fare qualcosa del genere per ogni classe mappata:

// untested
var entities = MySession.CreateCriteria(typeof(MappedClass)).List<MappedClass>();
foreach(var entity in entities)
    MySession.Delete(entity);  // please optimize
.

Questo (solo) sarà non funziona in almeno 2 casi:

    .
  1. Quando ci sono dati che devono essere nel database quando l'app si avvia.
  2. Quando hai un tipo in cui il valore non salvato della proprietà dell'identità è "qualsiasi".

Una buona alternativa è avere un backup dello stato DB iniziale e ripristinandolo quando i test iniziali (questo può essere complesso o meno, a seconda del DB)

Re-creazione del database è una buona scelta, specialmente per il test dell'unità.Se lo script di creazione è troppo lento, è possibile effettuare un backup del database e utilizzarlo per ripristinare il DB in uno stato iniziale prima di ogni test.

L'alternativa sarebbe quella di scrivere uno script che eseguirebbe tutti i tasti estranei nel database quindi eliminare / troncare tutte le tabelle.Questo non resetterà comunque alcun ID o sequenze autogenerati.Questo non sembra una soluzione elegante ed è sicuramente più che richiede tempo. In ogni caso, questo non è qualcosa che dovrebbe essere fatto attraverso un orm, non solo nibernate.

Perché rifiuta l'opzione di ri-creazione?Quali sono le tue esigenze?Lo schema è troppo complesso?Qualcun altro progetta il database?Vuoi evitare la frammentazione dei file?

Un'altra soluzione potrebbe essere quella di creare una stored procedure che pulisce i dati.Nell'integrazione del test o nel metodo istanziato eseguire prima la procedura memorizzata.

Comunque non sono sicuro se questo è più veloce di uno qualsiasi degli altri metodi in quanto non conosciamo la dimensione del database e il numero di righe che potrebbero essere cancellati.Inoltre non consiglierei la distribuzione di questa procedura memorizzata al server live per scopi di sicurezza!

HTH

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