Procedura: scrivere uno unit test del database da eseguire nell'ambito di una singola transazione
Aggiornamento: novembre 2007
È possibile modificare gli unit test per eseguirli nell'ambito di una singola transazione. In questo modo è possibile eseguire il rollback delle modifiche apportate dopo l'esecuzione del test. Di seguito vengono illustrate le procedure seguenti:
Creare una transazione nello script di test T-SQL (Transact-SQL) in cui si utilizzano le istruzioni BEGIN TRANSACTION e ROLLBACK TRANSACTION.
Creare una transazione per un singolo metodo di test in una classe di test.
Creare una transazione per tutti i metodi di test in una determinata classe di test.
Prerequisiti
Per alcune procedure in questo argomento, il servizio Distributed Transaction Coordinator deve essere in esecuzione sul computer sul quale si eseguono gli unit test. Per ulteriori informazioni, vedere la procedura alla fine di questo argomento.
Per creare una transazione mediante T-SQL
Per creare una transazione mediante T-SQL
Aprire uno unit test nella finestra di progettazione unit test del database.
Specificare il tipo di script per il quale creare la transazione. È ad esempio possibile specificare uno script di pre-test, di test o di post-test.
Immettere uno script di test nell'editor T-SQL.
Inserire le istruzioni BEGIN TRANSACTION e ROLLBACK TRANSACTION, come illustrato in questo semplice esempio. Nell'esempio viene utilizzata la tabella del database Northwind, che contiene 50 righe di dati:
BEGIN TRANSACTION TestTransaction UPDATE "Order Details" set Quantity = Quantity + 10 IF @@ROWCOUNT!=50 RAISERROR('Row count does not equal 50',16,1) ROLLBACK TRANSACTION TestTransaction
Nota: Non è possibile ripristinare lo stato precedente di una transazione dopo l'esecuzione di un'istruzione COMMIT TRANSACTION.
Per ulteriori informazioni sul funzionamento dell'istruzione ROLLBACK TRANSACTION con stored procedure e trigger, vedere "ROLLBACK TRANSACTION (Transact-SQL)" sul sito Web Microsoft
Per creare una transazione per un singolo metodo di test
In questo esempio, viene utilizzata una transazione di ambiente quando si utilizza il tipo TransactionScope. Per impostazione predefinita, le connessioni privilegiate e di esecuzione non utilizzeranno la transazione di ambiente, poiché le connessioni sono state create prima che il metodo venisse eseguito. SqlConnection ha un metodo EnlistTransaction che associa una connessione attiva a una transazione. Quando viene creata una transazione di ambiente, si registra come transazione corrente ed è possibile accedervi tramite la proprietà Current. In questo esempio, la transazione viene ripristinata quando la transazione di ambiente viene eliminata. Per eseguire il commit delle modifiche effettuate durante l’esecuzione dello unit test, è necessario chiamare il metodo Complete.
Per creare una transazione per un singolo metodo di test
Aprire il file Visual Basic o C# per lo unit test.
Incapsulare le azioni di pre-test, di test e di post-test come illustrato nell'esempio di codice Visual Basic seguente:
<TestMethod()> _ Public Sub dbo_InsertTable1Test() Using ts as New System.Transactions.TransactionScope( System.Transactions.TransactionScopeOption.Required) ExecutionContext.Connection.EnlistTransaction(Transaction.Current) PrivilegedContext.Connection.EnlistTransaction(Transaction.Current) Dim testActions As DatabaseTestActions = Me.dbo_InsertTable1TestData 'Execute the pre-test script ' System.Diagnostics.Trace.WriteLineIf((Not (testActions.PretestAction) Is Nothing), "Executing pre-test script...") Dim pretestResults() As ExecutionResult = TestService.Execute(Me.PrivilegedContext, Me.PrivilegedContext, testActions.PretestAction) 'Execute the test script System.Diagnostics.Trace.WriteLineIf((Not (testActions.TestAction) Is Nothing), "Executing test script...") Dim testResults() As ExecutionResult = TestService.Execute(ExecutionContext, Me.PrivilegedContext, testActions.TestAction) 'Execute the post-test script ' System.Diagnostics.Trace.WriteLineIf((Not (testActions.PosttestAction) Is Nothing), "Executing post-test script...") Dim posttestResults() As ExecutionResult = TestService.Execute(Me.PrivilegedContext, Me.PrivilegedContext, testActions.PosttestAction) 'Because the transaction is not explicitly committed, it 'is rolled back when the ambient transaction is 'disposed. 'To commit the transaction, remove the comment delimiter 'from the following statement: 'ts.Complete() End Sub Private dbo_InsertTable1TestData As DatabaseTestActions
Nota: Se si utilizza Visual Basic, è necessario aggiungere Imports System.Transactions, oltre a Imports Microsoft.VisualStudio.TestTools.UnitTesting, Imports Microsoft.VisualStudio.TeamSystem.Data.UnitTesting e Imports Microsoft.VisualStudio.TeamSystem.Data.UnitTest.Conditions. Se si utilizza Visual C#, è necessario aggiungere using System.Transactions, oltre alle istruzioni using per Microsoft.VisualStudio.TestTools, Microsoft.VisualStudio.TeamSystem.Data.UnitTesting e Microsoft.VisualStudio.TeamSystem.Data.UnitTesting.Conditions. È inoltre necessario aggiungere a tali assembly un riferimento al progetto.
Per creare una transazione per tutti i metodi di test in una classe di test
Per creare una transazione per tutti i metodi di test in una classe di test
Aprire il file Visual Basic o C# per lo unit test.
Creare la transazione in TestInitialize ed eliminarla in TestCleanup, come illustrato nell'esempio di codice Visual C# seguente:
TransactionScope _trans; [TestInitialize()] public void Init() { _trans = new TransactionScope(); base.InitializeTest(); } [TestCleanup()] public void Cleanup() { base.CleanupTest(); _trans.Dispose(); } [TestMethod()] public void TransactedTest() { DatabaseTestActions testActions = this.DatabaseTestMethod1Data; // Execute the pre-test script // System.Diagnostics.Trace.WriteLineIf((testActions.PretestAction != null), "Executing pre-test script..."); ExecutionResult[] pretestResults = TestService.Execute(this.PrivilegedContext, this.PrivilegedContext, testActions.PretestAction); // Execute the test script // System.Diagnostics.Trace.WriteLineIf((testActions.TestAction != null), "Executing test script..."); ExecutionResult[] testResults = TestService.Execute(this.ExecutionContext, this.PrivilegedContext, testActions.TestAction); // Execute the post-test script // System.Diagnostics.Trace.WriteLineIf((testActions.PosttestAction != null), "Executing post-test script..."); ExecutionResult[] posttestResults = TestService.Execute(this.PrivilegedContext, this.PrivilegedContext, testActions.PosttestAction); }
Per avviare il servizio Distributed Transaction Coordinator
Alcune procedure in questo argomento utilizzano i tipi contenuti nell'assembly System.Transactions. Prima di eseguire queste procedure, è necessario assicurarsi che il servizio Distributed Transaction Coordinator sia in esecuzione sul computer dove si eseguono gli unit test. In caso contrario, i test avranno esito negativo e verrà visualizzato il seguente messaggio di errore: "Metodo di test NomeProgetto.NomeTest.NomeMetodo ha generato l’eccezione: System.Data.SqlClient.SqlException: MSDTC sul server 'NomeComputer' non è disponible".
Per avviare il servizio Distributed Transaction Coordinator
Aprire il Pannello di controllo.
Aprire Strumenti di amministrazione nel Pannello di controllo.
In Strumenti di amministrazione aprire Servizi.
Nel riquadro Servizi fare clic con il pulsante destro del mouse su Distributed Transaction Coordinator e scegliere Avvia.
Lo stato del servizio verrà aggiornato ad Avviato. Sarà ora possibile eseguire unit test con System.Transactions.