문제

이 asp.net에서 나는 청소를하고 교착 상태가 발생할 수 있습니다. 코드가 올바르게 처리하는지 확인하고 싶습니다. 그래서 교착 상태를 유발하는 Nunit 테스트를 작성하려고합니다 .....

DAO는 엔티티에 의해 분할됩니다. 각 엔티티에는 startup () 및 Teardown () 메소드로 둘러싸인 일련의 테스트 세트가있어 트랜잭션 스코프를 생성 한 다음 테스트가 완료된 후에 다시 롤백합니다. 이것은 다른 모든 것에 적합하지만 교착 상태에는 완전히 쓸모가 없습니다.

TransactionScope 및 SQL2000 (예 : MSDTC가 관련됨)을 사용하여 "교착 상태"테스트를 설정하고 실행할 수있는 방법은 무엇입니까? 더 자세한 내용 : 두 사용자가 다른, 구체적, 데이터 값으로 두 기능을 호출하면 교착 상태가있는 상황이 있다는 것을 알고 있습니다. ~할 수 있다 결과. Nunit 내에서 이것을 어떻게 시뮬레이션하고 교착 상태를 만들 수 있습니까? 언제나 일어나다?

그리고 네, 나는 "처음에 일어나는 교착 상태를 멈추지 않는 이유"로 시작했지만 실행 계획이 발생할 수있는 코드를 제어 할 수 없습니다. 기능을 호출하면 교착 상태가 될 수 있습니다. .

도움이 되었습니까?

해결책

교착 상태에서 예외가 발생하면 모의 개체를 사용하여 예외를 모방하고자합니다.

기본 아이디어는 Mock Object Framework를 말하는 것입니다 (나는 좋아한다. 타입 콕) 대신 예외를 던지려면 다음과 같은 것입니다.

MockObject mo = MockManager.MockObject(typeof(MyDeadlockException));
mock.ExpectAndThrow("MyMethod", (MyDeadlockException)mo.Object); 

아이디어는 기본적으로 다른 조롱 프레임 워크에서 동일합니다.

다른 팁

이러한 솔루션의 대부분에는 여러 스레드가 포함됩니다. 그렇지 않은 것이 있습니다.

이 허점을 닫습니다 - 데이터베이스 오류를 재현하십시오

저자는 Alex Kuznetsov입니다.

거래 중간에있는 테스트 중 하나가 5 분 동안 "대기"를하면 어떻게 되나요? 또는 단순히 거래를 시작하고 새로운 레코드를 작성한 다음 커밋하지 않고 해당 레코드를 업데이트하는 테스트를 작성합니다. 그런 다음 새 거래를 시작하고 생성되고 현재 업데이트되고있는 레코드를 읽으십시오. 당신은 거기에서 교착 상태를 얻을 것입니다.

수동으로 테이블을 잠그고 항상 잠긴 상태로두면 어떻게해야합니까? 그러면 해당 테이블에 대한 조치가 교착 상태 상황을 일으킬 수 있습니까?

이 블라인드에오고 있지만 테스트 세트 업 메소드에서 실제로 데이터베이스에 SQLConnection을 생성 할 수 있습니까? 그런 다음이를 사용하면 테이블을 잠그는 명령을 내릴 수 있습니다. 또는 레코드 나 페이지를 잠그기 위해 조치를 취할 수 있습니까? 그렇게하면 진행중인 다른 거래 외부에 있을까요? 이것은 이미 고려한 옵션 인 것 같습니다. 당신의 상황에 대해 내가 무엇을 놓치고 있습니까?

단위 테스트의 경우 실제로 데이터베이스를 사용하지 않기를 원할 것입니다. 교착 상태가 있다는 것을 어떻게 알 수 있습니까? 교착 상태가 있음을 알려주는 조건을 테스트하고 테스트에서이를 작성해야합니다.

모의는 서비스를 호출하고 오류를 반환한다는 것을 모방하기위한 이상적인 위로입니다. 모의가 기대하는 오류를 반환하도록하십시오. 타임 아웃이나 무언가를 기다리고 있다면 같은 것이 적용됩니다.

일반적으로 단위 테스트는 테스트중인 코드에서만 실행되며 다른 코드 나 구성 요소에 의존해서는 안됩니다. 즉, 데이터베이스는 본질적으로 또 다른 구성 요소이며 아마도 Nunit을 사용하여이를 구동하기 위해 일종의 기능 테스트를 수행하고있을 것입니다.

이 경우 교착 상태 상황을 만들어야하지만 레코드 나 테이블을 잠그고 동일한 레코드를 사용하고 응답을 처리하려는 구성 요소를 호출해야합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top