2009-01-02 7 views
2

[편집 (하렌) : Duplicate]단위 테스트를 DB 트랜잭션으로 자동 포장 하시겠습니까?

나는 시험이 끝날 때 시험에 의한 변경이 자동으로 롤백되도록 자동으로 DB를 거래에 내 NUnit과의 통합 테스트를 포장 할 수있는 방법을 찾고 있어요. 이상적으로, 테스트가 시작될 때 NUnit이 트랜잭션을 생성하고 테스트가 끝나면 롤백하는 커스텀 애트리뷰트로 특정 테스트 메소드를 꾸밀 것이다. 애트리뷰트를 쓸 수는 있지만 어디에 추가해야할지 모른다. 그것을 확인하십시오.

테스트 DB의 크기는 3GB이므로 각 테스트가 시작될 때 테스트 DB를 복원하는 것은 옵션이 아닙니다. 각 테스트의 본문에 수동으로 트랜잭션을 생성 할 수 있다는 것을 알고 있지만 좀 더 우아한 것을 찾고 있습니다.

나를 위해이 작업을 수행 할 수있는 IL 재 작성 도구 (아마도 AOP 프레임 워크)가 있을까요? 누구든지 어떤 제안이 있습니까?

+0

이것은 http://stackoverflow.com/questions/321180/how-do-i-test-database-related-code-with-nunit의 복제본입니다. (내가 묻는 질문!) –

답변

3

두 가지 권장 사항이 있습니다. 첫 번째는 SetUp 및 TearDown 속성을 사용하여 트랜잭션을 시작한 후 트랜잭션을 롤백하는 것입니다. NUnit를 그렇게 할 수있는 문서는 여기에 있습니다 : 당신이 그것을 사용하지 않을 경우

http://www.nunit.org/index.php?p=setup&r=2.4.8

은, 내가 보는 다른 옵션은 모든 방법을 코드,하지만 사용에 TransactionScope에 인스턴스를 사용하는 것입니다 문을 사용하여 트랜잭션을 만듭니다 (공급자가 자동 ​​등록해야 함).

물론 SetUp 및 TearDown 메서드에서 TransactionScope 인스턴스를 만들 수 있습니다.

+0

나는이 질문을 썼기 때문에 "using"블록과 setup/teardown 방식을 모두 사용했다. 고정 장치에서 특정 테스트를 롤백 할 때만 "사용"을 사용합니다. 내 모든 테스트에서이 동작을 원한다면 사용자 정의 "RollbackEveryTest"특성을 테스트 클래스에 추가합니다. 내 기본 테스트 클래스의 setup/teardown을 사용하여 속성을 확인하고 그에 따라 트랜잭션을 관리합니다. 완벽하지는 않지만 일반적인 경우에 효과적입니다. –

0

Spring.net?

Java/JUnit 배경에서 왔지만 Java에서 Springframework를 사용하여이 작업을 수행 할 수 있음을 알고 있습니다.

(AOP를 적용하려면 ApplicationContext/BeanFactory에서 테스트를 받아야합니다.)

4

여기서 중첩 된 트랜잭션 문제가 발생하지 않습니까? 대부분의 DB는 트랜잭션 내에서 트랜잭션을 지원하지 않습니다. 그래서 만약 테스트중인 코드가 트랜잭션을 전혀 사용하지 않는다면 (트랜잭션을 지원하는 DB를 사용한다면 당신은 그것들을 사용할 것입니다), 그러면 정말로 원하는 것은 중첩 된 트랜잭션입니다. DB는 직접적으로 지원하지 않습니다.

+0

그게 유효한 지적입니다. 필자의 경우 SQL Server에만 관심이 있지만 다른 독자는 그 차이를 앞에 두지 못할 수도 있으므로 응답을 "+1"이라고합니다. –

관련 문제