2010-08-21 18 views
15

Desidero implementare i test di integrazione dei repository gestiti da Entity Framework. Il problema è come ripristinare lo stato del database dopo aver eseguito i test. Al momento sto pianificando di iniziare la transazione sul set-up di prova e di eseguire il rollback al test TearDown. Esistono altre soluzioni ad eccezione della cancellazione manuale del database?Esecuzione di un rollback - Test di integrazione del repository

risposta

21

Facciamo questo nei nostri test di integrazione durante l'utilizzo di MSTest. Usiamo il TransactionScope e implementiamo un setup di test e teardown in una classe base. Ciò consente di eseguire tutti i test di integrazione all'interno di una transazione. La classe base è molto simile a questa:

public class IntegrationTestsBase 
{ 
    private TransactionScope scope; 

    [TestInitialize] 
    public void Initialize() 
    { 
     this.scope = new TransactionScope(); 
    } 

    [TestCleanup] 
    public void TestCleanup() 
    { 
     this.scope.Dispose(); 
    } 
} 

Buona fortuna.

+0

Very nice! Ora, se solo avesse funzionato per Oracle ... –

+0

Per quanto ne so, 'TransactionScope' funziona con Oracle. È appositamente progettato per la comunicazione multi-server multi-vendor (commit a due fasi). – Steven

+2

Ok e dopo aver eseguito repo.Save (someObject) nel test, come si controlla che l'oggetto sia stato salvato? –

2

Questo è probabilmente il modo più semplice, l'altro modo è ricostruire il database su SetUp.

5

penso che sei sulla strada giusta ....

Here's an example doing the same with Linq To SQL that you can tweek for yourself.

This link describes three options:

  • transazioni
  • Ricostruire il DB
  • utilizzare gli snapshot di SQL Server

Il post prosegue descrivendo le transazioni mentre i più veloci sono legati a una singola sessione e possono creare alcuni problemi/restrizioni reali. Usa se puoi ....

La ricostruzione del DB è lenta ma sicuramente fattibile ma l'uso di istantanee è veloce e aggira le restrizioni della transazione.

Se si ha la necessità di avere prestazioni molto elevate nei test automatici try this from the same blogger. Descrive l'utilizzo di MS Distributed Transaction Coordinator per eliminare le restrizioni transazionali di una singola sessione.

4

Il problema con l'apertura di TransactionScope in Installazione e Smaltimento in TearDown è che NON stai testando il commit!

+1

Non testare il commit rende l'intero test un mezzo test di integrazione ... – Pascal

0

Il modo migliore è un approccio transazionale. Il link che ho fornito contiene una breve passeggiata. Quasi tutte le soluzioni aziendali con cui sono entrato in contatto utilizzano un approccio basato sulle transazioni. Assicurati di dare un'occhiata anche ai link in fondo all'articolo che hanno collegamenti alla Documentazione di Microsoft sulle transazioni con il framework di entità. Le altre opzioni sopra elencate sono competitive in un semplice concetto di pulizia di una transazione di prova. La creazione di un database o l'utilizzo di snapshot di tipo completo è un completamento eccessivo a questo problema. TransactionScope non esegue nemmeno la transazione lasciando incompleto un test di integrazione.

Implementare transazioni

Questo creerà una transazione prima di ogni test inizia e rollback della transazione dopo la fine di ogni prova.

[TestClass] 
public class TransactionTest 
{ 
    protected EntitiesV3 context; 
    protected DbContextTransaction transaction; 

    [AssemblyInitialize] 
    public static void AssemblyStart(TestContext testContext) 
    { 
    RetryDbConfiguration.SuspendExecutionStrategy = true; 
    } 

    [TestInitialize] 
    public void TransactionTestStart() 
    { 
    context = new EntitiesV3(); 
    transaction = context.Database.BeginTransaction(); 
    } 

    [TestCleanup] 
    public void TransactionTestEnd() 
    { 
    transaction.Rollback(); 
    transaction.Dispose(); 
    context.Dispose(); 
    } 

    [AssemblyCleanup] 
    public static void AssemblyEnd() 
    { 
    RetryDbConfiguration.SuspendExecutionStrategy = false; 
    } 
} 

Great quick walk through on transactional rollback/cleanup approach

Problemi correlati