2011-06-30 30 views
6

Tôi có một tập hợp các Unit Tests chạy song song (này là quan trọng, nó hoạt động tốt nếu các cuộc thử nghiệm đang chạy đơn luồng) mà làm cho các cuộc gọi đến WebClient để tải về một tài nguyên thường xuyên mất hơn 30 giây để quay trở lại và điều này làm cho Bài kiểm tra đơn vị thoát ra một cách hiệu quả với một trong hai thông báo sau:VS UnitTest - Chủ đề được bị hủy bỏ

Chủ đề bị hủy.

Miền ứng dụng mà chuỗi đang chạy đã được tải xuống.

Tôi đã cố gắng thiết lập các thuộc tính [Timeout], khác nhau app.config cài đặt, bao gồm cả thậm chí tạo ra một EventWaitHandle để làm cho đơn vị kiểm tra chủ đề chờ đợi trên thread WebClient, không có may mắn. Tôi đã kiểm tra cài đặt Thời gian chờ thử nghiệm trong Cài đặt thử nghiệm và cài đặt này được đặt thành mặc định là 30 phút.


Chỉnh sửa 2:

Như đã nêu bởi @peer, đây là một lỗi đã biết trong thử nghiệm Khung VS.Net: http://connect.microsoft.com/VisualStudio/feedback/details/587390/threadabortexception-when-running-two-tests-in-parallel-one-taking-40-seconds

Edit:

Đây là kịch bản đơn giản nhất sẽ tái tạo vấn đề. Bạn có thể thực hiện các Bài kiểm tra Đơn vị này để hoàn thành hay không và nếu có thì làm cách nào? Các thử nghiệm này phải được chạy song song! Bắt đầu một dự án Visual Studio Unit Test mới và sử dụng các cài đặt sau và mã Kiểm tra phương pháp. Khi bạn chạy, hãy chắc chắn rằng chúng thực sự đang chạy song song (nghĩa là bạn sẽ cần một bộ xử lý với nhiều lõi và kiểm tra xem chúng có đang chạy đồng thời không. Tôi đã tìm thấy rằng để chúng chạy song song, tôi phải áp dụng tất cả cài đặt, sau đó đóng dự án và mở lại nó trước khi áp dụng song song).

Local.testsettings (thêm parallelTestCount="#", bất cứ điều gì áp dụng cho bộ vi xử lý của bạn):

<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 (ghi chú bên ngoài 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 (kiểm tra đơn vị đầu tiên, ngủ 35 giây):

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

UnitTest2.cs (kiểm tra đơn vị thứ hai, ngủ 35 giây):

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

Nếu bạn có song song một cách chính xác thiết lập, bạn sẽ thấy rằng cả hai bài thi sẽ thất bại, với một ThreadAbortException, với một trong hai thông điệp được trình bày ở trên cùng. Làm thế nào tôi có thể nói với các phương pháp này để chạy lâu hơn 30 giây ??

+0

Dường như làm việc cho tôi ... –

+0

Tôi nghĩ rằng điều phải làm là sử dụng một khuôn khổ mocking như Rhino hoặc Moq để thử các dịch vụ web. Gọi Ws trong một bài kiểm tra đơn vị không phải là một thực hành tốt – boca

+0

@MikeGoatly: Tôi đã tìm ra tôi đã bỏ lỡ một phần. Nó hoạt động tốt cho tôi, cho đến khi tôi thực hiện nó song song, sau đó tôi nhận được thông báo lỗi. – mellamokb

Trả lời

3

Bạn nên đến trình đơn: Kiểm tra -> Edit thử nghiệm Setting -> hiện kiểm tra cấu hình

Đến tab: Test Timeouts

Thay đổi thời gian chờ để bất kỳ lúc nào bạn muốn.

+0

@peer: Hiện được định cấu hình là 30 phút ... – mellamokb

+0

Bài kiểm tra của bạn hoạt động tốt. Vấn đề rất có thể là cấu hình được sử dụng, không phải là cấu hình bạn đang chỉnh sửa. Hãy thử thay đổi thời gian chờ thành 1 giây để xem có kết thúc sau 1 giây hay không. – Peter

+0

@peer: Đã khám phá điều khiến nó ngừng hoạt động. Khi tôi chạy thử nghiệm đơn luồng, nó hoạt động tốt cho tôi là tốt. Khi tôi chạy nhiều kiểm tra song song, sau đó tôi bắt đầu nhận được thông điệp 'Thread bị hủy bỏ 'một lần nữa. – mellamokb

1

Có lẽ cài đặt thử nghiệm của bạn được định cấu hình với thời gian chờ?

enter image description here

+0

Hiện được định cấu hình là 30 phút ... – mellamokb

+0

có ý nghĩa, đó là mặc định. – bryanbcook

+0

Đã khám phá điều khiến nó ngừng hoạt động. Khi tôi chạy thử nghiệm đơn luồng, nó hoạt động tốt cho tôi là tốt. Khi tôi chạy nhiều kiểm tra song song, sau đó tôi bắt đầu nhận được các chủ đề đã bị hủy bỏ thông điệp một lần nữa – mellamokb

0

Tôi cũng chỉ có điều này với thử nghiệm đa luồng.

Bài kiểm tra đã được chuyển sang khẳng định trước khi thực hiện công việc trong công việc. Các khẳng định thất bại và khai thác kiểm tra hủy bỏ nhiệm vụ.

Tôi đã thêm một vòng lặp chờ cho đến khi tác vụ hoàn tất và mọi thứ hoạt động như một nét duyên dáng.

-Chris

Các vấn đề liên quan