2009-04-20 9 views
9

Qualcuno ha qualche suggerimento per una procedura ottimale o un modo preferito di eseguire il rollback delle transazioni di database effettuate da un framework di test di integrazione come Selenium?Database di rollback dopo i test di integrazione (selenio)

Ecco la nostra situazione attuale: abbiamo un progetto web .net con un numero di test unitari che funzionano bene nel nostro ambiente di test unitario - ogni test eredita una classe genitore che apre una transazione in [SetUp], e rotola ripristinare la transazione in [TearDown]. Dopo ogni test, il nostro database di test unitario viene riportato allo stato originale.

Tuttavia, le cose cambiano una volta arrivati ​​al nostro ambiente di integrazione. Il nostro server di integrazione continua compila automaticamente i nostri commit e li invia a un server di test, in modo che il server funzioni sempre con il codice più aggiornato. Abbiamo anche installato un'istanza Selenium per automatizzare l'interazione dell'utente con il sito. I test del selenio fondamentalmente comunicano con un server Selenium esistente e dicono al server cose come "Avvia un browser e vai su http://testsite/TestPage.aspx - inserisci il testo" abc "nel campo modulo con id" def "- asserisci che la nuova pagina contiene il testo" xyz ""

Ogni test viene eseguito in modo simile ai nostri test dell'unità di vaniglia, ma con un'eccezione importante: qualsiasi modifica apportata da Selenium viene eseguita in un thread/applicazione completamente diverso, pertanto non è possibile (I * think we non può, almeno) riportarli indietro nel test di demolizione.

Non abbiamo ancora trovato una buona soluzione per questo. In questo momento siamo a un punto in cui stiamo utilizzando un SqlCommand per eseguire un'istruzione sql per il backup del database, quindi alla fine del test, stiamo impostando il database su utente singolo, lasciando cadere il db corrente e ripristinando la vecchia copia - questo non è l'ideale, perché uccide efficacemente l'applicazione che era collegata al DB e ci impone di reinizializzare nuovamente l'app.

Si tratta di un problema risolto in precedenza? Qualsiasi consiglio sarebbe fantastico.

Grazie!

risposta

3

Stiamo eseguendo uno script drop/create-table prima di ogni test. Questo è abbastanza veloce e garantisce che nulla è lasciato dai test precedenti.

PS: Stiamo usando NHibernate, che crea questo script al volo ed esegue il test su Sqlite in memoria, è lightspeed. Ma se passiamo a SqlServer è ancora abbastanza veloce.

+0

Grazie Stefan, Questa sembra essere la soluzione migliore: abbiamo fatto ricorso al solo troncamento delle tabelle e al ricaricamento i proiettori dopo ogni test, che non è proprio * quello * tassativo, e sembra che stia funzionando bene. Grazie ancora! – matt

+1

Il troncamento su oracle è piuttosto veloce, perché non è possibile eseguire il rollback di questa operazione. Gli script sono facili nella nostra situazione, gli script sono già disponibili, non dobbiamo mantenere qualcos'altro. –

+0

Questo script viene eseguito prima di ogni metodo di prova o caso di test? Assumerei ogni metodo di prova ... Inoltre, come viene eseguito questo script? Hai una API di servizio nel back-end? – HDave

3

È un problema difficile e la soluzione è in genere unica per ogni app. Fino a quando i quadri principali adottano un "approccio raccomandato", questo continuerà ad essere un dolore.

La mia migliore raccomandazione: pianifica questo utilizzo all'inizio della tua app. Includere API che puliscono dopo che il DB è stato ripristinato da sotto l'app (es .: resettare le cache).