2009-11-04 5 views
2

내 목표는 ClassCleanup 특성을 사용하여 플래시백 복구를 사용하여 많은 단위 테스트를 실행 한 후 Oracle 데이터베이스를 이전 상태로 복원하는 것입니다.Visual Studio : 일괄 파일을 실행할 때 ClassCleanup 시간 초과 테스트

데이터베이스를 올바르게 복원하기 위해 배치 파일 + SQL을 작성했습니다. 이것은 내 명령 프롬프트에서 여러 번 문제없이 테스트되었습니다

보통 테스트 실행 구성 내에 정리 스크립트로 저장 하겠지만 데이터베이스를 플래쉬 백하는 시간을 포함해야합니다 (ClassInitialize로 설정)

 try 
     { 
      ProcessStartInfo startInfo = new ProcessStartInfo(@"SomeProjectDirectory\flashback.bat");     
      startInfo.CreateNoWindow = false;     
      startInfo.WindowStyle = ProcessWindowStyle.Normal; 
      startInfo.ErrorDialog = true;     
      startInfo.Arguments = Arguments; 
      startInfo.UseShellExecute = true;             

      Process batchExecute = new Process(); 
      batchExecute.StartInfo = startInfo; 
      batchExecute.Start(); 
      batchExecute.WaitForExit(); 
     } 
     catch (Exception e) 
     { 
      System.Diagnostics.Debug.WriteLine(e.ToString()); 
     } 

배치 파일

잘 실행되지만 문제는이

완료되기 전에 밖으로 ClassCleanup 방법 시간 그것은() 모든 중단 점을 공격하거나 WaitForExit 후 예외를 캐치하지 않았던 것 같다. 프로세스를 완료하는 동안 명령 프롬프트 창을 끝내기 만하면 오류 메시지없이 모든 테스트가 성공했음을 알 수 있습니다.

많은 수의 ClassCleanup 메서드에 Timeout 특성을 추가하려고했지만 어느 쪽도 도움이되지 않습니다. 내가 확실히 확신 할 수있는이 속성은 클래스 정리가 아닌 유닛 테스트에만 적용 가능합니다.

프로세스를 TestCleanup 메소드로 옮겼습니다. 문제없이 작동했습니다. 이 과정은 테스트에서도 잘 돌아갔다. ClassCleanup에서만 시간 제한이있는 것 같습니다 & AssemblyCleanup 메서드

우리는 테스트를 실행할 때마다 항상 같은 지점에서 벗어나기 때문에 시간 초과라는 인상을 받고 있습니다. 그러나 스크립트에 단계를 추가하거나 제거하면 이전보다 빠르거나 더 빠를 것입니다.

답변

2

같은 문제가있었습니다. 그 이유는 ClassCleanupAssemblyCleanup이 실행될 때 백그라운드에서 계속 진행되는 GC 때문입니다. 따라서 Cleanup 함수의 범위를 벗어난 리소스에 액세스하려고하면 가비지 수집 될 가능성이 높아지고 예외를 throw하지 않고 함수가 종료됩니다.

클린업 기능에 필요한 모든 코드를 넣거나 클래스 시작 부분 (해킹 비트)에 로컬 코드를 만들어 문제를 해결할 수 있습니다. 그러나 이는 클라이언트 - 서버 응용 프로그램에서 까다로울 수 있습니다. 이 기능을 사용하려면 저수준 코드를 가져와야 할 수도 있습니다.

개인적으로 필자는 인생을 훨씬 어려워 야하기 때문에이 디자인 결정을 고맙게 생각합니다.

+1

ProcessStartInfo & Process를 전용 멤버 변수로 설정하면 GC가 정리되지 않아 완벽하게 작동합니다. 고마워. –

+0

고마워. –

관련 문제