Kiedy używam atrybutu TestFixtureSetUp zamiast domyślnego konstruktora?

Dokumentacja NUnit nie mówi mi, kiedy użyć metody z TestFixtureSetup i kiedy wykonać setup w konstruktorze.

public class MyTest
{
    private MyClass myClass;

    public MyTest()
    {
        myClass = new MyClass();
    }

    [TestFixtureSetUp]
    public void Init()
    {
        myClass = new MyClass();
    }
}

Czy są jakieś dobre / złe praktyki dotyczące TestFixtureSetup kontra konstruktor domyślny, czy nie ma żadnej różnicy?

Author: abatishchev, 2008-10-17

9 answers

Myślę, że to był jeden z problemów, który nie został rozwiązany przez zespół nUnit. Jednak istnieje doskonały Projekt xUnit , który dostrzegł dokładnie ten problem i zdecydował, że konstruktory są dobrą rzeczą do użycia nainicjalizacji urządzenia testowego .

Dla nunit, moją najlepszą praktyką w tym przypadku było użycie TestFixtureSetUp, TestFixtureTearDown, SetUp, i TearDown metody opisane w dokumentacji.

Myślę, że pomaga mi również, gdy nie myślę o oprawie testowej nUnit jako normalna Klasa, mimo że definiujesz ją za pomocą tej konstrukcji. Myślę o nich jak o oprawach, a to pozwala mi przezwyciężyć mentalną przeszkodę i pozwala mi przeoczyć ten problem.

 13
Author: casademora,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-11-06 17:08:46

Dlaczego miałbyś używać konstruktora w swoich klasach testowych?

Używam [SetUp] i [TearDown] oznaczonych metod do wykonania kodu przed i po każdym teście, i podobnie [TestFixtureSetUp] i [TestFixtureTearDown] oznaczonych metod do wykonania kodu tylko raz przed i po wykonaniu wszystkich testów w urządzeniu.

Myślę, że prawdopodobnie mógłbyś zastąpić [TestFixtureSetUp] konstruktorem (chociaż nie próbowałem), ale to tylko wydaje się zrywać z jasną konwencją, Że oznaczone metody zapewnij.

 63
Author: Sam Wessel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-11-06 17:09:44

Jedną z rzeczy, których nie możesz zrobić z [TestFixtureSetup], którą możesz zrobić w konstruktorze, jest odbiór parametrów z [TestFixture].

Jeśli chcesz sparametryzować swoje urządzenie testowe, musisz użyć konstruktora przynajmniej niektóre konfiguracji. Do tej pory używałem tego tylko do testów integracyjnych, np. do testowania warstwy dostępu do danych z wieloma dostawcami danych:

[TestFixture("System.Data.SqlClient",
  "Server=(local)\\SQLEXPRESS;Initial Catalog=MyTestDatabase;Integrated Security=True;Pooling=False"))]
[TestFixture("System.Data.SQLite", "Data Source=MyTestDatabase.s3db")])]
internal class MyDataAccessLayerIntegrationTests
{
    MyDataAccessLayerIntegrationTests(
        string dataProvider,
        string connectionString)
    {
        ...
    }
}
 12
Author: Ergwun,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-08-27 01:36:39

Często zastanawiałem się, jaka jest potrzeba [TestFixtureSetUp], biorąc pod uwagę, że istnieje prosty, dobrze zrozumiany język pierwszej klasy, który robi dokładnie to samo.

Preferuję użycie konstruktorów, aby skorzystać ze słowa kluczowego readonly, dzięki czemu zmienne członkowskie nie mogą zostać ponownie uruchomione.

 9
Author: Richard Everett,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-11-06 17:10:38

Istnieje różnica między konstruktorem a metodą oznaczoną atrybutem [TestFixtureSetUp]. Według dokumentacji NUnit:

Wskazane jest, aby konstruktor nie miał żadnych skutków ubocznych, ponieważ NUnit może konstruować obiekt wielokrotnie w trakcie sesji.

Więc jeśli masz jakąś kosztowną inicjalizację, lepiej użyć TestFixtureSetUp.

 8
Author: oderibas,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-11-06 17:10:52

Myślę, że mam negatywną dobrą odpowiedź - powód, aby użyć konstruktora zamiast atrybutu, jest wtedy, gdy masz dziedziczenie między klasami testowymi.

Zostanie wywołana tylko jedna metoda z adnotacją [TestFixtureSetup] (tylko na klasie concrete), ale inne inicjalizatory fixture nie będą. W tym przypadku wolałbym umieścić inicjalizację w konstruktorze, który ma dobrze zdefiniowaną semantykę dziedziczenia:)

 2
Author: ripper234,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-11-06 17:11:04

Ważną różnicą między constructor i TestFixtureSetUp jest to, że w NUnit 2 Kod konstruktora jest faktycznie wykonywany przy wyliczaniu testów, a nie tylko przy uruchamianiu testów, więc w zasadzie chcesz ograniczyć kod ctor do tylko wypełniania readonly, tzn. parametrów, wartości. Wszystko, co powoduje skutki uboczne lub robi żadnej rzeczywistej pracy musi być albo zawinięty w leniwy lub zrobić w TestFixtureSetUp / OneTimeSetUp. Możesz więc myśleć o konstruktorze jako o miejscu do skonfigurowania testu. Podczas gdy TestFixtureSetUp jest miejscem, w którym urządzenie testowe, wymagany stan początkowy systemu przed uruchomieniem testów, jest inicjowany.

 2
Author: Novaterata,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-03-16 17:40:09

[TestFixtureSetUp] i [TestFixtureTearDown] są dla całej klasy testowej. działa tylko raz.

[SetUp] i [TearDown] są dla każdej metody badania (badania). działa na każdy test.

 2
Author: Shankar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-04-21 09:13:10

Konstruktor i metody SetUp są używane inaczej:
Konstruktor jest uruchamiany tylko raz.
Jednakże, metody SetUp są uruchamiane wiele razy, przed wykonaniem każdego przypadku testowego.

 -2
Author: nonexistent myth,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-10-20 01:17:24