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