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 ??
Dường như làm việc cho tôi ... –
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
@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