2011-06-30 22 views
6

Mam zestaw działu Testy przebiegać równolegle (to jest ważne, że działa dobrze, jeśli badania są prowadzone jednowątkowy), który sprawia, że ​​połączenia do WebClient aby pobrać zasób konsekwentnie trwa to 30 sekund, aby powrócić, a to powoduje, że test jednostek kończy się z jedną z następujących dwóch wiadomości:VS unittest - Temat był Przerwane

Wątek został przerwany.

Domena aplikacji, w której wątek był uruchomiony, została usunięta.

próbowałem ustawienie atrybutu [Timeout] różne app.config ustawienia, w tym nawet stworzenie EventWaitHandle zrobić testów jednostkowych wątku oczekiwania na wątku WebClient, bez powodzenia. Sprawdziłem ustawienia Limit czasu testu w Ustawieniach testu i ustawiono domyślne wartości 30 minut.


Edit 2:

Jak wskazano @peer, jest to znany błąd w system testowania VS.Net: http://connect.microsoft.com/VisualStudio/feedback/details/587390/threadabortexception-when-running-two-tests-in-parallel-one-taking-40-seconds

Edit:

Oto najprostszy scenariusz, który odwzoruje problem. Czy możesz sprawić, by te testy jednostek przebiegały do ​​końca, a jeśli tak, to w jaki sposób? Te testy muszą być wykonywane równolegle! Rozpocznij nowy projekt testu jednostki Visual Studio i użyj następujących ustawień i kodu metody testowej. Po uruchomieniu upewnij się, że faktycznie pracują równolegle (tzn. Będziesz potrzebował procesora z wieloma rdzeniami i sprawdź, czy działają one jednocześnie) Zauważyłem, że aby uruchomić je równolegle, muszę zastosować wszystkie ustawień, a następnie zamknij projekt i ponownie go otwórz, zanim zastosuje się proces równoległy).

Local.testsettings (dodaj parallelTestCount="#", co odnosi się do procesora):

<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 (zakomentuj 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 (pierwszy test jednostki, śpi 35 sekund):

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

UnitTest2.cs (test druga jednostka, śpi 35 sekund):

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

Jeśli masz Zrównoleglanie prawidłowo ustawiony, można zauważyć, że oba testy nie powiedzie, z ThreadAbortException, z jedna z dwóch wiadomości wyświetlanych u góry. Jak mogę powiedzieć, że te metody działają dłużej niż 30 sekund?

+0

wydaje się działać dla mnie ... –

+0

Myślę, że słuszne jest użycie ramy szyderczy jak Rhino lub Min drwić usługę internetową. Wywoływanie Ws w teście Jednostki nie jest dobrą praktyką – boca

+0

@MikeGoatly: Odkryłem, że brakuje mi jakiegoś elementu. Działa to dobrze dla mnie, dopóki nie wykonam go równolegle, a następnie dostaję komunikaty o błędach. – mellamokb

Odpowiedz

3

Należy przejść do menu: Test -> Ustawienia Edycja Test -> prąd pomiarowy config

Przejdź do zakładki: Test Timeouts

Zmiana limitu czasu dla każdej chwili chcesz.

+0

@peer: Obecnie jest skonfigurowany na 30 minut ... – mellamokb

+0

Twój test działa poprawnie. Najprawdopodobniej problem polega na tym, że używana konfiguracja nie jest konfigurowaną przez ciebie konfiguracją. Spróbuj zmienić limit czasu na 1 sekundę i sprawdź, czy kończy się po 1 sekundzie. – Peter

+0

@peer: Odkryto, co sprawia, że ​​przestał działać. Kiedy uruchomię test z pojedynczym gwintem, działa on również dobrze dla mnie. Kiedy równolegle uruchamiam wiele testów, zaczynam ponownie otrzymywać komunikat "Wątek był przerywany". – mellamokb

1

Być może Twoje ustawienia testowe są skonfigurowane z limitem czasu?

enter image description here

+0

Jest obecnie skonfigurowany na 30 minut ... – mellamokb

+0

ma sens, to jest ustawienie domyślne. – bryanbcook

+0

Odkryto, co sprawia, że ​​przestał działać. Kiedy uruchomię test z pojedynczym gwintem, działa on również dobrze dla mnie. Po uruchomieniu wielu testów równolegle, zaczynam ponownie otrzymywać komunikat o przerwaniu wątku – mellamokb

0

ja też tak mam to z wielu testów gwintowany.

Test przechodził do asercji przed wykonaniem pracy w zadaniu. Awaria nie powiodła się, a uprząż testowa przerwała zadanie.

Dodałem pętlę oczekiwania, aż zadanie zostanie zakończone i wszystko działało jak czar.

-Chris

Powiązane problemy