2011-06-30 38 views
6

Ben Birimi bir dizi WebClient'a çağrıları bir kaynak indirmek için yapar (testler tek iş parçacıklı çalıştırılır eğer bu, gayet önemli çalışıyor ) paralel içinde çalıştırmak Testleri sahip Bu, tutarlı bir şekilde 30 saniyenin üzerine çıkar ve bu, Birim sınamasının aşağıdaki iki iletiden biriyle kuvvetle çıkmasına neden olur:VS UnitTest - iş parçacığı iptal edildi

İş parçacığı iptal edildi.

İş parçacığının çalıştığı uygulama etki alanı kaldırıldı.

Ben [Timeout] niteliğinin kurulması denedi, hatta hiç şans ile, WebClient'tır parçacığı üzerinde birim test parçacığı beklemesi için bir EventWaitHandle oluşturarak dahil olmak üzere çeşitli app.config ayarları. Test Zaman Aşımları ayarlarını Test Ayarları altında kontrol ettim ve varsayılan 30 dakika olarak ayarlandı.


Düzenleme 2: http://connect.microsoft.com/VisualStudio/feedback/details/587390/threadabortexception-when-running-two-tests-in-parallel-one-taking-40-seconds

Düzenleme: İşte

olan @peer tarafından belirtildiği gibi

, bu VS.Net Testi Çerçevede bilinen bir hatadır Sorunu yeniden üretecek en basit senaryo. Bu Birim Testlerinin tamamlanmasını sağlar ve eğer öyleyse, nasıl? Bu testler paralel olarak çalıştırılmalıdır! Yeni bir Visual Studio Birim Sınama projesi başlatın ve aşağıdaki ayarları ve Test Yöntemi kodunu kullanın. Çalıştırdığınızda, aslında paralel olarak çalıştığından emin olun (yani, birden çok çekirdeğe sahip bir işlemciye ihtiyacınız olacak ve aynı anda çalıştıklarını kontrol etmeliyim. Paralel koşmaları için bunları almam gerektiğini öğrendim. ayarları, daha sonra projeyi kapatın ve paralelleştirme uygulanmadan önce tekrar açın.

Local.testsettings (sizin işlemci için geçerli olursa olsun, parallelTestCount="#" ekleyin):

<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 (açýklama 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 (ilk ünite testi, 35 saniye uyur):

0 Doğru kurulum paralelliğini varsa

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

, her iki testler ile, bir ThreadAbortException ile başarısız olacağını bulacaksınız:

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

UnitTest2.cs (ikinci birim test, 35 saniye kişilik) Üstteki iki mesajdan biri. Bu yöntemleri 30 saniyeden daha uzun süre çalıştırmayı nasıl söyleyebilirim?

+0

benim için çalışmak görünüyor

-Chris ... –

+0

ben yapılacak doğru şey web hizmeti Mock için Rhino veya MOQ gibi alaycı bir çerçeve kullanmak olduğunu düşünüyorum. Bir Birim testinde W'leri aramak iyi bir uygulama değildir. – boca

+0

@MikeGoatly: Bir parçayı kaçırdığımı anladım. Paralel yürütme yapana kadar benim için iyi çalışıyor, sonra hata mesajlarını alıyorum. – mellamokb

cevap

3

Menüde gitmeli: Testi -> Edit Testi Ayar -> sekmesine geçerli test yapılandırma

Git: Test Zaman aşımları

Değişim istediğiniz herhangi zamana aşımı.

+0

@peer: Şu an 30 dakikaya ayarlandı ... – mellamokb

+0

Testiniz iyi çalışıyor. En olası sorun, kullanılan yapılandırmanın düzenlediğiniz yapılandırma olmamasıdır. 1 saniyeden sonra bitip bitmeyeceğini görmek için zaman aşımını 1 saniye olarak değiştirmeyi deneyin. – Peter

+0

@peer: Çalışmayı bıraktığını keşfetti. Tek parçalı testi çalıştırdığımda, benim için de iyi çalışıyor. Paralel olarak birden çok test çalıştırdığımda, 'Thread' iptal edildi 'mesajını tekrar almaya başlıyorum. – mellamokb

1

Test ayarlarınız belki de zaman aşımıyla mı yapılandırılmış?

enter image description here

+0

Şu anda 30 dakika olarak yapılandırıldı ... – mellamokb

+0

mantıklı, bu varsayılan. – bryanbcook

+0

Çalışmayı bıraktığını keşfetti. Tek parçalı testi çalıştırdığımda, benim için de iyi çalışıyor. Paralel olarak birden fazla test çalıştırdığımda, iş parçacığı tekrar İp atılıyor mesajı almaya başlıyorum – mellamokb

0

Ben de sadece çok dişli testi ile bu var.

Test, görevdeki çalışmadan önce iddiaya geçiyordu. Kovucu başarısız oldu ve test koşumu görevi iptal etti.

Görev tamamlanıncaya kadar bir bekleme döngüsü ekledim ve her şey bir çekicilik gibi çalıştı.

İlgili konular