Ошибка VS 2010 Test Runner «Процесс агента был остановлен во время выполнения теста».

101

В Visual Studio 2010 у меня есть несколько модульных тестов. Когда я запускаю несколько тестов одновременно с использованием списков тестов, я иногда обнаруживаю следующую ошибку для одного или нескольких тестов:

Процесс агента был остановлен на время выполнения теста.

Один и тот же тест никогда не заканчивается неудачей, и если я попытаюсь запустить тест снова, он будет успешным.

Я нашел этот отчет об ошибке в Connect , который, похоже, является той же проблемой, но не предлагает решения.

Кто-нибудь еще видел такое поведение? Как я могу этого избежать?

редактировать

Я все еще сталкиваюсь с этой ошибкой, как и многие мои коллеги, использующие ту же программную / аппаратную установку. Пока я оценил ответы, но они не решают проблему. Я начинаю награду за решение этой проблемы.

Driis
источник
Я получаю то же самое. Я копаюсь в этом, но решения пока нет
Марк
Есть новости по этому поводу? Та же проблема здесь ...
Питер Гфадер,
@Peter, см. Мой комментарий ниже принятого ответа. Это было мое решение, но я не знаю, похожа ли ваша проблема.
driis
У меня было такое же поведение с неперехваченным исключением. Исключение было видно мне, когда я запустил Visual Studio на сервере сборки и получил окно Assert-Window. Из-за окна утверждения тест не мог продолжаться.

Ответы:

41

У меня только что возникла аналогичная проблема: некоторые тесты не проходят, и они разные в разных тестовых прогонах. Я не знаю точно, почему это происходит, но это начало происходить, когда я добавил финализатор в один из моих классов. Когда отключаю финализатор - проблема исчезает. Когда включаю финализатор - проблема возвращается.

Прямо сейчас я не знаю, как это преодолеть.

саторг
источник
16
СПАСИБО - этот ответ привел меня к решению. У меня есть финализатор только для пары типов, и, конечно же, их удаление также устранило проблему. При дальнейшем исследовании я обнаружил небольшую ошибку в одном финализаторе, которая возникла только тогда, когда в конструкторе было выброшено исключение, и финализатор пытается завершить объект, который не полностью построен. Заключение: если в финализаторе типа возникает исключение, и этот финализатор запускается до завершения всех тестов, Visual Studio выдаст ошибку, с которой я столкнулся; без каких-либо дополнительных объяснений и на случайных тестах.
driis
6
В моем коде нет финализаторов / деструкторов ... ~ MyClass (), и я получаю ту же ошибку. Все запущенные тесты с Resharper зеленые
Питер Гфадер,
6
Проблема с неперехваченными исключениями в финализаторах - это частный случай неперехваченных исключений в фоновых задачах, которые могут быть запущены или запланированы (возможно, неявно) некоторым тестом и могут продолжать выполнение, даже если тест был завершен.
satorg
1
Как и Питер, тестовый раннер Resharper дает мне зеленый цвет. Средство выполнения тестов VS 2010 не работает в классе с деструктором.
RyBolt
1
Я случайно закодировал бесконечный рекурсивный цикл в моем методе Dispose (), что тоже вызвало это.
Роберт
88

Это сообщение вызвано исключительной ситуацией в потоке, отличном от выполняющегося тестового потока . Все ответы пока сводятся к этому простому объяснению. Известная ошибка Visual Studio - в этом случае не отображать какую-либо значимую информацию.

Средство выполнения тестов Visual Studio полностью задыхается, если поток, отличный от выполняющегося тестового потока, выдает исключение: он проглатывается, и нет вывода, нет возможности перехватить и отладить и нет ничего, кроме сгоревшего тлеющего беспорядка, который должен был быть вашим устройством тест.

мафу
источник
То же самое произошло и со мной - мой тест порождал отдельный поток, который получал исключение. Перехват исключения внутри потока, по крайней мере, позволяет мне распечатать его и узнать, что происходит. Однако будьте осторожны, чтобы не помещать Assert.Fail () в блок catch потока - это вызывает отдельное исключение, которое возвращает вас туда, откуда вы начали.
Кайл Крулл
4
То же самое для меня, за исключением переполнения стека, которое намного сложнее отследить на C # по сравнению с java ...
Джон Гарднер
В самом деле, я заметил, что это произошло, когда я начал использовать объекты Thread и вызывать Abort (), чтобы остановить их.
espaciomore
1
Это также происходит, когда async voidметод, который вызывается во время теста, выдает исключение
Матиас Бехер
1
Обратите внимание, что trx может содержать информацию об ошибке, вы можете увидеть ее, открыв ее в текстовом редакторе или в Visual Studio и щелкнув гиперссылку Ошибка выполнения теста в окне результатов теста .
Охад Шнайдер
16

У меня была эта проблема, и это оказалось проблемой в моем коде, которую Test Framework не улавливал должным образом. Небольшой случайный рефакторинг оставил мне такой код:

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

Это, конечно, бесконечная рекурсия и вызвала исключение StackOverflowException (я думаю). Это вызвало ужасное: «Процесс агента был остановлен на время выполнения теста».

Быстрая проверка кода показала мне проблему, и теперь мои тесты проходят нормально. Надеюсь, это поможет - возможно, стоит проверить код на наличие проблем или, может быть, немного извлечь в консольное приложение и проверить, что он там работает правильно.

Саймон Стил
источник
3
Проблема не в этом (я знаю, потому что каждый раз терпят неудачу разные тесты), но спасибо, что нашли время ответить.
driis
6
+1, так как это один из многих правильных ответов на этот вопрос. исключение SO в статическом методе одного из моих классов вызвало эту проблему.
Питер Т. ЛаКомб мл.
6
+1, я тоже это видел. Отладка теста (в VS 11) довольно быстро обнаруживает проблему.
Джереми МакГи
Согласен с Джереми. Если вы отлаживаете модульные тесты, они должны останавливаться там, где возникает исключение. Однако, если вы просто запустите модульные тесты, все они загорятся зеленым светом. Очень странно.
Эндрю Стивенс
8

Я смог найти источник моей проблемы, просмотрев файл результатов теста (/TestResults/*.trx). Он предоставил полную информацию об исключении, которое произошло в фоновом потоке, и как только я разрешил это исключение, «агент обработал остановился ... "ошибка исчезла.

В моем случае я непреднамеренно запускал графический интерфейс в своем модульном тесте, что в конечном итоге привело к возникновению исключения 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

В моем случае решение было решено путем проверки окна вывода .

'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, который выдавал ошибку в отдельном потоке.

Bendewey
источник
как ты это решил? Я использую пример кода из M $, который обертывает FileSystemWatcher в сервисе и создает вокруг него рабочий процесс WF. Я получаю много таких ...
ekkis
В моем случае два теста не прошли. Когда я перешел на панель « Вывод» и выбрал « Тесты» , он упомянул: «Один из фоновых потоков выдал исключение» ... на самом деле, меня ждали 9 исключений NullReferenceExceptions с трассировками стека. Спасибо, это было очень полезно!
Qwertie
3

Я столкнулся с той же проблемой и решил ее при удалении

Environment.Exit(0);

Итак, я почти уверен, что эта ошибка возникает, когда ваш тест или тестируемый метод вызывает завершение выполняемого процесса.

Гон
источник
2

Спасибо за вопрос. Я только что столкнулся с этой проблемой и выяснил причину, с которой вы можете столкнуться.

Возможно, произошло асинхронное исключение

Во время моей тестовой настройки я создаю объект, который ставит рабочий поток в очередь в пуле потоков. Если я достаточно быстро прохожу отладку, мой код проходит.

Если рабочий поток запускается и имеет ошибку ДО завершения настройки теста, я получаю результат «Прервано» без каких-либо объяснений.

Если рабочий поток запускается и появляется ошибка ПОСЛЕ начала теста, я получаю результат: Ошибка - процесс агента был остановлен во время выполнения теста.

Важно отметить: это компонент, который я использую в нескольких своих тестах. Если среда тестирования обнаруживает слишком много этих ошибок, она прерывает остальные тесты.

Надеюсь это поможет

оборота Brent VanderMeide
источник
Спасибо за ответ. Я знаю, что асинхронные исключения могут вызывать нечто подобное тому, что я вижу, но я почти уверен, что это не так. Код предназначен для веб-приложения, и мы ничего не делаем асинхронно. Кроме того, кажется, что неудачный тест является случайным.
driis
2

Я добавил блоки try / catch в дескруктор ~ ClassName () {}, которые были определены в любом классе, участвующем в моих тестах. Это устранило проблему для меня.

~MyClass()
{
    try
    {
        // Some Code
    }
    catch (Exception e)
    {
        // Log the exception so it's not totally hidden
        // Console.WriteLine(e.ToString());
    }
}
Джаррод Чесни
источник
2

Чтобы узнать, где возникло исключение, щелкните гиперссылку «Ошибка выполнения теста» рядом с восклицательным значком в окне результатов теста. Откроется окно с трассировкой стека.

Это очень помогает отследить ошибку!

ЧерныйTuareg
источник
1

У меня была такая же проблема, и она была вызвана финализатором для неуправляемого ресурса (средство записи файлов, которое по какой-то причине не удалялось должным образом).

После обертывания кода финализатора в try-catch, который проглатывает исключение, проблема исчезла. Я не рекомендую проглатывать подобные исключения, поэтому, очевидно, было бы разумно выяснить, почему это исключение вообще возникает.

Бен Стабайл
источник
1

У меня такое случалось в странном случае, и почти всегда виноватым оказывается зацикливание.

Как ни странно, все тесты нормально работали на машинах разработки, а затем случайным образом терпели неудачу на серверах сборки.

При более внимательном рассмотрении выяснилось, что хотя тесты были указаны как пройденные в ящиках разработчиков, были выброшены исключения. Исключения выдавались в отдельном потоке, который не воспринимался как ошибка.

Сведения об исключении записывались в протокол трассировки теста, поэтому мы смогли определить, какой код / ​​тесты необходимо изменить.

Надеюсь, это кому-то поможет.

Ясень
источник
0

В моем случае у меня были юнит-тесты для WCF-сервиса. Эта служба WCF запускала 2 таймера.
Эти таймеры вызвали побочные эффекты.
-> Я отключил эти таймеры по умолчанию и все нормально!

Кстати: я использую WCFMock для подделки службы WCF, поэтому у меня есть «настоящие» модульные тесты для моей службы WCF.

Питер Гфадер
источник
0

Эта ошибка была вызвана и у меня Finalizer.
Финализатор на самом деле вызывал некоторый код БД, который не был имитирован. Мне потребовалось время, чтобы найти его, так как это был не тот курс, который я написал, и ссылка на него была похоронена на несколько классов.

Cwoo
источник
0

Я столкнулся с аналогичной проблемой, когда тест не проходит в TestInitialize, а также выполняет код из ddl из другого моего проекта. Я получаю сообщение об ошибке, как описано выше, и если я пытаюсь отладить тест, тест просто прерывается без каких-либо подробностей об исключении.

Я подозреваю, что проблема может заключаться в том, что библиотеки DLL из моего другого проекта взяты из проекта Visual Studio 2012, и я запускаю свои тесты в проекте VS2010, и / или, возможно, версии DLL UnitTestFramwork из двух проектов не совпадают.

DevDave
источник
0

Проблема также может быть вызвана исключением или потоком стека в конструкторе TestClass.

Фил Соеди
источник
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

Это действительно было исключение нулевой ссылки в методе, вызванном из финализатора класса.

Диб
источник
0

Для тех, кто задается этим старым вопросом и задается вопросом, что выбрасывается из их цепочек (ов), вот совет. Использование Task.Run (в отличие, скажем, от Thread.Start) будет гораздо более надежно сообщать об исключениях дочерних потоков. Короче вместо этого:

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

Сделай это:

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

И ваши журналы ошибок должны быть намного полезнее.

Джейсон
источник