2010-08-21 5 views
15

내 Entity Framework 기반 리포지토리의 통합 테스트를 구현하고 싶습니다. 문제는 테스트가 완료된 후 데이터베이스 상태를 롤백하는 방법입니다. 지금은 테스트 SetUp에서 트랜잭션을 시작하고 테스트 TearDown에서 롤백 할 계획입니다. 수동 데이터베이스 삭제 이외의 다른 솔루션이 있습니까?롤백 - 저장소 통합 테스트

답변

21

MSTest를 사용하는 동안 통합 테스트에서이 작업을 수행합니다. TransactionScope을 사용하고 기본 설정에서 테스트 설정 및 해체를 구현합니다. 이를 통해 트랜잭션 내에서 모든 통합 테스트를 실행할 수 있습니다. 기본 클래스는 다음과 같이 보입니다.

public class IntegrationTestsBase 
{ 
    private TransactionScope scope; 

    [TestInitialize] 
    public void Initialize() 
    { 
     this.scope = new TransactionScope(); 
    } 

    [TestCleanup] 
    public void TestCleanup() 
    { 
     this.scope.Dispose(); 
    } 
} 

행운을 빈다.

+0

아주 좋은! 이제는 오라클에서만 작동한다면 ... –

+0

'TransactionScope'은 오라클과 함께 작동합니다. 다중 서버 다중 공급 업체 (2 단계 커밋) 통신을 위해 특별히 설계되었습니다. – Steven

+2

확인 후 repo.Save (someObject) 테스트를 통해 객체가 저장되었는지 확인합니까? –

2

아마도 가장 쉬운 방법 일 수 있습니다. 다른 방법은 SetUp에서 데이터베이스를 다시 작성하는 것입니다.

5

나는

Here's an example doing the same with Linq To SQL that you can tweek for yourself.

This link describes three options .... 당신이 올바른 궤도에 있다고 생각 :

  • 거래
  • 를 DB
  • 를 사용하여 SQL 서버 스냅 샷
  • 재 구축

게시물은 트랜잭션을 설명하기 위해 계속 진행되지만 가장 빠른 것은 단일 세션에 묶여 실제 문제/제한을 만들 수 있습니다. 할 수있는 경우 사용하십시오 ....

DB를 재구성하는 속도는 느리지 만 확실히 수행 할 수 있지만 스냅 샷을 사용하면 트랜잭션 제한이 신속하게 처리됩니다.

자동화 테스트에서 매우 높은 성능이 필요한 경우 try this from the same blogger. 그는 MS Distributed Transaction Coordinator를 사용하여 단일 세션의 트랜잭션 제한을 제거한다고 설명합니다.

4

설치 프로그램에서 TransactionScope를 열고 TearDown에서 삭제하는 것은 커밋을 테스트하지 않는다는 것입니다!

+1

커밋을 테스트하지 않으면 전체 테스트가 절반의 통합 테스트가됩니다 ... – Pascal

0

가장 좋은 방법은 트랜잭션 방식입니다. 제가 제공 한 링크에는 짧은 안내문이 있습니다. 내가 접촉 한 거의 모든 엔터프라이즈 솔루션은 트랜잭션 기반 접근 방식을 사용합니다. 엔티티 프레임 워크와의 거래에 관한 Microsoft의 문서에 대한 링크가있는 기사 하단의 링크를 살펴보십시오. 위에 나열된 다른 옵션은 테스트 트랜잭션을 정리하는 간단한 개념으로 과도하게 경쟁합니다. 데이터베이스를 구축하거나 스냅 샷을 사용하면이 문제가 너무 복잡해집니다. TransactionScope는 통합 테스트를 미완성 상태로두고 트랜잭션을 실행하지도 않습니다.

구현 거래

이 각 테스트가 시작되기 전에 트랜잭션을 생성하고 각 시험 종료 후 트랜잭션을 롤백합니다.

[TestClass] 
public class TransactionTest 
{ 
    protected EntitiesV3 context; 
    protected DbContextTransaction transaction; 

    [AssemblyInitialize] 
    public static void AssemblyStart(TestContext testContext) 
    { 
    RetryDbConfiguration.SuspendExecutionStrategy = true; 
    } 

    [TestInitialize] 
    public void TransactionTestStart() 
    { 
    context = new EntitiesV3(); 
    transaction = context.Database.BeginTransaction(); 
    } 

    [TestCleanup] 
    public void TransactionTestEnd() 
    { 
    transaction.Rollback(); 
    transaction.Dispose(); 
    context.Dispose(); 
    } 

    [AssemblyCleanup] 
    public static void AssemblyEnd() 
    { 
    RetryDbConfiguration.SuspendExecutionStrategy = false; 
    } 
} 

Great quick walk through on transactional rollback/cleanup approach