VS 2010 테스트 실행기 오류 "테스트가 실행되는 동안 에이전트 프로세스가 중지되었습니다."


101

Visual Studio 2010에는 여러 단위 테스트가 있습니다. 테스트 목록을 사용하여 한 번에 여러 테스트를 실행할 때 때때로 하나 이상의 테스트에 대해 다음 오류가 발생합니다.

테스트가 실행되는 동안 에이전트 프로세스가 중지되었습니다.

동일한 테스트가 실패한 것은 아니며 테스트를 다시 실행하려고하면 성공합니다.

Connect 에서이 버그 보고서를 찾았 는데 동일한 문제인 것 같지만 해결책을 제공하지 않습니다.

이 행동을 본 사람이 있습니까? 어떻게 피할 수 있습니까?

편집하다

나는 여전히이 버그를 겪고 있으며, 같은 소프트웨어 / 하드웨어 설정을 사용하는 동료들도 많습니다. 지금까지 답변을 평가했지만 문제가 해결되지 않았습니다. 이 문제에 대한 해결책에 대한 현상금을 시작하고 있습니다.


나는 같은 것을 얻고있다. 나는 그것을 파고 있지만 지금까지 해결책은 없다
Mark

이것에 대한 소식이 있습니까? 여기에도 같은 문제가 있습니다 ...
Peter Gfader

@Peter, 수락 된 답변 아래의 내 의견을 참조하십시오. 그것이 내 해결책 이었지만 귀하의 문제가 비슷한 지 모르겠습니다.
driis

나는 잡히지 않은 예외로 같은 행동을했습니다. 빌드 서버에서 Visual Studio를 실행하고 Assert-Window를 얻었을 때 예외가 표시되었습니다. 어설 션 창 때문에 테스트를 계속할 수 없습니다.

답변:


41

방금 비슷한 문제가 발생했습니다. 일부 테스트는 실패하고 다른 테스트 실행에서 다릅니다. 왜 그런 일이 발생했는지 정확히 모르겠지만, 클래스 중 하나에 종료자를 추가했을 때 발생하기 시작했습니다. 종료자를 비활성화하면 문제가 사라집니다. 파이널 라이저를 켜면 문제가 다시 발생합니다.

지금 나는 이것을 극복하는 방법을 모릅니다.


16
감사합니다-이 답변은 저를 해결책으로 안내합니다. 몇 가지 유형에 대한 종료 자만 있고 확실히 제거하면 문제도 제거되었습니다. 추가 조사를 통해 생성자에서 예외가 발생했을 때만 발생하는 하나의 종료 자에서 미묘한 버그를 발견했으며 종료자는 완전히 생성되지 않은 객체를 종료하려고합니다. 결론 : 유형의 종료 자에서 예외가 발생하고 모든 테스트가 완료되기 전에 해당 종료자가 실행되면 Visual Studio에서 발생한 오류를 표시합니다. 추가 설명없이 무작위 테스트에서.
driis

6
내 코드에 종료 자 / 소멸자가 없습니다 ... ~ MyClass () 동일한 오류가 발생합니다. Resharper를 사용한 테스트 실행은 모두 녹색입니다
Peter Gfader

6
종료 자에서 포착되지 않은 예외의 문제는 백그라운드 작업에서 포착되지 않은 예외의 특수한 경우로, 일부 테스트에 의해 시작되거나 예약 될 수 있으며 (암시 적으로) 테스트가 완료된 경우에도 계속 실행할 수 있습니다.
satorg

1
Peter와 마찬가지로 Resharper 테스트 러너는 저에게 모두 녹색을 제공합니다. VS 2010 테스트 러너가 소멸자가있는 클래스에서 실패합니다.
RyBolt 2010

1
Dispose () 메서드에서 실수로 무한 재귀 루프를 코딩했는데 이로 인해이 문제도 발생했습니다.
Robert

88

이 메시지는 실행중인 테스트 스레드와 다른 스레드예외 로 인해 발생 합니다 . 지금까지의 모든 답변은이 간단한 설명으로 요약됩니다. 이 경우 현명한 정보를 표시하지 않는 것은 Visual Studio의 알려진 버그입니다.

실행중인 테스트 스레드가 아닌 스레드가 예외를 throw하면 Visual Studio의 테스트 러너가 완전히 질식합니다. 테스트.


나에게도 똑같은 일이 일어났습니다. 내 테스트는 예외가 발생하는 별도의 스레드를 생성했습니다. 스레드 내부에서 예외를 잡으면 적어도 그것을 인쇄하고 무슨 일이 일어나고 있는지 알 수 있습니다. 그러나 스레드의 catch 블록에 Assert.Fail ()을 넣지 않도록주의하십시오.이 경우 시작된 위치로 바로 돌아가는 별도의 예외가 발생합니다.
Kyle Krull

4
그래서있는 스택 오버 플로우를 제외하고 나를 위해 같은 일이 더 힘들어 ... 자바에 비해 C #으로 추적하는
존 가드너에게

실제로 Thread 객체를 사용하고 Abort ()를 호출하여 중지 할 때 이런 일이 발생했음을 알았습니다.
espaciomore

1
경우에도 발생 async void시험 중에 호출되는 메소드가 예외를 throw
마티아스 베 체르에게

1
trx에는 오류 정보가 포함될 수 있으며 텍스트 편집기에서 열거 나 Visual Studio에서 열고 테스트 결과 창 에서 테스트 실행 오류 하이퍼 링크를 클릭하여 확인할 수 있습니다.
Ohad Schneider

16

이 문제가 발생했는데 내 코드에서 테스트 프레임 워크가 제대로 포착하지 못하는 문제로 판명되었습니다. 약간의 우발적 인 리팩토링으로 인해 다음 코드가 남았습니다.

public void GetThingy()
{
    this.GetThingy();
}

이것은 물론 무한 재귀이며 StackOverflowException (내 생각에)이 발생했습니다. 이로 인해 "테스트가 실행되는 동안 에이전트 프로세스가 중지되었습니다."라는 두려움이 생겼습니다.

빠른 코드 검사를 통해 문제가 확인되었으며 이제 테스트가 정상적으로 실행되고 있습니다. 이것이 도움이되기를 바랍니다. 문제를 찾는 코드를 검사하거나 콘솔 앱으로 약간 추출하여 제대로 작동하는지 확인하는 것이 좋습니다.


3
이것은 문제가 아닙니다 (매번 실패하는 테스트가 다르기 때문에 알고 있습니다). 시간을내어 답변 해 주셔서 감사합니다.
driis

6
이 문제에 대한 여러 유효한 답변 중 하나이므로 +1합니다. 내 클래스 중 하나의 sstatic 메서드에서 SO 예외로 인해이 문제가 발생했습니다.
Peter T. LaComb Jr.

6
+1, 나도 봤어. 테스트를 디버깅하면 (VS 11에서) 문제를 꽤 빨리 찾습니다.
Jeremy McGee 2014

Jeremy와 동의합니다. 단위 테스트를 디버그하면 예외가 발생하는 지점에서 중지해야합니다. 그러나 단위 테스트를 실행하면 모두 녹색 표시등이 나타납니다. 매우 기괴합니다.
Andrew Stephens

8

테스트 결과 파일 (/TestResults/*.trx)에서 내 문제의 원인을 찾을 수있었습니다. 백그라운드 스레드에서 발생한 예외에 대한 전체 세부 정보를 제공했으며 해당 예외를 해결하면 "에이전트가 처리했습니다. 중지됨 ... "오류가 사라졌습니다.

제 경우에는 단위 테스트에서 의도하지 않게 GUI를 시작하여 결국 System.ComponentModel.InvalidAsynchronousStateException이 발생했습니다.

그래서 내 .trx 파일에는 다음이 포함되었습니다.

   <RunInfo computerName="DT-1202" outcome="Error" timestamp="2013-07-29T13:52:11.2647907-04:00">
    <Text>One of the background threads threw exception: 
System.ComponentModel.InvalidAsynchronousStateException: An error occurred invoking the method.  The destination thread no longer exists.
at System.Windows.Forms.Control.WaitForWaitHandle(WaitHandle waitHandle)
at System.Windows.Forms.Control.MarshaledInvoke(Control caller, Delegate method, Object[] args, Boolean synchronous)
at System.Windows.Forms.Control.Invoke(Delegate method, Object[] args)
at System.Windows.Forms.Control.Invoke(Delegate method)
...
</Text>
  </RunInfo>

이것은 어떤 테스트가 오류를 일으켰는지에 대한 정보를 제공하지 않았지만 예외가 어디에 있는지 보여 주므로 매우 유용했습니다.


5

테스트 프로세스 충돌 및 배경 스레드에서 처리되지 않은 예외가있을 때 일어날 수있는 경우이 메시지는 일반적으로 생성, 스택 오버 플로우가 발생, 또는 명시 적으로 호출 Process.GetCurrentProcess().Kill()하거나 Environment.Exit. 또 다른 가능한 원인은 비 관리 코드의 액세스 위반입니다.

아무도 언급하지 않은 것은 이벤트 로그에 추가 정보가있을 수 있다는 것입니다. 일반적으로 테스트가 결과에서 충돌 한 이유에 대한 많은 정보를 얻지 못하지만 백그라운드 스레드에서 처리되지 않은 예외가 발생하는 경우 테스트 프레임 워크는 소스 VSTTExecution을 사용하여 응용 프로그램 이벤트 로그에 세부 정보를 기록합니다. 이벤트 로그에 기록 된 정보가 없으면 위에 나열된 다른 원인 중 하나 일 수 있습니다.


4

제 경우에는 Output Window 를 확인하여 솔루션이 해결되었습니다 .

'QTAgent32.exe'(관리 형 (v4.0.30319)) : 'C : \ TestResults \ bdewey_XXXXXX072 2011-01-11 17_00_40 \ Out \ MyCode.dll'로드 됨, 기호로드 됨. E, 9024, 9, 2011/01/11, 17 : 00 : 46.827, XXXXX072 \ QTAgent32.exe, 처리되지 않은 예외 포착, Watson을 통해보고 : [예외 메시지]

제 경우에는 별도의 스레드에서 오류를 발생시키는 FileSystemWatcher가 있습니다.


어떻게 해결 했습니까? 나는 서비스에서 FileSystemWatcher를 래핑하고 그에 대한 WF 워크 플로를 만드는 M $의 샘플 코드를 사용하고 있습니다. 나는 이것들을 많이 얻고있다 ...
ekkis

제 경우에는 두 가지 테스트가 실패했습니다. 출력 창으로 이동하여 Tests를 선택 했을 때 "백그라운드 스레드 중 하나에서 예외가 발생했습니다."라고 언급했습니다. 사실, 9 개의 NullReferenceExceptions가 스택 추적으로 나를 기다리고있었습니다. 감사합니다. 매우 도움이되었습니다!
Qwertie

3

동일한 문제가 발생하여 제거하는 동안 해결했습니다.

Environment.Exit(0);

따라서 테스트 또는 테스트중인 메서드로 인해 실행 프로세스가 종료되는 동안이 오류가 발생한다고 확신합니다.


2

질문을 게시 해 주셔서 감사합니다. 방금이 문제가 발생하여 문제가 발생할 수있는 원인을 파악했습니다.

비동기 예외가 발생했을 수 있습니다.

테스트 설정 중에 스레드 풀에서 작업자 스레드를 큐에 넣는 개체를 만듭니다. 충분히 빠르게 디버깅을 실행하면 코드가 통과됩니다.

작업자 스레드가 시작되고 테스트 설정이 완료되기 전에 오류가 발생하면 이유없이 중단 된 결과가 표시됩니다.

작업자 스레드가 시작되고 테스트가 시작된 후 오류가 발생하면 다음과 같은 결과가 나타납니다. 오류-테스트가 실행되는 동안 에이전트 프로세스가 중지되었습니다.

주의해야 할 중요한 사항 : 이것은 여러 테스트에서 사용하는 구성 요소입니다. 테스트 프레임 워크에 이러한 오류가 너무 많이 발생하면 나머지 테스트가 중단됩니다.

도움이 되었기를 바랍니다


답변 감사합니다. 비동기 예외가 내가보고있는 것과 비슷한 것을 유발할 수 있다는 것을 알고 있지만 이것이 사실이 아니라는 것은 거의 확신합니다. 코드는 웹 앱용이며 비동기 적으로 아무것도하지 않습니다. 또한 실패한 테스트는 무작위로 보입니다.
driis

2

내 테스트와 관련된 모든 클래스에 정의 된 ~ ClassName () {} descructor에 try / catch 블록을 추가했습니다. 이것은 나를 위해 문제를 해결했습니다.

~MyClass()
{
    try
    {
        // Some Code
    }
    catch (Exception e)
    {
        // Log the exception so it's not totally hidden
        // Console.WriteLine(e.ToString());
    }
}

2

예외가 발생한 위치를 확인하려면 테스트 결과 창의 느낌표 아이콘 옆에있는 "테스트 실행 오류"하이퍼 링크를 클릭하십시오. 스택 추적이있는 창이 열립니다.

이것은 오류를 추적하는 데 많은 도움이됩니다!


1

나는 같은 문제가 있었고 관리되지 않는 리소스 (어떤 이유로 제대로 처리되지 않은 파일 작성기)에 대한 종료 자에 의해 발생했습니다.

예외를 삼키는 try-catch에서 종료 자 코드를 래핑 한 후 문제가 사라졌습니다. 나는 그런 예외를 삼키는 것을 권장하지 않기 때문에, 왜 예외가 처음에 발생하는지 알아내는 것이 현명 할 것입니다.


1

나는 이상한 경우에 이런 일이 발생했으며 범인은 거의 항상 스레딩으로 밝혀졌습니다.

이상하게도 모든 테스트가 개발 시스템에서 잘 작동하고 빌드 서버에서 무작위로 실패합니다.

자세히 살펴보면 테스트가 개발 상자에 통과 된 것으로 나열되었지만 예외가 발생하는 것으로 나타났습니다. 예외는 오류로 선택되지 않은 별도의 스레드에서 발생했습니다.

예외 세부 정보가 테스트 추적에 대해 기록되었으므로 수정해야하는 코드 / 테스트를 식별 할 수있었습니다.

이것이 누군가를 돕기를 바랍니다.


0

제 경우에는 WCF 서비스에 대한 단위 테스트가있었습니다. 이 WCF 서비스는 2 개의 타이머를 시작했습니다.
그 타이머는 부작용을 일으켰습니다.
-> 기본적으로이 타이머를 비활성화하고 모든 것이 정상입니다!

BTW : WCFMock 을 사용 하여 WCF 서비스를 위조하므로 WCF 서비스에 대한 "실제"단위 테스트가 있습니다.


0

이 오류는 나에게도 Finalizer로 인해 발생했습니다.
파이널 라이저는 조롱되지 않은 일부 DB 코드를 적극적으로 호출했습니다. 내가 작성한 수업이 아니고 그것에 대한 참조가 꽤 많은 수업 깊이 파묻혀 서 그것을 찾는 데 시간이 걸렸습니다.


0

TestInitialize에서 테스트가 실패하고 다른 프로젝트의 ddl에서 코드를 실행하는 비슷한 문제가 발생했습니다. 위에서 설명한대로 오류 메시지가 표시되고 테스트를 디버그하려고하면 예외 세부 정보없이 테스트가 중단됩니다.

문제는 내 다른 프로젝트의 dll이 Visual Studio 2012 프로젝트의 것이고 VS2010 프로젝트에서 내 테스트를 실행하고 있거나 두 프로젝트의 UnitTestFramwork dll 버전이 일치하지 않을 수 있다는 것입니다.


0

문제는 TestClass 생성자의 예외 또는 Stackoverflow에 의해 트리거 될 수도 있습니다.


0

이 오류에는 여러 가지 원인이있을 수 있으므로이 스레드의 완성도를 위해 다른 오류를 추가하고 싶습니다.

경우 모든 당신의 시험과 OP 설명 중단하는하는 원인은 잘못된 프로젝트 구성 될 수 있습니다. 제 경우에는 대상 프레임 워크가 .NET Framework 3.5로 설정되었습니다. 프로젝트 속성 페이지 ( 응용 프로그램 탭 )를 통해 더 높은 버전으로 설정 하면 문제가 해결되었습니다.


0

Windows 이벤트 뷰어 에서 Windows 로그 > 응용 프로그램 로그 항목 을 확인하여 내 문제의 원인을 확인할 수있었습니다 . 시험 폭격 당시의 항목을 찾으십시오. 나는 한 오류 다음과 유사한 항목 :

QTAgent32_40.exe, PID 10432, Thread 2) AgentProcess:CurrentDomain_UnhandledException: IsTerminating : System.NullReferenceException: Object reference not set to an instance of an object.
   at XXX.YYY.ZZZ.cs:line 660
   at XXX.YYY.AAA.Finalize() in C:\JenkinsSlave\workspace\XXX.YYY.AAA.cs:line 180

실제로 클래스 종료 자에서 호출 된 메서드 내의 null 참조 예외였습니다.


0

이 오래된 질문에 대해 발생하고 자신의 스레드에서 무엇이 던져지고 있는지 궁금해하는 사람을 위해 여기에 팁이 있습니다. Task.Run (예 : Thread.Start와 반대)을 사용하면 자식 스레드 예외가 훨씬 더 안정적으로보고됩니다. 간단히 말해서이 대신 :

Thread t = new Thread(FunctionThatThrows);
t.Start();
t.Join();

이 작업을 수행:

Task t = Task.Run(() => FunctionThatThrows());
t.Wait();

그리고 오류 로그가 훨씬 더 유용해야합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.