Como: Escrever um teste de unidade de banco de dados é executado dentro do escopo de uma única transação
Você pode modificar testes de unidade para executar dentro do escopo de uma única transação.Se você adotar essa abordagem, você pode reverter qualquer alteração que o teste ativado após o teste termina.Os procedimentos a seguir explicam como:
Criar uma transação no seu script de teste de Transact-SQL (T-SQL) que usa BEGIN TRANSACTION e ROLLBACK TRANSACTION.
criar uma transação para um único método de teste em uma classe de teste.
criar uma transação para todos os métodos de teste em uma classe de teste determinado.
Pré-requisitos
Para alguns procedimentos neste tópico, o serviço Coordenador de transação distribuída deve estar em execução no computador em que você executar testes de unidade.Para obter mais informações, consulte o procedimento no participante deste tópico.
Para criar uma transação usando T-SQL
Para criar uma transação usando T-SQL
em aberto um teste de unidade no criador de teste de unidade de banco de dados.
Especifique o tipo de script para o qual você deseja criar a transação.Por exemplo, você pode especificar pre-teste, testar ou post-teste.
Inserir um script de teste no editor de T-SQL.
Inserir BEGIN TRANSACTION e ROLLBACK TRANSACTION instruções, sistema autônomo mostrado no exemplo desta simples. O exemplo usa a tabela do banco de dados Northwind, que contém 50 linhas de dados:
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
Observação: Não é possível reverter uma transação depois que uma demonstrativo confirmar TRANSACTION for executada.
Para obter mais informações sobre como funciona o reversão transação com procedimentos armazenados e disparadores, consulte "reversão transação (Transact-SQL)" noSite da Microsoft.
Para criar uma transação para um único método de teste
Neste exemplo, você estiver usando uma transação de ambiente quando você usar o TransactionScope Digite. Por padrão, as conexões privilegiados e execução não usará a transação de ambiente, porque as conexões foram criadas antes que o método seja executado.SqlConnection possui um EnlistTransaction método, que associa uma conexão ativo com uma transação. Quando uma transação de ambiente é criada, ele se registra sistema autônomo a transação corrente e você pode acessá-lo por meio de Current propriedade. Neste exemplo, a transação é recuperada partilhada quando a transação ambiente é descartada.Se você deseja confirmar quaisquer alterações feitas ao executar o teste de unidade, você deve chamar o Complete método.
Para criar uma transação para um único método de teste
Abra o Visual Basic ou arquivo translation from VPE for Csharp para seu teste de unidade.
Quebrar o pre-test, teste e ações post-test conforme mostrado no seguinte Visual Basic exemplo de código:
<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
Observação: Se você estiver usando Visual Basic, você deve adicionar Imports System.Transactions (juntamente com Imports Microsoft.VisualStudio.TestTools.UnitTesting, Imports Microsoft.VisualStudio.TeamSystem.Data.UnitTesting, e Imports Microsoft.VisualStudio.TeamSystem.Data.UnitTest.Conditions). Se você estiver usando translation from VPE for Csharp Visual, você deve adicionar using System.Transactions (além de using instruções para Microsoft.VisualStudio.TestTools, Microsoft.VisualStudio.TeamSystem.dados.UnitTesting e Microsoft.VisualStudio.TeamSystem.dados.UnitTesting.Conditions). Você também deve adicionar uma referência ao seu projeto para os módulos (assemblies).
Para criar uma transação para todos os métodos de teste em uma classe de teste
Para criar uma transação para todos os métodos de teste em uma classe de teste
Abra o Visual Basic ou arquivo translation from VPE for Csharp para seu teste de unidade.
Crie a transação no TestInitialize e dispose no TestCleanup, sistema autônomo neste exemplo de código a seguir translation from VPE for Csharp Visual:
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); }
Para iniciar o serviço Coordenador transação distribuída
Alguns procedimentos neste tópico usam tipos no assembly sistema.Transactions.Antes de seguir esses procedimentos, faça-se de que o serviço Coordenador de transações distribuídas esteja sendo executado no computador em que você executa os testes de unidade.Caso contrário, os testes falharem e a seguinte mensagem de erro aparece: "O método de testeProjectName.Nome.MethodName emitiu uma exceção: sistema.dados.SqlClient.SqlException: MSDTC no servidor ' NomeDoComputador ' não disponível ".
Para iniciar o serviço Coordenador transação distribuída
em aberto Painel de controle.
In Painel de controle, em aberto Ferramentas administrativas.
In Ferramentas administrativas, em aberto Serviços.
No Serviços painel, clicar com o botão direito do mouse o Coordenador de transações distribuídas serviço e clique em Iniciar.
O status do serviço deve atualizar para Iniciado.Agora você deve conseguir executar testes de unidade que usam o sistema.Transactions.