Vorgehensweise: Schreiben eines SQL Server-Komponententests, der im Gültigkeitsbereich einer einzelnen Transaktion ausgeführt wird

 

Sie können Komponententests so anpassen, dass sie im Gültigkeitsbereich einer einzelnen Transaktion ausgeführt werden.Bei diesem Ansatz können Sie für alle vom Test durchgeführten Änderungen ein Rollback ausführen, nachdem der Test beendet wurde.Die Vorgehensweise wird in folgenden Verfahren erläutert:

  • Erstellen einer Transaktion in einem Transact-SQL-Testskript, das BEGIN TRANSACTION und ROLLBACK TRANSACTION verwendet

  • Erstellen einer Transaktion für eine einzelne Testmethode in einer Testklasse

  • Erstellen einer Transaktion für alle Testmethoden in einer bestimmten Testklasse

Erforderliche Komponenten

Bei einigen Verfahren in diesem Thema muss der Distributed Transaction Coordinator-Dienst auf dem Computer ausgeführt werden, auf dem die Komponententests ausgeführt werden.Weitere Informationen finden Sie im Verfahren am Ende dieses Themas.

So erstellen Sie eine Transaktion mit Transact-SQL

So erstellen Sie eine Transaktion mit Transact-SQL

  1. Öffnen Sie einen Komponententest im SQL Server-Komponententest-Designer.(Doppelklicken Sie auf die Quellcodedatei des Komponententests, um den Designer anzuzeigen.)

  2. Geben Sie den Typ des Skripts an, für das Sie die Transaktion erstellen möchten.Sie können z. B. einen Vortest, Test oder Nachtest angeben.

  3. Geben Sie ein Testskript im Transact-SQL-Editor ein.

  4. Fügen Sie eine BEGIN TRANSACTION-Anweisung und eine ROLLBACK TRANSACTION-Anweisung ein, wie in diesem einfachen Beispiel veranschaulicht.Im Beispiel wird eine Datenbanktabelle mit dem Namen "OrderDetails" und 50 Datenzeilen verwendet:

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

    Hinweis

    Für eine Transaktion kann kein Rollback ausgeführt werden, nachdem eine COMMIT TRANSACTION-Anweisung ausgeführt wurde.

    Weitere Informationen zur Funktionsweise von ROLLBACK TRANSACTION mit gespeicherten Prozeduren und Triggern finden Sie auf der folgenden Seite auf der Microsoft-Website: ROLLBACK TRANSACTION (Transact-SQL).

So erstellen Sie eine Transaktion für eine einzelne Testmethode

In diesem Beispiel verwenden Sie zusammen mit dem TransactionScope-Typ eine Ambient-Transaktion.Für Verbindungen im Ausführungs- oder privilegierten Kontext wird die Ambient-Transaktion standardmäßig nicht verwendet, da die Verbindungen erstellt wurden, bevor die Methode ausgeführt wird.SqlConnection verfügt über eine EnlistTransaction-Methode, durch die einer aktiven Verbindung eine Transaktion zugeordnet wird.Beim Erstellen einer Ambient-Transaktion wird diese als aktuelle Transaktion registriert. Mithilfe der Current-Eigenschaft können Sie auf die Transaktion zugreifen.In diesem Beispiel wird für die Transaktion ein Rollback ausgeführt, sobald die Ambient-Transaktion verworfen wird.Um für Änderungen bei der Ausführung des Komponententests ein Commit auszuführen, rufen Sie die Complete-Methode auf.

So erstellen Sie eine Transaktion für eine einzelne Testmethode

  1. Klicken Sie im Projektmappen-Explorer im Testprojekt mit der rechten Maustaste auf den Knoten Verweise, und klicken Sie auf Verweis hinzufügen.

    Das Dialogfeld Verweis hinzufügen wird angezeigt.

  2. Klicken Sie auf die Registerkarte .NET.

  3. Klicken Sie in der Assemblyliste erst auf System.Transactions und dann auf OK.

  4. Öffnen Sie die Visual Basic- oder C#-Datei für den Komponententest.

  5. Umschließen Sie die Vortest-, Test- und Nachtestaktionen, wie im folgenden Visual Basic-Codebeispiel gezeigt:

    <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
    

    Hinweis

    Bei Verwendung von Visual Basic müssen Sie (neben Imports Microsoft.VisualStudio.TestTools.UnitTesting, Imports Microsoft.VisualStudio.TeamSystem.Data.UnitTesting und Imports Microsoft.VisualStudio.TeamSystem.Data.UnitTest.Conditions) Imports System.Transactions hinzufügen. Bei Verwendung von Visual C# müssen Sie (neben den using-Anweisungen für Microsoft.VisualStudio.TestTools, Microsoft.VisualStudio.TeamSystem.Data.UnitTesting und Microsoft.VisualStudio.TeamSystem.Data.UnitTesting.Conditions) using System.Transactions hinzufügen.Außerdem müssen Sie diesen Assemblys einen Verweis auf das Projekt hinzufügen.

So erstellen Sie eine Transaktion für alle Testmethoden in einer Testklasse

So erstellen Sie eine Transaktion für alle Testmethoden in einer Testklasse

  1. Öffnen Sie die Visual Basic- oder C#-Datei für den Komponententest.

  2. Erstellen Sie die Transaktion in „TestInitialize“, und verwerfen Sie sie in „TestCleanup“, wie im folgenden Visual C#-Codebeispiel gezeigt:

    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);
    
            }
    

So starten Sie den Distributed Transaction Coordinator-Dienst

In einigen Verfahren in diesem Thema werden Typen in der System.Transactions-Assembly verwendet.Bevor Sie diese Verfahren ausführen, müssen Sie sicherstellen, dass der Distributed Transaction Coordinator-Dienst auf dem Computer ausgeführt wird, auf dem die Komponententests laufen.Andernfalls schlagen die Tests mit folgender Fehlermeldung fehl: "Die Testmethode Projektname.TestName.Methodennamehat eine Ausnahme ausgelöst: System.Data.SqlClient.SqlException: MSDTC auf dem Server ComputerName ist nicht verfügbar".

So starten Sie den Distributed Transaction Coordinator-Dienst

  1. Öffnen Sie die Systemsteuerung.

  2. Öffnen Sie in der Systemsteuerung die Option Verwaltung.

  3. Öffnen Sie unter Verwaltung die Option Dienste.

  4. Klicken Sie im Bereich Dienste mit der rechten Maustaste auf den Dienst Distributed Transaction Controller, und klicken Sie auf Starten.

    Der Status des Diensts sollte sich in Gestartet ändern.Jetzt sollten Sie in der Lage sein, Komponententests auszuführen, die „System.Transactions“ verwenden.

Wichtig

Folgender Fehler kann ausgegeben werden, obwohl der Distributed Transaction Controller-Dienst gestartet wurde: 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). In diesem Fall muss der Distributed Transaction Controller für den Netzwerkzugriff konfiguriert werden. Weitere Informationen finden Sie unter Aktivieren des DTC-Netzwerkzugriffs.

Siehe auch

Erstellen und Definieren von SQL Server-Komponententests