VS UnitTest - тема была прервана - PullRequest
6 голосов
/ 30 июня 2011

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

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

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

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


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

Как указано @peer, это известная ошибка в VS.Net Test Framework: http://connect.microsoft.com/VisualStudio/feedback/details/587390/threadabortexception-when-running-two-tests-in-parallel-one-taking-40-seconds

Edit:

Вот самый простой сценарий, который воспроизведет проблему. Можете ли вы заставить эти модульные тесты запускаться до конца, и если да, то как? Эти тесты должны выполняться параллельно! Запустите новый проект модульного тестирования 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 секунд ??

Ответы [ 3 ]

3 голосов
/ 30 июня 2011

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

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

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

1 голос
/ 30 июня 2011

Возможно, ваши настройки теста настроены с таймаутом?

enter image description here

0 голосов
/ 14 октября 2015

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

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

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

-Chris

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...