VS UnitTest — поток был прерван

У меня есть набор модульных тестов, выполняемых параллельно (это важно, он отлично работает, если тесты выполняются в однопоточном режиме), которые вызывают WebClient для загрузки ресурса. который постоянно занимает более 30 секунд, и это приводит к принудительному завершению модульного теста с одним из следующих двух сообщений:

Тема была прервана.

Домен приложения, в котором выполнялся поток, был выгружен.

Я пытался установить атрибут [Timeout], различные настройки app.config, в том числе даже создать EventWaitHandle, чтобы заставить поток модульного теста ожидать в потоке WebClient, но безуспешно. Я проверил настройки времени ожидания теста в разделе «Настройки теста», и по умолчанию установлено значение 30 минут.


Редактировать 2:

Как указывает @peer, это известная ошибка в тестовой среде VS.Net: параллельные тесты, занимающие 40 секунд" rel="noreferrer">http://connect.microsoft.com/VisualStudio/feedback/details/587390/threadabortexception-when-running-two-tests-in- параллельно-одна-занимает-40-секунд

Изменить:

Вот простейший сценарий, который воспроизведет проблему. Можете ли вы заставить эти модульные тесты работать до конца, и если да, то как? Эти тесты должны выполняться параллельно! Запустите новый проект модульного тестирования Visual Studio и используйте следующие параметры и код метода тестирования. При запуске убедитесь, что они действительно работают параллельно (т. е. вам понадобится процессор с несколькими ядрами, и убедитесь, что они работают одновременно. Я обнаружил, что для того, чтобы заставить их работать параллельно, я должен применить все настройки, затем закройте проект и снова откройте его, прежде чем будет применено распараллеливание).

Local.testsettings (добавьте parallelTestCount="#", если это применимо к вашему процессору):

<Description>These are default test settings for a local test run.</Description>
<Deployment enabled="false" />
<Execution parallelTestCount="4">
  <TestTypeSpecific />
  <AgentRule name="Execution Agents">
  </AgentRule>
</Execution>

TraceAndTestImpact.testsettings (закомментируйте DataCollectors):

<Description>These are test settings for Trace and Test Impact.</Description>
<Execution parallelTestCount="0">
  <TestTypeSpecific />
  <AgentRule name="Execution Agents">
    <!--<DataCollectors>
      <DataCollector uri="datacollector://microsoft/SystemInfo/1.0" assemblyQualifiedName="Microsoft.VisualStudio.TestTools.DataCollection.SystemInfo.SystemInfoDataCollector, Microsoft.VisualStudio.TestTools.DataCollection.SystemInfo, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" friendlyName="System Information">
      </DataCollector>
      <DataCollector uri="datacollector://microsoft/HttpProxy/1.0" assemblyQualifiedName="Microsoft.VisualStudio.TraceCollector.HttpProxyCollector, Microsoft.VisualStudio.TraceCollector, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" friendlyName="ASP.NET Client Proxy for IntelliTrace and Test Impact">
      </DataCollector>
      <DataCollector uri="datacollector://microsoft/TestImpact/1.0" assemblyQualifiedName="Microsoft.VisualStudio.TraceCollector.TestImpactDataCollector, Microsoft.VisualStudio.TraceCollector, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" friendlyName="Test Impact">
      </DataCollector>
      <DataCollector uri="datacollector://microsoft/TraceDebugger/1.0" assemblyQualifiedName="Microsoft.VisualStudio.TraceCollector.TraceDebuggerDataCollector, Microsoft.VisualStudio.TraceCollector, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" friendlyName="IntelliTrace">
      </DataCollector>
    </DataCollectors>-->
  </AgentRule>
</Execution>

UnitTest1.cs (первый модульный тест, бездействует 35 секунд):

[TestMethod]
public void TestMethod1()
{
    Thread.Sleep(35000);
    // in default unit test settings, this line will never be reached
    Console.WriteLine("TestMethod1");
}

UnitTest2.cs (второй модульный тест, бездействует 35 секунд):

[TestMethod]
public void TestMethod2()
{
    Thread.Sleep(35000);
    // in default unit test settings, this line will never be reached
    Console.WriteLine("TestMethod2");
}

Если вы правильно настроили распараллеливание, вы обнаружите, что оба теста не пройдут с ThreadAbortException, с любым из двух сообщений, представленных вверху. Как я могу заставить эти методы работать дольше 30 секунд??


person mellamokb    schedule 30.06.2011    source источник
comment
Я думаю, что правильно было бы использовать фиктивную среду, такую ​​​​как Rhino или Moq, для имитации веб-сервиса. Вызов Ws в модульном тесте не является хорошей практикой.   -  person boca    schedule 30.06.2011
comment
@MikeGoatly: я понял, что мне чего-то не хватает. У меня это работает нормально, пока я не сделаю его параллельным выполнением, тогда я получаю сообщения об ошибках.   -  person mellamokb    schedule 30.06.2011


Ответы (3)


Вы должны перейти в меню: Тест -> Редактировать настройки теста -> Текущая конфигурация теста

Перейдите на вкладку: Тестовые тайм-ауты

Измените время ожидания на любое удобное для вас время.

person Peter    schedule 30.06.2011
comment
Ваш тест работает нормально. Наиболее вероятная проблема заключается в том, что используемая конфигурация отличается от той, которую вы редактируете. Попробуйте изменить тайм-аут на 1 секунду и посмотрите, закончится ли он через 1 секунду. - person Peter; 30.06.2011
comment
@peer: обнаружил, почему он перестает работать. Когда я запускаю тест в однопоточном режиме, у меня он тоже работает нормально. Когда я запускаю несколько тестов параллельно, я снова начинаю получать сообщение Thread was being aborted. - person mellamokb; 30.06.2011
comment
Это ошибка в тестовой среде vs.net: connect.microsoft.com/VisualStudio/feedback/details/587390/ - person Peter; 01.07.2011
comment
Отметьте ваш ответ как ответ на данный момент, так как у вас есть ответ в вашем комментарии. - person mellamokb; 01.07.2011

Возможно, у вас в настройках теста настроен тайм-аут?

введите здесь описание изображения

person bryanbcook    schedule 30.06.2011
comment
имеет смысл, это по умолчанию. - person bryanbcook; 30.06.2011
comment
Обнаружил, из-за чего он перестает работать. Когда я запускаю тест в однопоточном режиме, у меня он тоже работает нормально. Когда я запускаю несколько тестов параллельно, я снова начинаю получать сообщение о том, что поток был прерван. - person mellamokb; 30.06.2011

Я также только что получил это с многопоточным тестом.

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

Я добавил цикл ожидания, пока задача не будет завершена, и все заработало как часы.

-Крис

person CCondron    schedule 13.10.2015