7

Sądziłem, że celem tych atrybutów było ich uruchomienie tylko raz na jeden montaż. Mam prostej klasy w następujący sposób:Dlaczego [AssemblyInitialize] i [AssemblyCleanup] są wywoływane dwa razy w tym samym zespole projektu testowego?

[TestClass] 
public class AssemblyIntegrationTestSetup 
{ 
    public AssemblyIntegrationTestSetup() { } 
    public TestContext TestContext { get; set; } 

    [AssemblyInitialize] 
    public static void SetupIntegrationTests(TestContext context) 
    { 
     WindowsServiceService.Instance.StartService("Distributed Transaction Coordinator"); 
    } 

    [AssemblyCleanup] 
    public static void TeardownIntegrationTests() 
    { 
      WindowsServiceService.Instance.StopService("Distributed Transaction Coordinator"); 
    } 

} 

Jednak po uruchomieniu zestawu testów, metody inicjowania i czyszczenia na poziomie zespołu wykonują dwa razy. Oto szczegóły na temat mojego środowiska:

  1. Wszystkie klasy testów są w tym samym projekcie/złożeniu.
  2. Mam testy integracji i jednostki oddzielone przez przestrzeń nazw.
  3. Do testów integracji używam MSTextExtensions, aby umożliwić wycofywanie transakcji bazy danych.
  4. Zajmuję się również uruchamianiem/zatrzymywaniem usługi DTC MS SQL Server, która jest wymagana do przywrócenia stanu fabrycznego. Chciałem zrobić to raz na zestaw testów (i najlepszym kompromisem, jaki znalazłem, było użycie atrybutów na poziomie zespołu). Kod zadziała, ale zostanie wykonany dwukrotnie.
  5. Jeśli to ma znaczenie, używam także Microsoft Moles Framework w niektórych moich testach.

zaobserwowane zachowanie jest podobne do:

AssemblyInitialize   

Class1.TestInitialize 
Class1.TestMethod1 
Class1.TestCleanup 

AssemblyInitalize   <-- //This shouldn't be happening right? 

Class2.TestInitialize 
Class2.TestMethod1 
Class2.TestCleanup 

Class2.TestInitialize 
Class2.TestMethod2 
Class2.TestCleanup 

Class5.TestInitialize 
Class5.TestMethod1 
Class5.TestCleanup 

Class7.TestInitialize 
Class7.TestMethod1 
Class7.TestCleanup 

//More random bouncing around then... 

AssemblyCleanup 
AssemblyCleanup   <-- //This shouldn't be happening right? 

Odpowiedz

5

z artykułu MSDN Library:

Ważne

Atrybut ten nie powinien być stosowany na ASP.NET testy jednostkowe, czyli dowolny test z atrybutem [HostType ("ASP.NET")] te. Z powodu bezpaństwowego charakteru IIS i ASP.NET, metoda ozdobiona ten atrybut może być nazywany bardziej niż raz na przebieg testu.


Istnieje kilka pokręteł można dostrojenia w testowym biegacza. Chciałbym po prostu punt problem z licznikiem:

private int InitCount; 

[AssemblyInitialize] 
public static void SetupIntegrationTests(TestContext context) 
{ 
    if (InitCount++ == 0) { 
     WindowsServiceService.Instance.StartService("Distributed Transaction Coordinator"); 
    } 
} 

[AssemblyCleanup] 
public static void TeardownIntegrationTests() 
{ 
     if (--InitCount == 0) { 
      WindowsServiceService.Instance.StopService("Distributed Transaction Coordinator"); 
     } 
} 
+0

Widziałem to w dokumentacji, ale nie wiedziałem, czy to była przyczyna na pewno. Mam osobny wpis na forach Pex & Moles firmy MSDN dotyczący atrybutu HostType: http://social.msdn.microsoft.com/Forums/en-US/pex/thread/b690442b-0333-42b8-928c-6f5f8bc44b02. Nie jestem przekonany, że to jest problem, ponieważ ta uwaga dotyczy ASP.NET i IIS. Ponadto, o ile mogę powiedzieć, MS Moles po prostu nie pozwoli ci dodać atrybutu HostType do metod AssemblyInitialize/Cleanup. Ale co z innymi? O to właśnie pytam. – Matt

+0

@Matt - po zaktualizowaniu. –

1

dobrze, to odpowiedź brzmi roku bazillion późno w oparciu o pierwotnym terminie problem, ale ...

odkryłem jeśli środek testowy (QTAgent32.exe) zawiesza się lub ginie, zanim zakończy się cała sekwencja, a następnie AssemblyInitialize (i może ClassInitialize i TestInitialize) zostaną ponownie wywołane. Na przykład, umieścić to w swoim [AssemblyCleanup] Funkcja i zobaczysz zachowanie wystąpić:

Process p = AutotestShared.RunProcess("cmd", "/c taskkill /t /f /im QTAgent32.exe", true); 
p.WaitForExit(); 

Więc morał tej historii jest: Sprawdź swoje funkcje oczyszczania, aby zobaczyć, czy są jakieś awarie/korupcja. Niepowodzenia podczas czyszczenia nie są pokazywane w raporcie z testu, ponieważ asercje dotyczące przekazywania/niepowodzenia są już ukończone. Ale problemy, które powoduje, mogą pojawić się w inny sposób.

Powiązane problemy