Cara: Menulis SQL Server Unit Test yang Berjalan dalam Cakupan Transaksi Tunggal
Anda dapat memodifikasi pengujian unit untuk berjalan dalam cakupan satu transaksi. Jika Anda mengambil pendekatan ini, Anda dapat mengembalikan perubahan apa pun yang diberlakukan pengujian setelah pengujian berakhir. Prosedur berikut menjelaskan cara:
Buat transaksi dalam skrip pengujian Transact-SQL Anda yang menggunakan BEGIN TRANSACTION dan ROLLBACK TRANSACTION.
Buat transaksi untuk satu metode pengujian di kelas pengujian.
Buat transaksi untuk semua metode pengujian di kelas pengujian tertentu.
Prasyarat
Untuk beberapa prosedur dalam topik ini, layanan Koordinator Transaksi Terdistribusi harus berjalan di komputer tempat Anda menjalankan pengujian unit. Untuk informasi selengkapnya, lihat prosedur di akhir topik ini.
Untuk membuat transaksi menggunakan Transact-SQL
Untuk membuat transaksi menggunakan Transact-SQL
Buka pengujian unit di SQL Server Unit Test Designer. (Klik dua kali file kode sumber untuk pengujian unit untuk menampilkan perancang.)
Tentukan jenis skrip yang ingin Anda buat transaksinya. Misalnya, Anda dapat menentukan pra-pengujian, pengujian, atau pasca-pengujian.
Masukkan skrip pengujian di editor Transact-SQL.
Sisipkan
BEGIN TRANSACTION
danROLLBACK TRANSACTION
pernyataan, seperti yang ditunjukkan dalam contoh sederhana ini. Contohnya menggunakan tabel database yang bernama OrderDetails dan yang berisi 50 baris data:BEGIN TRANSACTION TestTransaction UPDATE "OrderDetails" set Quantity = Quantity + 10 IF @@ROWCOUNT!=50 RAISERROR('Row count does not equal 50',16,1) ROLLBACK TRANSACTION TestTransaction
Catatan
Anda tidak dapat mengembalikan transaksi setelah pernyataan COMMIT TRANSACTION dijalankan.
Untuk informasi selengkapnya tentang cara kerja ROLLBACK TRANSACTION dengan prosedur dan pemicu tersimpan, lihat halaman ini di situs Web Microsoft: ROLLBACK TRANSACTION (Transact-SQL).
Untuk membuat transaksi untuk satu metode pengujian
Dalam contoh ini, Anda menggunakan transaksi sekitar saat menggunakan jenis System.Transactions.TransactionScope . Secara default, koneksi Eksekusi dan Hak Istimewa tidak akan menggunakan transaksi sekitar, karena koneksi dibuat sebelum metode dijalankan. SqlConnection memiliki metode System.Data.SqlClient.SqlConnection.EnlistTransaction , yang mengaitkan koneksi aktif dengan transaksi. Ketika transaksi sekitar dibuat, ia mendaftarkan dirinya sebagai transaksi saat ini, dan Anda dapat mengaksesnya melalui properti System.Transactions.Transaction.Current . Dalam contoh ini, transaksi digulung balik ketika transaksi sekitar dibuang. Jika Anda ingin melakukan perubahan apa pun yang dilakukan saat menjalankan pengujian unit, Anda harus memanggil metode System.Transactions.TransactionScope.Complete .
Untuk membuat transaksi untuk satu metode pengujian
Di Penjelajah Solusi, klik kanan simpul Referensi di proyek pengujian Anda dan klik Tambahkan Referensi.
Kotak dialog Add Reference muncul.
Klik tab .NET .
Dalam daftar rakitan, klik System.Transactions lalu klik OK.
Buka file Visual Basic atau C# untuk pengujian unit Anda.
Bungkus tindakan pra-pengujian, pengujian, dan pasca-pengujian seperti yang ditunjukkan dalam contoh kode Visual Basic berikut:
<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
Catatan
Jika Anda menggunakan Visual Basic, Anda harus menambahkan
Imports System.Transactions
(selainImports Microsoft.VisualStudio.TestTools.UnitTesting
, ,Imports Microsoft.VisualStudio.TeamSystem.Data.UnitTesting
danImports Microsoft.VisualStudio.TeamSystem.Data.UnitTest.Conditions
) Jika Anda menggunakan Visual C#, Anda harus menambahkanusing System.Transactions
(selainusing
pernyataan untuk Microsoft.VisualStudio.TestTools, Microsoft.VisualStudio.TeamSystem.Data.UnitTesting, dan Microsoft.VisualStudio.TeamSystem.Data.UnitTesting.Condition). Anda juga harus menambahkan referensi ke proyek Anda ke rakitan tersebut.
Untuk membuat transaksi untuk semua metode pengujian di kelas pengujian
Untuk membuat transaksi untuk semua metode pengujian di kelas pengujian
Buka file Visual Basic atau C# untuk pengujian unit Anda.
Buat transaksi di TestInitialize, dan buang di TestCleanup, seperti yang ditunjukkan dalam contoh kode Visual C# berikut:
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); }
Untuk memulai layanan Koordinator Transaksi Terdistribusi
Beberapa prosedur dalam topik ini menggunakan jenis dalam rakitan System.Transactions. Sebelum mengikuti prosedur ini, Anda harus memastikan bahwa layanan Koordinator Transaksi Terdistribusi berjalan di komputer tempat Anda menjalankan pengujian unit. Jika tidak, pengujian gagal, dan pesan kesalahan berikut muncul: "Metode uji ProjectName. TestName. MethodName melemparkan pengecualian: System.Data.SqlClient.SqlException: MSDTC di server 'ComputerName' tidak tersedia".
Untuk memulai layanan Koordinator Transaksi Terdistribusi
Buka Panel Kontrol.
Di Panel Kontrol, buka Alat Administratif.
Di Alat Administratif, buka Layanan.
Di panel Layanan , klik kanan layanan Pengontrol Transaksi Terdistribusi , dan klik Mulai.
Status layanan harus diperbarui ke Dimulai. Anda sekarang dapat menjalankan pengujian unit yang menggunakan System.Transactions.
Penting
Kesalahan berikut mungkin muncul, bahkan jika Anda telah memulai layanan Pengontrol Transaksi Terdistribusi: 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)
. Jika kesalahan ini muncul, Anda harus mengonfigurasi Pengontrol Transaksi Terdistribusi untuk akses jaringan. Untuk informasi selengkapnya, lihat Mengaktifkan Akses DTC Jaringan.