Wann verwende ich das TestFixtureSetUp Attribut anstelle eines Standard-Konstruktor?

StackOverflow https://stackoverflow.com/questions/212718

  •  03-07-2019
  •  | 
  •  

Frage

Die Dokumentation NUnit hat mir nicht gesagt, wenn eine Methode mit einem TestFixtureSetup verwenden und wenn das Setup im Konstruktor zu tun.

public class MyTest
{
    private MyClass myClass;

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

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

Gibt es gute / schlechte Praktiken über die TestFixtureSetup im Vergleich zu Standard-Konstruktor oder nicht es ein Unterschied?

War es hilfreich?

Lösung

Ich denke, dies ist eines der Probleme gewesen, die nicht von dem nUnit Team gerichtet hat. Allerdings gibt es die ausgezeichneten xUnit Projekt , die genau dieses Problem gesehen und beschlossen, dass Konstrukteure eine gute Sache war zu verwenden auf Prüfadapter Initialisierung .

Für nunit, meine beste Praxis in diesem Fall war die TestFixtureSetUp, TestFixtureTearDown, SetUp zu verwenden, und TearDown Methoden wie in der Dokumentation beschrieben.

Ich denke, es hilft mir, auch wenn ich nicht glaube, eine nUnit Prüfvorrichtung als eine normale Klasse, auch wenn Sie es mit diesem Konstrukt definieren. Ich denke an sie als Spiele, und das bringt mich auf die mentale Hürde und ermöglicht es mir, dieses Problem zu übersehen.

Andere Tipps

Warum werden Sie brauchen einen Konstruktor in Ihren Testklassen zu benutzen?

Ich verwende [SetUp] und [TearDown] markierte Methoden für Code ausgeführt wird vor und nach jedem Test, und in ähnliche Weise [TestFixtureSetUp] und [TestFixtureTearDown] Methoden markierte für Code nur einmal vor und nach allen Tests in der Vorrichtung ausgeführt werden, ausgeführt wurden.

Ich denke, Sie wahrscheinlich die [TestFixtureSetUp] für einen Konstruktor ersetzen könnten (obwohl ich nicht versucht habe), aber dies scheint nur von der klaren Konvention zu brechen, dass die markierten Methoden liefern.

Eine Sache, die Sie mit [TestFixtureSetup] nicht tun können, die Sie im Konstruktor tun können, ist Parameter aus der [TestFixture] erhalten.

Wenn Sie Ihre Testvorrichtung parametrisieren wollen, dann werden Sie den Konstruktor für mindestens verwenden müssen einige des Set-up. Bisher habe ich nur verwendet, das für Integrationstests, z.B. zum Testen einer Datenzugriffsschicht mit mehreren Datenprovidern:

[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)
    {
        ...
    }
}

Ich habe mich oft gefragt, was die Notwendigkeit für [TestFixtureSetUp] wurde, da es ein einfaches, gut erstklassiges Sprachkonstrukt verstanden, die genau tut das gleiches.

Meine Präferenz ist Konstrukteure zu verwenden, nutzen Sie das Nur-Lese-Schlüsselwort Variablen sicherzustellen, Mitglied nehmen kann nicht neu initialisiert werden.

Es ist der Unterschied zwischen Konstrukteur und Verfahren mit [TestFixtureSetUp] Attribute gekennzeichnet. Nach NUnit Dokumentation:

  

Es ist ratsam, dass der Konstruktor keine Nebenwirkungen hat, da NUnit das Objekt mehrmals im Laufe einer Sitzung konstruieren kann.

Also, wenn Sie eine teure Initialisierung haben es besser ist, TestFixtureSetUp zu verwenden.

[TestFixtureSetUp] und [TestFixtureTearDown] sind für die gesamte Testklasse. nur einmal ausgeführt wird.

[SetUp] und [TearDown] sind für jedes Testverfahren (Test). läuft für jeden Test.

Ein wichtiger Unterschied zwischen Konstrukteur und TestFixtureSetUp ist, dass in NUnit 2 zumindest Konstruktorcode tatsächlich auf Test Aufzählung ausgeführt wird, nicht nur Test läuft, so dass im Grunde wollen Sie Ctor Code nur zu begrenzen, bevölkert nur lesbar, dh der Parameter, Werte . Alles, was Nebenwirkungen verursacht oder tut jede tatsächliche Arbeit muss entweder in dem TestFixtureSetUp / OneTimeSetUp in einem faulen oder getan gewickelt werden. So können Sie von dem Konstruktor denken als nur ein Ort, um den Test zu konfigurieren. Während die TestFixtureSetUp ist, wo die Testvorrichtung, bevor der erforderliche Anfangszustand des Systems Test ausgeführt werden, initialisiert wird.

Ich glaube, ich habe eine negative gute Antwort -. Den Grund, einen Konstruktor zu verwenden, anstatt des Attributs, wenn Sie eine inheritence zwischen Testklassen haben

Nur eine Methode mit [TestFixtureSetup] kommentiert wird (auf der konkreten Klasse nur) genannt werden, aber die anderen Befestigungs initializers nicht. In diesem Fall würde ich eher die Initialisierung im Konstruktor setzen, die eine wohldefinierte Semantik für die Vererbung hat:)

Der Konstruktor und die SetUp verwendeten Methoden sind unterschiedlich:
Der Konstruktor wird nur einmal ausgeführt werden.
Allerdings sind die SetUp Methoden mehrmals ausgeführt, vor jedem Testfall ausgeführt wird.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top