다음을 통해 공유


방법: 단일 트랜잭션 범위 내에서 실행되는 SQL Server 단위 테스트 작성

단일 트랜잭션 범위 내에서 실행되도록 단위 테스트를 수정할 수 있습니다. 이 방법을 사용하는 경우 테스트가 종료된 후 적용된 변경 내용을 롤백할 수 있습니다. 다음 절차에서는 아래 작업을 수행하는 방법에 대해 설명합니다.

  • BEGIN TRANSACTIONROLLBACK TRANSACTION을 사용하는 Transact-SQL 테스트 스크립트에서 트랜잭션을 만듭니다.

  • 테스트 클래스에서 단일 테스트 메서드용 트랜잭션을 만듭니다.

  • 주어진 테스트 클래스에서 모든 테스트 메서드용 트랜잭션을 만듭니다.

필수 조건

이 주제의 일부 절차에서는 단위 테스트를 실행하는 컴퓨터에서 DTC(Distributed Transaction Coordinator) 서비스를 실행해야 합니다. 자세한 내용은 이 주제의 끝에 나와 있는 절차를 참조하세요.

Transact-SQL을 사용하여 트랜잭션을 만들려면

Transact-SQL을 사용하여 트랜잭션을 만들려면

  1. SQL Server 단위 테스트 디자이너에서 단위 테스트를 엽니다. (단위 테스트의 소스 코드 파일을 두 번 클릭하여 디자이너를 표시합니다.)

  2. 트랜잭션을 만들려 하는 스크립트 형식을 지정합니다. 예를 들어 사전 테스트, 테스트 또는 사후 테스트를 지정할 수 있습니다.

  3. Transact-SQL 편집기에서 테스트 스크립트를 입력합니다.

  4. 이 간단한 예제와 같이 BEGIN TRANSACTIONROLLBACK 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 웹 사이트 롤백 트랜잭션(Transact-SQL)의 이 페이지를 참조하세요.

단일 테스트 메서드의 트랜잭션을 만들려면

이 예제에서는 System.Transactions.TransactionScope 형식을 사용할 때 앰비언트 트랜잭션을 사용합니다. 기본적으로 실행 연결 및 권한 있는 연결은 메서드가 실행되기 전에 만들어지므로 이 연결에서는 앰비언트 트랜잭션을 사용하지 않습니다. 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.UnitTestingImports Microsoft.VisualStudio.TeamSystem.Data.UnitTest.Conditions 외에)를 추가해야 합니다. Visual C#을 사용하는 경우 using System.Transactions(Microsoft.VisualStudio.TestTools, Microsoft.VisualStudio.TeamSystem.Data.UnitTesting 및 Microsoft.VisualStudio.TeamSystem.Data.UnitTesting.Conditions에 대한 using 문 외에)를 추가해야 합니다. 또한 해당 어셈블리에 프로젝트에 대한 참조를 추가해야 합니다.

테스트 클래스에서 모든 테스트 메서드용 트랜잭션 만드는 방법

테스트 클래스에서 모든 테스트 메서드용 트랜잭션 만드는 방법

  1. 단위 테스트의 Visual Basic 또는 C# 파일을 엽니다.

  2. 다음 Visual C# 코드 예제와 같이 TestInitialize에서 트랜잭션을 만들고 TestCleanup에서 삭제합니다.

    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 어셈블리의 형식을 사용합니다. 이러한 절차를 따르기 전에 단위 테스트를 실행하는 컴퓨터에서 DTC(Distributed Transaction Coordinator) 서비스를 실행해야 합니다. 그렇지 않으면 테스트가 실패하고 “테스트 메서드 ProjectName.TestName.MethodName에서 예외를 throw했습니다. System.Data.SqlClient.SqlException: 서버 ‘ComputerName’의 MSDTC를 사용할 수 없습니다.”라는 오류 메시지가 나타납니다.

Distributed Transaction Coordinator 서비스를 시작하려면

  1. 제어판을 엽니다.

  2. 제어판에서 관리 도구를 엽니다.

  3. 관리 도구에서 서비스를 엽니다.

  4. 서비스 창에서 Distributed Transaction Controller 서비스를 마우스 오른쪽 단추로 클릭하고 시작을 클릭합니다.

    서비스의 상태가 시작됨으로 업데이트됩니다. 이제 System.Transactions를 사용하는 단위 테스트를 실행할 수 있습니다.

Important

분산 트랜잭션 컨트롤러 서비스를 시작한 경우에도 다음과 같은 오류가 나타날 수 있습니다. 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) 이 오류가 나타나면 네트워크 액세스에 대해 Distributed Transaction Controller를 구성해야 합니다. 자세한 내용은 네트워크 DTC 액세스 사용 설정을 참조하세요.

참고 항목

SQL Server 단위 테스트 만들기 및 정의