2010-06-21 7 views
22

Szybkie pytanie, używam ramy testowej Visual Studio do testowania jednostkowego. Zastanawiasz się, jaka jest różnica między używaniem konstruktora do wykonywania pracy inicjalizującej a używaniem metody z atrybutem [TestInitialize()]?Jaka jest różnica między używaniem konstruktora w ramach VS Testing a atrybutem TestInitialize()?

+1

możliwy duplikat [Czy używasz TestInitialize lub konstruktora klasy testowej do przygotowania każdego testu? i dlaczego?] (http://stackoverflow.com/questions/334515/do-you-use-testinitialize-lub-test-class-constructor-to-prepare-each-test-and) – mafu

Odpowiedz

11

This post zawiera przegląd różnych metod. Jak widać, ctor jest wywoływany bezpośrednio przed ClassInitialize (tylko raz, oczywiście) i TestInitialize.

Połóż rzeczy wymagające kodu w ClassInitialize w swojej metodzie TestInitialize. Wszystko, co powinno zostać skonfigurowane przed ClassInitialize idzie w ctor.

Zawartość, oczywiście, TestInitialize zostanie wykonana przed każdym testem. Odpowiednią metodą zamykania po każdym teście jest TestCleanup. Dla klas użyj ClassCleanup. To samo dotyczy również zespołów (AssemblyInitialize/Cleanup).

Further reading

+0

Twoje pierwsze dwa zdania są nieprawidłowe. Ctor jest wywoływany przed każdym testem (który otrzymuje własne wystąpienie). 'ClassInitialize' jest wywoływane (raz) przed jakimkolwiek ctor (a więc i jakimkolwiek testem) - dlatego musi być statyczne! –

+0

Ten ans nie jest właściwy. @ OhadSchneider's ma rację –

+0

@PingJin, jeśli się ze mną zgodzisz, mógłbyś odpowiedzieć na moją odpowiedź ... :) –

2

ctor dla inicjowania obiektu.

TestInitialize służy do inicjowania dowolnych obiektów lub danych potrzebnych do uruchomienia testu.

+4

Ale biorąc pod uwagę, że obiekt, który budujesz, jest klasą testową, z pewnością jedyną rzeczą, którą zainicjowałbyś w tym konstruktorze, jest: obiekty lub dane potrzebne do uruchomienia testu ... – bacar

+2

Aby wyjaśnić, TestInitialize działa przed każdym testem, więc jeśli zainicjujesz tutaj obiekty, zostaną one ponownie utworzone dla każdego testu. To jest dobra praktyka. W przeciwnym razie ten sam obiekt byłby dzielony we wszystkich testach w klasie, co jest dużym testem jednostkowym. –

1

Konceptualnie są one takie same, ponieważ MSTest tworzy nowe wystąpienie klasy testowej przed każdym wykonaniem testu. Jednak technicznie istnieje kilka różnic:

  1. Ctor jest wywoływany przed TestInitialize (nic dziwnego, ponieważ to druga metoda instancji).
  2. Masz dostęp do TestContext w TestInitialize.
  3. Więcej scenariuszy dziedziczenia jest włączonych za pomocą TestInitialize: https://stackoverflow.com/a/8689398/67824.
  4. Możesz przypisać readonly pola w ctor. Myślę, że to bardzo ważne: https://stackoverflow.com/a/45270180/67824.
Powiązane problemy