Поделиться через


Практическое руководство. Создание модульного теста SQL Server, выполняемого в пределах области одной транзакции

Модульные тесты можно изменить для выполнения в пределах одной транзакции. Если вы используете этот подход, вы можете откатить все изменения, принятые тестом после завершения теста. В следующих процедурах объясняется, как:

  • Создайте транзакцию в тестовом скрипте Transact-SQL, использующего BEGIN TRANSACTION и ROLLBACK TRANSACTION.

  • Создайте транзакцию для одного метода теста в тестовом классе.

  • Создайте транзакцию для всех методов тестирования в заданном тестовом классе.

Требования

Для некоторых процедур в этом разделе служба координатора распределенных транзакций должна работать на компьютере, на котором выполняются модульные тесты. Дополнительные сведения см. в процедуре в конце этой темы.

Создание транзакции с помощью Transact-SQL

Создание транзакции с помощью Transact-SQL

  1. Откройте модульный тест в конструкторе модульных тестов SQL Server. (Дважды щелкните файл исходного кода для модульного теста, чтобы отобразить конструктор.)

  2. Укажите тип скрипта, для которого требуется создать транзакцию. Например, можно указать предварительный тест, тест или после тестирования.

  3. Введите тестовый скрипт в редакторе Transact-SQL.

  4. Вставьте инструкции BEGIN TRANSACTION и ROLLBACK TRANSACTION, как показано в этом простом примере. В примере используется таблица базы данных с именем OrderDetails и содержащая 50 строк данных:

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

    Заметка

    Вы не можете откатить транзакцию после выполнения инструкции COMMIT TRANSACTION.

    Дополнительные сведения о работе ROLLBACK TRANSACTION с хранимыми процедурами и триггерами см. на этой странице на веб-сайте Майкрософт: ROLLBACK TRANSACTION (Transact-SQL).

Создание транзакции для одного метода теста

В этом примере вы используете внешнюю транзакцию при использовании типа System.Transactions.TransactionScope. По умолчанию подключения Execution и Privileged не будут использовать внешнюю транзакцию, так как соединения были созданы перед выполнением метода. SqlConnection имеет метод System.Data.SqlClient.SqlConnection.EnlistTransaction, который связывает активное соединение с транзакцией. При создании околосредной транзакции она регистрируется как текущая транзакция, и вы можете получить доступ к ней через свойство System.Transactions.Transaction.Current. В этом примере транзакция откатывается при удалении внешней транзакции. Если вы хотите зафиксировать любые изменения, внесенные при запуске модульного теста, необходимо вызвать метод System.Transactions.TransactionScope.Complete.

Создание транзакции для одного метода теста

  1. В обозревателе решений щелкните правой кнопкой мыши узел ссылки на тестовый проект и щелкните добавить ссылку.

    Диалоговое окно Добавление ссылки появляется.

  2. Перейдите на вкладку .NET.

  3. В списке сборок щелкните System.Transactions и нажмите кнопку ОК.

  4. Откройте файл Visual Basic или C# для модульного теста.

  5. Оберните действия до теста, теста и после теста, как показано в следующем примере кода на Visual Basic:

    <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  
    

    Заметка

    Если вы используете Visual Basic, необходимо добавить Imports System.Transactions (помимо Imports Microsoft.VisualStudio.TestTools.UnitTesting, Imports Microsoft.VisualStudio.TeamSystem.Data.UnitTestingи Imports Microsoft.VisualStudio.TeamSystem.Data.UnitTest.Conditions) При использовании Visual C#необходимо добавить using System.Transactions (помимо инструкций using для Microsoft.VisualStudio.TestTools, Microsoft.VisualStudio.TeamSystem.Data.UnitTesting и Microsoft.VisualStudio.TeamTesting и Microsoft.VisualStudio.TeamSystem.Data.UnitTesting.Conditions). Необходимо также добавить ссылку на ваш проект в эти сборки.

Создание транзакции для всех методов тестирования в тестовом классе

Создание транзакции для всех методов тестирования в тестовом классе

  1. Откройте файл Visual Basic или C# для модульного теста.

  2. Создайте транзакцию в TestInitialize и удалите ее в TestCleanup, как показано в следующем примере кода 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);  
    
            }  
    

Запуск службы координатора распределенных транзакций

Некоторые процедуры в этом разделе используют типы в сборке System.Transactions. Перед выполнением этих процедур необходимо убедиться, что служба координатора распределенных транзакций выполняется на компьютере, на котором выполняются модульные тесты. В противном случае тесты завершаются ошибкой и отображается следующее сообщение об ошибке: "Метод тестирования Имя_проекта.TestName.MethodName вызвал исключение: System.Data.SqlClient.SqlException: MSDTC на сервере "ComputerName' недоступен".

Запуск службы координатора распределенных транзакций

  1. Откройте панель управления.

  2. В панели управленияоткройте Административные инструменты.

  3. В администрированиеоткройте службы .

  4. В области служб щелкните правой кнопкой мыши службу контроллера распределенных транзакций и щелкните Запустить.

    Статус услуги должен обновиться до Запущено. Теперь вы сможете запускать модульные тесты, использующие System.Transactions.

Важный

Может появиться следующая ошибка, даже если вы запустили службу распределенного контроллера транзакций: 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). Если появится эта ошибка, необходимо настроить контроллер распределенных транзакций для сетевого доступа. Дополнительные сведения см. в разделе Включение доступа к сети DTC.

См. также

создание и определение модульных тестов SQL Server