Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
È possibile modificare gli unit test per l'esecuzione nell'ambito di una singola transazione. Se si adotta questo approccio, è possibile eseguire il rollback di tutte le modifiche applicate dal test al termine del test. Le procedure seguenti illustrano come:
Creare una transazione nello script di test Transact-SQL che usa 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 descritte in questo argomento, il servizio Distributed Transaction Coordinator deve essere in esecuzione nel computer in cui si eseguono unit test. Per altre informazioni, vedere la procedura alla fine di questo argomento.
Per creare una transazione utilizzando Transact-SQL
Per creare una transazione utilizzando Transact-SQL
Aprire uno unit test nella finestra di progettazione unit test di SQL Server. Fare doppio clic sul file di codice sorgente per lo unit test per visualizzare la finestra di progettazione.
Specificare il tipo di script per cui si vuole creare la transazione. Ad esempio, è possibile specificare pre-test, test o post-test.
Immettere uno script di test nell'editor Transact-SQL.
Inserire le istruzioni
BEGIN TRANSACTION
eROLLBACK TRANSACTION
, come illustrato in questo semplice esempio. Nell'esempio viene utilizzata una tabella di database denominata OrderDetails e che contiene 50 righe di dati:BEGIN TRANSACTION TestTransaction UPDATE "OrderDetails" set Quantity = Quantity + 10 IF @@ROWCOUNT!=50 RAISERROR('Row count does not equal 50',16,1) ROLLBACK TRANSACTION TestTransaction
Nota
Non è possibile eseguire il rollback di una transazione dopo l'esecuzione di un'istruzione COMMIT TRANSACTION.
Per altre informazioni sul funzionamento di ROLLBACK TRANSACTION con stored procedure e trigger, consultare questa pagina sul sito Web di Microsoft: ROLLBACK TRANSACTION (Transact-SQL).
Per creare una transazione per un singolo metodo di test
In questo esempio, si utilizza una transazione ambientale quando si usa il tipo System.Transactions.TransactionScope. Per impostazione predefinita, le connessioni execution e privileged non useranno la transazione di ambiente, perché le connessioni sono state create prima dell'esecuzione del metodo. SqlConnection dispone di un metodo System.Data.SqlClient.SqlConnection.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à System.Transactions.Transaction.Current. In questo esempio, viene eseguito il rollback della transazione quando la transazione ambientale viene eliminata. Se si desidera eseguire il commit di tutte le modifiche apportate durante l'esecuzione dello unit test, è necessario chiamare il metodo System.Transactions.TransactionScope.Complete.
Per creare una transazione per un singolo metodo di test
In Esplora soluzioni, fare clic con il pulsante destro del mouse sul nodo Riferimenti nel Progetto di test e scegliere Aggiungi riferimento.
Viene visualizzata la finestra di dialogo Aggiungi riferimento.
Fare clic sulla scheda .NET.
Nell'elenco degli assembly, fare clic su System.Transactions e quindi su OK.
Aprire il file Visual Basic o C# per lo unit test.
Eseguire il wrapping delle azioni di pre-test, test e 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 usa Visual Basic, è necessario aggiungere
Imports System.Transactions
(oltre aImports Microsoft.VisualStudio.TestTools.UnitTesting
,Imports Microsoft.VisualStudio.TeamSystem.Data.UnitTesting
eImports Microsoft.VisualStudio.TeamSystem.Data.UnitTest.Conditions
) Se si usa Visual C#, è necessario aggiungereusing System.Transactions
(oltre alle istruzioniusing
per Microsoft.VisualStudio.TestTools, Microsoft.VisualStudio.TeamSystem.Data.UnitTesting e Microsoft.VisualStudio.TeamSystem.TeamSystem.Data.UnitTesting.Conditions). È anche necessario aggiungere un riferimento al progetto a tali assembly.
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 usano tipi nell'assembly System.Transactions. Prima di seguire queste procedure, è necessario assicurarsi che il servizio Distributed Transaction Coordinator sia in esecuzione nel computer in cui vengono eseguiti gli unit test. In caso contrario, i test hanno esito negativo e viene visualizzato il messaggio di errore seguente: "Metodo di test ProjectName.TestName.NomeMetodo ha generato un'eccezione: System.Data.SqlClient.SqlException: MSDTC nel server 'NomeComputer' non è disponibile".
Per avviare il servizio Distributed Transaction Coordinator
Apri Pannello di controllo.
In Pannello di controllo, apri Strumenti di amministrazione.
In Strumenti di amministrazione, aprire Servizi.
Nel riquadro Servizi, fare clic con il pulsante destro del mouse sul servizio Distributed Transaction Controller e fare clic su Start.
Lo stato del servizio deve essere aggiornato a Avviato. A questo momento dovrebbe essere possibile eseguire unit test che usano System.Transactions.
Importante
Potrebbe essere visualizzato l'errore seguente, anche se è stato avviato il servizio Distributed Transaction Controller: System.Transactions.TransactionManagerCommunicationException: Network access for Distributed Transaction Manager (MSDTC) has been disabled. Please enable DTC for network access in the security configuration for MSDTC using the Component Services Administrative tool. ---> System.Runtime.InteropServices.COMException: The transaction manager has disabled its support for remote/network transactions. (Exception from HRESULT: 0x8004D024)
. Se viene visualizzato questo errore, è necessario configurare Distributed Transaction Controller per l'accesso alla rete. Per ulteriori informazioni, vedere Abilitare l'accesso DTC di rete.