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