Bezdepbonusu7Программирование: статьи и ответы

Вопрос

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

Автор вопроса: mellamokbОтветов: 3

У меня есть набор модульных тестов, выполняемых параллельно (это важно, он отлично работает, если тесты выполняются в однопоточном режиме), которые вызывают 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 секунд??

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

unit-testingmultithreadingtimeout

Ответы

Ответ 1 · рейтинг 4 · Peter

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

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

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

Ответ 2 · рейтинг 1 · bryanbcook

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

Ответ 3 · CCondron

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

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

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

-Крис

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы