Помилка VS 2010 Test Runner "Процес агента був зупинений під час запуску тесту".


101

У Visual Studio 2010 у мене є ряд одиничних тестів. Коли я запускаю кілька тестів одночасно за допомогою тестових списків, я іноді виявляю таку помилку для одного або декількох тестів:

Процес агента був зупинений під час запуску тесту.

Це тест ніколи не проходить, і якщо я спробую запустити тест ще раз, це успішно.

Я знайшов цей звіт про помилку на Connect , який, здається, є тією ж проблемою, але він не пропонує рішення.

Хтось ще бачив таку поведінку? Як я можу цього уникнути?

Редагувати

Я все ще відчуваю цю помилку, і тому багато моїх колег у тому ж програмному забезпеченні та програмному забезпеченні. Я досі оцінював відповіді, але вони не вирішують проблему. Я починаю щедро вирішувати цю проблему.


Я отримую те саме. Я копаюсь у цьому, але поки що немає рішення
відзначте

Будь-які новини з цього приводу? Тут же проблема ...
Пітер Гфадер,

@ Петер, дивіться мій коментар нижче прийнятої відповіді. Це було моє рішення, але я не знаю, чи схожа ваша проблема.
дріс

Я мав таку саму поведінку за неприхованим винятком. Виняток було для мене видно, коли я запускав Visual Studio на сервері збирання та отримував вікно Assert-Window. Через вікно затвердження тест не міг тривати.

Відповіді:


41

Я щойно відчував подібну проблему: деякі тести виходять з ладу, і вони різні в різних тестових запусках. Я точно не знаю причини, чому це відбувається, але це почало виникати, коли я додав фіналізатор до одного з моїх занять. Коли я відключаю фіналізатор - проблема зникає. Коли я включаю фіналізатор - проблема повертається.

Зараз я не знаю, як це подолати.


16
ДЯКУЙТЕ - ця відповідь веде мене до вирішення. У мене є лише фіналізатор на пару типів, і, напевно, видалення також усунуло проблему. Після подальшого дослідження я виявив тонкий помилку в одному фіналізаторі, який стався лише тоді, коли в конструктор було викинуто виняток, і фіналізатор намагається доопрацювати об'єкт, який не повністю побудований. Висновок: Якщо у фіналізаторі за типом трапляється виняток, і цей фіналізатор запускається до того, як всі тести закінчені, Visual Studio видасть помилку, з якою я зіткнувся; без додаткових пояснень та на випадкових тестах.
дріс

6
У мене в коді немає фіналізаторів / деструкторів ... ~ MyClass () і отримую ту ж помилку. Тести з Resharper
запускаються

6
Проблема з викривленими винятками у фіналізаторах - це особливий випадок невиконаних винятків у фонових завданнях, які можуть бути запущені або заплановані (можливо неявно) деяким тестом і можуть продовжувати виконуватись, навіть якщо тест був завершений.
саторг

1
Як і Пітер, тест-бігун Resharper дає мені все зелене. Тест-бігун VS 2010 вийшов з ладу в класі з деструктором.
RyBolt

1
Я випадково зашифрував нескінченний рекурсивний цикл у своєму методі Dispose (), який також спричинив це.
Роберт

88

Це повідомлення викликається винятком на потоці, відмінному від виконавчого тестового потоку . Усі відповіді поки що зводиться до цього простого пояснення. Відома помилка у Visual Studio не відображає жодної розумної інформації в цьому випадку.

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


Те ж саме сталося і зі мною - мій тест породив окрему нитку, яка отримувала виняток. Ловля винятку всередині потоку принаймні дозволяє мені її надрукувати і знати, що відбувається. Однак будьте обережні, щоб не вставити Assert.Fail () у блок захоплення потоку - це може призвести до окремого винятку, який поверне вас туди, де ви почали.
Кайл Крулл

4
те ж саме для мене, за винятком переповнення стека, які набагато складніше відстежувати в C # порівняно з java ...
Джон Гарднер,

Дійсно, я помітив, що це сталося, коли я почав використовувати об’єкти Thread і закликав Abort (), щоб зупинити їх.
espaciomore

1
Це трапляється і тоді, коли async voidметод, який викликається під час тесту, кидає виняток
Mathias Becher

1
Зауважте, що trx може містити інформацію про помилку, ви можете побачити її або відкривши її в текстовому редакторі, або в Visual Studio і натиснувши гіперпосилання помилки тестування у вікні Результати тестування .
Охад Шнайдер

16

У мене була ця проблема, і виявилася проблема в моєму коді, яку тест-рамка не вдавала належним чином. Трохи випадковий рефакторинг залишив мені цей код:

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

Це, звичайно, нескінченна рекурсія і спричинило StackOverflowException (я думаю). Це спричинило страх: "Процес агента був зупинений під час запуску тесту".

Швидкий контроль коду показав мені проблему, і мої тести зараз працюють нормально. Сподіваємось, це допомагає - можливо, варто ознайомитись з кодом, шукаючи проблеми, або, можливо, витягніть трохи в консольний додаток і перевірте, чи там він справно працює.


3
Це не питання (я знаю, тому що різні тести виходять з ладу щоразу), але дякую, що знайшли час для відповіді.
дріс

6
+1, оскільки це одна з багатьох вагомих відповідей на це питання. виняток ТА у сстатичному методі на одному з моїх занять викликав цю проблему.
Пітер Т. ЛаКомб-молодший,

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, Охоплений без обліку винятків, звітування через Ватсон: [Повідомлення про виняток]

У моєму випадку у мене був FileSystemWatcher, який кидав помилку на окрему нитку.


як ти це вирішив? Я використовую зразок коду з M $, який обертає FileSystemWatcher в сервісі і створює навколо цього робочий процес WF. Я отримую багато цього ...
ekkis

У моєму випадку два тести провалилися. Коли я перейшов до панелі " Вихід" і вибрав " Тести" , там було зазначено "Один з фонових потоків викинув виняток" ... насправді 9 NullReferenceExceptions чекали на мене зі слідами стека. Дякую, це було дуже корисно!
Qwertie

3

Я зіткнувся з тією ж проблемою і вирішив її під час видалення

Environment.Exit(0);

Тож я впевнений, що ця помилка виникає, коли ваш тест або метод, що випробовується, викликають завершення процесу виконання.


2

Дякуємо, що поставили запитання. Я просто зіткнувся з цією проблемою і з'ясував причину, в яку ти можеш зіткнутися.

Можливо, стався асинхронний виняток

Під час мого тестового налаштування я створюю об'єкт, який ставить в чергу робочу нитку в пулі потоків. Якщо я пробіжуся через налагодження досить швидко, мій код проходить.

Якщо робочий потік запускається і має помилку перед тим, як тестова установка завершиться, я отримую результат Скасувати без міркувань.

Якщо робочий потік починається і має помилку ПІСЛЯ тестування розпочато, я отримую результат: Помилка - Процес агента був зупинений під час запуску тесту.

Важливо зазначити: це компонент, який я використовую протягом декількох тестів. Якщо в тестовій структурі трапляється занадто багато цих помилок, вона припиняє решту тестів.

Сподіваюся, це допомагає


Дякую за відповідь. Я усвідомлюю, що асинхронні винятки можуть спричинити щось подібне до того, що я бачу, але я майже впевнений, що це не так. Код - це веб-додаток, і ми нічого не робимо асинхронно. Крім того, здається, що тест, який не вдався, є випадковим.
дріс

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

Щоб дізнатися, куди було викинуто виняток, натисніть на гіперпосилання "Тест помилки запуску" поруч із значком оклику у вікні Результати тесту. Відкриється вікно зі слідом стека.

Це дуже допомагає відстежити помилку!


1

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

Після загортання коду фіналізатора в пробний вигін, який проковтнув виняток, проблема зникла. Я не рекомендую ковтати такі винятки, тому, очевидно, було б розумно з’ясувати, чому виняток відбувається в першу чергу.


1

У мене це траплялося незвично, і винуватець майже завжди виявляється нарізаним.

Як не дивно, що всі тести спрацювали б добре на розроблювальних машинах, а потім випадково виходили з ладу на серверах збірки.

При більш детальному огляді з'ясувалося, що хоча випробування перераховувались як пройдені на скриньках для розробників, були викиди, які були викинуті. Винятки кидали на окрему нитку, яка не сприймалася як помилка.

Деталі про винятки реєструвались у тестовому слід, тож ми змогли визначити, який код / ​​тести потрібно змінити.

Сподіваюся, що це комусь допоможе.


0

У моєму випадку у мене були деякі одиничні тести на службу WCF. Ця послуга WCF запускала 2 таймери.
Ці таймери викликали побічні ефекти.
-> Я відключаю ці таймери за замовчуванням, і все в порядку!

BTW: Я використовую WCFMock для підробки послуги WCF, тому у мене є "справжні" одиничні тести навколо моєї служби WCF


0

Ця помилка була спричинена фіналізатором і для мене.
Фіналізатор влучно викликав деякий код БД, який не було вимкнено. Зайняв мене деякий час, щоб знайти його, оскільки це був не клас, про який я писав, і посилання на нього було поховане досить мало класів.


0

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

Я підозрюю, що проблема може полягати в тому, що dll з мого іншого проекту є від проекту Visual Studio 2012, і я провожу свої тести в проекті VS2010, та / або, можливо, що версії dll UnitTestFramwork з двох проектів невідповідні.


0

Проблему також може викликати виняток або Stackoverflow у конструкторі тестового класу.


0

Оскільки ця помилка може мати багато різних причин, я хотів би додати ще одну для повноти цього потоку.

Якщо всі ваші тести скасовують, як описано в ОП, причиною може бути неправильна конфігурація проекту. У моєму випадку цільова рамка була встановлена ​​на .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();

І ваші журнали помилок повинні бути набагато кориснішими.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.