Bagikan melalui


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

  1. Buka pengujian unit di SQL Server Unit Test Designer. (Klik dua kali file kode sumber untuk pengujian unit untuk menampilkan perancang.)

  2. Tentukan jenis skrip yang ingin Anda buat transaksinya. Misalnya, Anda dapat menentukan pra-pengujian, pengujian, atau pasca-pengujian.

  3. Masukkan skrip pengujian di editor Transact-SQL.

  4. Sisipkan BEGIN TRANSACTION dan ROLLBACK 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

  1. Di Penjelajah Solusi, klik kanan simpul Referensi di proyek pengujian Anda dan klik Tambahkan Referensi.

    Kotak dialog Add Reference muncul.

  2. Klik tab .NET .

  3. Dalam daftar rakitan, klik System.Transactions lalu klik OK.

  4. Buka file Visual Basic atau C# untuk pengujian unit Anda.

  5. 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 (selain Imports Microsoft.VisualStudio.TestTools.UnitTesting, , Imports Microsoft.VisualStudio.TeamSystem.Data.UnitTestingdan Imports Microsoft.VisualStudio.TeamSystem.Data.UnitTest.Conditions) Jika Anda menggunakan Visual C#, Anda harus menambahkan using System.Transactions (selain using 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

  1. Buka file Visual Basic atau C# untuk pengujian unit Anda.

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

  1. Buka Panel Kontrol.

  2. Di Panel Kontrol, buka Alat Administratif.

  3. Di Alat Administratif, buka Layanan.

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

Lihat juga

Membuat dan Menentukan Pengujian Unit SQL Server