Compartilhar via


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

  1. em aberto um teste de unidade no criador de teste de unidade de banco de dados.

  2. 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.

  3. Inserir um script de teste no editor de T-SQL.

  4. 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

  1. Abra o Visual Basic ou arquivo translation from VPE for Csharp para seu teste de unidade.

  2. 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

  1. Abra o Visual Basic ou arquivo translation from VPE for Csharp para seu teste de unidade.

  2. 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

  1. em aberto Painel de controle.

  2. In Painel de controle, em aberto Ferramentas administrativas.

  3. In Ferramentas administrativas, em aberto Serviços.

  4. 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.