VS UnitTest - 线程被中止

mel*_*okb 7 .net c# multithreading unit-testing timeout

我有一组并行运行的单元测试(这很重要,如果测试是单线程运行的,它可以正常运行),这使得调用WebClient下载一直需要30秒才能返回的资源,这会导致单元使用以下两条消息之一进行测试以强制退出:

威胁已经被清除了.

已卸载运行该线程的应用程序域.

我已经尝试设置[Timeout]属性,各种app.config设置,甚至包括创建一个EventWaitHandle使单元测试线程在WebClient线程上等待,没有运气.我检查了测试设置下的测试超时设置,并将其设置为默认值30分钟.


编辑2:

如@peer所示,这是VS.Net测试框架中的一个已知错误:http://connect.microsoft.com/VisualStudio/feedback/details/587390/threadabortexception-when-running-two-tests-in-parallel 酮-既能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>
Run Code Online (Sandbox Code Playgroud)

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>
Run Code Online (Sandbox Code Playgroud)

UnitTest1.cs(第一次单元测试,休眠35秒):

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

UnitTest2.cs(第二次单元测试,睡35秒):

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

如果您正确设置了并行化,您将发现两个测试都将失败,其中a ThreadAbortException,两个消息中的任何一个都显示在顶部.如何判断这些方法运行时间超过30秒?

Pet*_*ter 5

您应该转到菜单:测试 -> 编辑测试设置 -> 当前测试配置

转到选项卡:测试超时

将超时更改为您喜欢的任何时间。

  • 这是 vs.net 测试框架中的一个错误:http://connect.microsoft.com/VisualStudio/feedback/details/587390/threadabortexception-when-running-two-tests-in-parallel-one-takeing-40-秒 (6认同)