Czy możliwe jest wykonanie kodu raz przed uruchomieniem wszystkich testów?

112

Zasadniczo chciałbym powiedzieć MSTest, aby wykonał kawałek kodu przed uruchomieniem serii przebiegów testowych, zasadniczo to, co chciałbym zrobić, to to samo, co wklejenie kodu Main().

Powodem, dla którego chciałbym to zrobić, jest to, że chciałbym przeprowadzić logowanie za pomocą log4net podczas moich testów integracji. Nie mogę po prostu użyć log4net.Config.XmlConfiguratoratrybutu assemblera, ponieważ zanim odczyta go w moim zestawie testowym, już wywołał LoggerManager. Dokumentacja zaleca jawne konfigurowanie log4net w punkcie wejścia kodu - ale gdzie to jest w moich testach?

Muszę mieć możliwość uruchamiania testów w programie TestDriven.NET i MSTest runner.

George Mauer
źródło

Odpowiedzi:

153

FWIW, możesz użyć atrybutu AssemblyInitialize, aby uruchomić kod przed wykonaniem wszystkich testów jednostkowych w zestawie:

[TestClass]
public class SetupAssemblyInitializer
{
    [AssemblyInitialize]
    public static void AssemblyInit(TestContext context)
    {
        // Initalization code goes here
    }
}

Jeśli masz więcej niż jeden zestaw testów jednostkowych, nie znam niczego, co obejmuje więcej niż jeden zestaw.

O ile mi wiadomo, jest to tak blisko, jak to tylko możliwe, do głównego odpowiednika.

Zwróć uwagę, że AssemblyInitializemetoda -decorated musi znajdować się w TestClassklasie -decorated, która zawiera przynajmniej jedną TestMethodmetodę -decorated, w przeciwnym razie nie zostanie wykonana!

Mark Seemann
źródło
1
Miałem podobny problem (tylko dla MSTest) i działałem dobrze. Dzięki :)
Oscar Foley
1
Dla każdego, kto ma problemy z uruchomieniem tego zarówno z MsTest, jak i TestDriven.NET, możesz użyć flagi statycznej, aby określić, czy uruchomić kod w ClassInitialize (to nie działa w MsTest).
Carl
7
Uwaga: Aparat testowy uruchamia metodę, która jest oznaczona atrybutem AssemblyInitialize tylko wtedy, gdy ta metoda jest członkiem klasy, która jest oznaczona atrybutem TestClass.
Jowen
5
@Jowen: aparat testowy uruchamia metodę, która jest oznaczona atrybutem AssemblyInitialize tylko wtedy, gdy ta metoda jest członkiem klasy, która jest oznaczona atrybutem TestClass and contains methods that are marked with the TestMethod attribute.
2015
3
Metoda oznaczona AssemblyInitialize będzie działać w Visual Studio 2015 Ultimate bez innych metod oznaczonych atrybutami TestMethod.
Chris
63

Aby zakończyć, oto opcje „uruchom kod przed” dla MSTest:

  • Służy [AssemblyInitialize]do uruchamiania kodu raz na zestaw, przed uruchomieniem jakiegokolwiek testu w tym zestawie.
  • Służy [ClassInitialize]do uruchamiania kodu raz na klasę, przed każdym testem w klasie, w której zdefiniowano metodę.
  • Służy [TestInitialize]do uruchamiania kodu przed każdym testem w klasie, w której zdefiniowano metodę.
Konamiman
źródło
12
Odpowiednikiem oczyszczania z tych właściwości jest sufiks czyszczenia (np ClassCleanup) na rozdarcie w dół operacji
Yair Nevet
13

Widzę to w nagłówku MS Test.

// Use ClassInitialize to run code before running the first test in the class
//[ClassInitialize()]
//public static void MyClassInitialize(TestContext testContext) { }

Byłoby to uruchamiane przed testami w jednej klasie.

Wygląda na to, że chcesz coś uruchomić przed wszystkimi testami.

Istnieje również opcja skryptu instalacyjnego w konfiguracji uruchomienia testowego.

Maestro1024
źródło
O ile czegoś nie brakuje, skrypty instalacyjne nie pomogą w uruchomieniu kodu w testowej domenie AppDomain.
George Mauer
2
To prawdopodobnie ja. Nie jestem pewien, czy podążam za Tobą, kiedy mówisz „uruchamianie kodu w testowej domenie AppDomain”. Odczytałem twoje pytanie jako chęć wykonania kodu przed serią testów, gdyby było to coś innego, co jest inne. „Skrypty instalacyjne i skrypty czyszczące są uruchamiane przed i po testach, niezależnie od typów testów zawartych w tych przebiegach testowych”. msdn.microsoft.com/en-us/library/ms182480%28VS.80%29.aspx
Maestro1024