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:
- Wszystkie klasy testów są w tym samym projekcie/złożeniu.
- Mam testy integracji i jednostki oddzielone przez przestrzeń nazw.
- Do testów integracji używam MSTextExtensions, aby umożliwić wycofywanie transakcji bazy danych.
- 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.
- 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?
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
@Matt - po zaktualizowaniu. –