Compartilhar via


Como: Escrever um teste de unidade de banco de dados é executado dentro do escopo de uma única transação.

Este tópico se aplica a:

Visual Studio Ultimate

Visual Studio Premium

Visual Studio 2010 Professional 

Visual StudioExpress

O tópico é aplicável O tópico é aplicável O tópico não é aplicável O tópico não é aplicável

Você pode modificar os 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 aprovado após o teste termina. Os procedimentos a seguintes explicam como:

  • Criar uma transação em seu Transact-SQL testar o script que usa BEGIN TRANSACTION e ROLLBACK TRANSACTION.

  • Crie uma transação para um único método de teste em uma classe de teste.

  • Crie uma transação para todos os métodos de teste em uma classe de determinado teste.

Pré-requisitos

Para alguns procedimentos neste tópico, o serviço Coordenador de transações distribuídas deve estar executando no computador no qual você executa testes de unidade. Para obter mais informações, consulte o procedimento no final deste tópico.

Para criar uma transação usando o Transact-SQL

Para criar uma transação usando o Transact-SQL

  1. Abra 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 de pré-teste, testar ou pós-teste.

  3. Insira um script de teste no Transact-SQL editor.

  4. Inserir BEGIN TRANSACTION e ROLLBACK TRANSACTION instruções, como mostrado neste exemplo simples. O exemplo usa uma tabela de banco de dados chamado OrderDetails e que contenha 50 linhas de dados:

    BEGIN TRANSACTION TestTransaction
    UPDATE "OrderDetails" set Quantity = Quantity + 10
    IF @@ROWCOUNT!=50
    RAISERROR('Row count does not equal 50',16,1)
    ROLLBACK TRANSACTION TestTransaction
    
    ObservaçãoObservação

    Não é possível reverter uma transação após uma instrução COMMIT TRANSACTION ser executada.

    Para obter mais informações sobre como funciona a transação de REVERSÃO com procedimentos armazenados e disparadores, consulte esta página no site da Microsoft: A transação de REVERSÃO (Transact-SQL).

Para criar uma transação para um único método de teste

Neste exemplo, você estiver usando uma transação de ambiente quando você usa o TransactionScope tipo. Por padrão, as conexões privilegiadas e execução não usará a transação de ambiente, pois as conexões foram criadas antes do método é executado. SqlConnection tem um EnlistTransaction método, que associa uma conexão ativa com a transação. Quando uma transação de ambiente é criada, ele se registra como a transação atual e você pode acessá-lo por meio de Current propriedade. Neste exemplo, a transação é revertida à transação de ambiente é descartada. Se você deseja confirmar as alterações que foram feitas quando você executou o teste de unidade, você deve chamar o Complete método.

Para criar uma transação para um único método de teste

  1. Em Solution Explorer, com o botão direito do referências o nó no seu projeto de teste e clique em Add Reference.

    O Add Reference caixa de diálogo aparece.

  2. Clique na .NET guia.

  3. Na lista de módulos (assemblies), clique em System. Transactions e, em seguida, clique em OK.

  4. Abrir o Visual Basic ou C# o arquivo para o seu Test de unidade.

  5. Quebrar o pré-teste, o teste e ações de pós-teste, conforme mostrado no exemplo a seguir Visual Basic o 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çãoObservação

    Se você estiver usando Visual Basic, você deve adicionar Imports System.Transactions (além dos Imports Microsoft.VisualStudio.TestTools.UnitTesting, Imports Microsoft.VisualStudio.TeamSystem.Data.UnitTesting, e Imports Microsoft.VisualStudio.TeamSystem.Data.UnitTest.Conditions). Se você estiver usando Visual C#, você deve adicionar using System.Transactions (além de using instruções para Microsoft.VisualStudio.TestTools, Microsoft.VisualStudio.TeamSystem.Data.UnitTesting e Microsoft.VisualStudio.TeamSystem.Data.UnitTesting.Conditions). Você também deve adicionar uma referência ao seu projeto para esses módulos.

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. Abrir o Visual Basic ou C# o arquivo para o seu Test de unidade.

  2. Cria a transação TestInitialize e descarte-no TestCleanup, conforme mostrado no seguinte exemplo de código Visual C#:

    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 de transações distribuídas

Alguns procedimentos neste tópico usam tipos no assembly System. Transactions. Antes de seguir estes procedimentos, você deve verificar que o serviço Coordenador de transações distribuídas está sendo executado no computador onde você executa os testes de unidade. Caso contrário, os testes falham e a seguinte mensagem de erro aparece: "Testar o método ProjectName.TestName.MethodName gerou exceção: System.Data.SqlClient.SqlException: O MSDTC no servidor 'NomeDoComputador' não está disponível".

Para iniciar o serviço Coordenador de transações distribuídas

  1. Abrir o painel de controle.

  2. Em O painel de controle, abra Ferramentas administrativas.

  3. Em Ferramentas administrativas, abra serviços.

  4. No serviços painel, com o botão direito do Controlador de transação distribuída de serviço e, em seguida, clique em Iniciar.

    O status do serviço deve atualizar para Started. Você agora deve ser capaz de executar testes de unidade, usam System. Transactions.

Observação importanteImportante

O seguinte erro pode aparecer, mesmo se você tiver iniciado o serviço de controlador de transação distribuída: 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 este erro for exibida, você deve configurar o controlador de transação distribuída para acesso à rede. Para obter mais informações, consulte Ativar acesso ao DTC de rede.