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
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.
Questo è probabilmente il modo più semplice, l'altro modo è ricostruire il database su SetUp.
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.
Il problema con l'apertura di TransactionScope in Installazione e Smaltimento in TearDown è che NON stai testando il commit!
Non testare il commit rende l'intero test un mezzo test di integrazione ... – Pascal
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
- 1. Come automatizzare test funzionali/di integrazione e rollback del database
- 2. Database di rollback dopo i test di integrazione (selenio)
- 3. Impossibile recuperare @Rollback per il test di integrazione Spring JPA
- 4. Come posso eseguire il rollback di un test di integrazione con Slick 3 + Specs2?
- 5. Esecuzione rapida di test di integrazione singola in Grails
- 6. Test di integrazione del compilatore in Haskell
- 7. Transazione di rollback dopo @Test
- 8. Grails: test di un reindirizzamento con un test di integrazione
- 9. Rails test del controller rspec vs test di integrazione
- 10. Test di integrazione Servizi WCF concatenati con database di test
- 11. Test di integrazione con Hibernate Envers
- 12. Test di integrazione per fullCalendar
- 13. Migliori pratiche di test di integrazione
- 14. Test di integrazione su un database - AVA
- 15. Test di integrazione del database in Visual Studio Online
- 16. Esecuzione di test di integrazione/accettazione per un'app per ombrelli in elisir
- 17. Amazon Kinesis + Test di integrazione
- 18. Mocking per test di integrazione
- 19. Test di integrazione: si può fare bene?
- 20. Test unità separati e test di integrazione
- 21. Test di integrazione e unità
- 22. Come misurare la copertura del test di integrazione di Golang?
- 23. Test di integrazione con aerospike?
- 24. Test di integrazione con Redis
- 25. Test di integrazione con Authlogic?
- 26. Sono un test unitario o test di integrazione?
- 27. Interfacce hardware software di integrazione/test unità
- 28. Test di integrazione e test dell'unità (WEB API mvc 4)
- 29. Quadro di test di integrazione multi-lingua
- 30. Test Driven Development/Test di integrazione nello sviluppo di RIA
Very nice! Ora, se solo avesse funzionato per Oracle ... –
Per quanto ne so, 'TransactionScope' funziona con Oracle. È appositamente progettato per la comunicazione multi-server multi-vendor (commit a due fasi). – Steven
Ok e dopo aver eseguito repo.Save (someObject) nel test, come si controlla che l'oggetto sia stato salvato? –