martedì 16 febbraio 2010

Unit test del Data Layer con TransactionScope

Nel momento in cui si deve eseguire uno Unit Test per testare il funzionamento delle classi per l'accesso ai dati, si possono percorrere due strade:

- la prima è quella di utilizzare un database di test che risiede completamente in memoria, come ad esempio SqlLite, un ottimo motore SQL che possiede appunto la caratteristica di poter girare senza installazioni e senza file fisici. Ovviamente il vantaggio di questa soluzione è che ad ogni avvio dei nostri test, abbiamo sempre a disposizione un database pulito. Per inciso, ricordo che Nhibernate possiede una comoda funzionalità di generazione degli script per la creazione dello schema del database a partire dal file di mapping.

- la seconda è quella invece di utilizzare un vero e proprio database di test.

Nonostante sia preferibile la prima soluzione, in alcuni casi questa è una strada difficilmente percorribile, ad esempio quando si utlizzano tipi di dati che non sono supportati in SqlLite.

Utilizzando un database di test, è necessario però garantire che tutte le operazioni che vengono eseguite sul database durante i test, debbano essere ripristinate al loro termine.
A tal fine torna molto utile l'utilizzo della classe TransactionScope (assembly System.Transaction), che ci garantisce che tutti comandi lanciati sul database siano contenuti all'interno di una transazione del quale verrà invocato il RollBack al termine dei test.

Nell'esempio utilizzo NUnit come framework per lo unit test, ma il concetto è valido ovviamente per tutti i framework.

        protected TransactionScope _transactionScope;

        [SetUp]
        public void Setup()
        {
            _transactionScope = new TransactionScope();
        }

        [TearDown]
        public void TearDown()
        {
            _transactionScope.Dispose();
        }

Se questo codice lo inseriamo in una classe base che tutte le classi di test devono estendere, ecco che abbiamo un sistema sicuro per eseguire i nostri test delle classi del Data Layer

Nessun commento:

Posta un commento