當前位置:編程學習大全網 - 網絡軟體 - 如何:編寫在單個事務範圍內運行的數據庫單元測試

如何:編寫在單個事務範圍內運行的數據庫單元測試

如果您使用此方法,則可以在測試結束之後回滾在測試過程中執行的任何更改。下面的過程說明了具體的做法:在使用 BEGIN TRANSACTION 和ROLLBACK TRANSACTION 的Transact-SQL 測試腳本中創建事務。為某個測試類中的單個測試方法創建壹個事務。為給定測試類中的所有測試方法創建壹個事務。系統必備組件對於本主題中的某些過程,運行單元測試的計算機必須正在運行 Distributed Transaction Coordinator 服務。有關更多信息,請參見本主題末尾的過程。使用Transact-SQL 創建事務使用Transact-SQL 創建事務在數據庫單元測試設計器中打開單元測試。指定要創建事務的腳本類型。例如,可以指定預先測試、測試或後期測試。在Transact-SQL 編輯器中輸入測試腳本。插入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 如何與存儲過程和觸發器壹起使用的更多信息,請參見 Microsoft 網站上的 ROLLBACK TRANSACTION (Transact-SQL)。為單個測試方法創建事務在該示例中,在使用 TransactionScope 類型時,會使用環境事務。默認情況下,“執行連接”和“特權連接”將不使用環境事務,因為這些連接是在執行該方法之前創建的。SqlConnection 具有壹個 EnlistTransaction 方法,該方法將活動連接與某個事務相關聯。環境事務在創建之後會自行註冊為當前的事務,您可以通過 Current 屬性來訪問它。在該示例中,環境事務在釋放之後進行回滾。如果要提交在運行單元測試時進行的任何更改,則必須調用 Complete 方法。為單個測試方法創建事務在“解決方案資源管理器”中,右擊測試項目中的“引用”節點,然後單擊“添加引用”。將顯示"添加引用"對話框。單擊“.NET”選項卡。在程序集列表中,單擊“System.Transactions”,然後單擊“確定”。打開單元測試的 Visual Basic 或 C# 文件。包裝預先測試、測試和後期測試操作,如下面的 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 Microsoft.VisualStudio.TestTools.UnitTesting、Imports Microsoft.VisualStudio.TeamSystem.Data.UnitTesting 和Imports Microsoft.VisualStudio.TeamSystem.Data.UnitTest.Conditions,還必須添加 Imports System.Transactions。如果使用的是 Visual C#,則除了 Microsoft.VisualStudio.TestTools、Microsoft.VisualStudio.TeamSystem.Data.UnitTesting 和 Microsoft.VisualStudio.TeamSystem.Data.UnitTesting.Conditions 的 using 語句,還必須添加 using System.Transactions。還必須在這些程序集中添加對項目的引用。為某個測試類中的所有測試方法創建壹個事務為某個測試類中的所有測試方法創建壹個事務打開單元測試的 Visual Basic 或 C# 文件。在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); }啟動Distributed Transaction Coordinator 服務本主題中的某些過程使用 System.Transactions 程序集內的類型。在按照這些過程操作之前,必須確保要運行單元測試的計算機上正在運行 Distributed Transaction Coordinator 服務。否則,測試將失敗,並出現下面的錯誤消息:“測試方法 項目名稱.測試名稱.方法名稱 引發異常: System.Data.SqlClient.SqlException: 服務器‘計算機名稱’上的 MSDTC 不可用”。啟動Distributed Transaction Coordinator 服務打開“控制面板”。在“控制面板”中打開“管理工具”。在“管理工具”中打開“服務”。在“服務”窗格中,右擊 “Distributed Transaction Coordinator” 服務,再單擊“啟動”。該服務的狀態應當更新為“已啟動”。現在應當能夠運行那些使用 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 訪問 。

  • 上一篇:女孩子如何找到適合自己的穿衣風格?
  • 下一篇:各種醬菜的做法大全圖
  • copyright 2024編程學習大全網