Verwenden Sie TestInitialize-test oder ein Konstruktor der Klasse für die Vorbereitung eines jeden testen??? und warum?
Diese Frage hinsichtlich unit-testing in Visual Studio mit MSTest (dies ist wichtig, weil der MSTest ist die Reihenfolge der Ausführung). Sowohl die Methode als gekennzeichnet [TestInitialize] und die test-Klasse-Konstruktor wird ausgeführt vor jeder test-Methode.
So, die Frage ist, was tun Sie neigen dazu, in jedem dieser Bereiche? Vermeiden Sie es, die Durchführung bestimmter Tätigkeiten in beiden? Was ist Ihr Grund: Stil, Technik, Aberglaube?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Konstruktor ist nur eine Struktur, die durch die Sprache. Jeder test framework scheint, hat seine eigenen kontrollierten Lebenszyklus "initialisieren". Sie werden wahrscheinlich nur in Schwierigkeiten mit dem Konstruktor zu mutieren Ihre einheimischen.
MSTest: Sie bekommen eine ganze neue Instanz der Testklasse für jeden
TestMethod
. Dies ist vielleicht der einzige Fall, wo es ok ist, zu mutieren Ihre einheimischen in den Konstruktor, die Initialisierung, oder test-Methode und nicht auf die anderen test-Methoden."MSpec": Sie bekommen nur eine
Establish
undBecause
für alle Ihre Behauptungen (It
). Also, nicht mutieren Ihre einheimischen in Ihren Behauptungen. Und verlassen Sie sich nicht auf Mutationen von einheimischen, die in der Basis zusammenhängen (wenn Sie Sie verwenden).[ClassInitialize]
ist laufen nur einmal pro Testlauf (vor allem), so kann es verwendet werden, für die keine teuren setup-Routinen.[TestInitialize]
- Attribut anstelle von Konstruktoren.Hier sind einige Vorteile, die ich gefunden habe mit TestInitialize.
public void Dispose
Methode nach jedem test ausgeführt werden. Es muss öffentlich sein, und es spielt keine Rolle, Sie umzusetzenIDisposable
: Sie können nicht explizit das interface implementieren.Den wichtigsten Vorteil der Verwendung entweder TestInitialize() oder ClassInitialize() anstatt der test-Klasse-Instanz-oder statische Konstruktoren ist seine explizite Natur. Es klar kommuniziert, dass Sie tun, einige setup, bevor Sie Ihre tests. Tut dies konsequent verbessern sollten, die Wartbarkeit langfristig.
TestInitialize
ist eine so offensichtliche Namen, die nicht verursachen keine Verwirrung: stackoverflow.com/questions/22999816/....Ich lieber mit den
[TestInitialize]
Methode zur Durchführung der Instanziierung des Objekts getestet werden und es ist Parameter. Ich nur arbeiten ausführen, die in den Konstruktor, wenn es notwendig ist, zu instanziieren, die eine Prüfung Basis-Klasse (die in der Regel, wo ich erstellen oder aktualisieren, repositories, usw.). Dies hilft mir, die test-framework-code und test-code trennen, logisch und physisch.Diese Frage auch gefragt wird (später) auf Was ist der Unterschied zwischen der Verwendung der Konstruktor in VS-Test-Frameworks vs. TestInitialize () - Attribut?
FWIW ich nehme an, "Klasse-Konstruktor" meinst du, die Instanz-Konstruktor (nicht die statische Konstruktor).
Glaube ich die gleiche Frage, die Sie Fragen könnte gleichermaßen gefragt werden, über das der statische Konstruktor vs. ClassInitialize...
Sage ich den Konstruktor verwenden, es sei denn, Sie müssen
TestContext
.readonly
das ist eine große Sache in der test-Initialisierung, wo Sie möchten, bereiten Sachen für die tests, Sie sind eigentlich nicht zu ändern (im Idealfall die Sachen, die Sie vorbereiten würde, unveränderlich zu).Dem Objekt, das Sie testen müssen nicht instanziiert werden, in der [TestInitialize] - Methode. Sie können testen Sie den Konstruktor des Objekts in einem test-Verfahren [Test].
Objekt in die [TestInitialize] werden können, um das setup Ihrer Persistenz-Speicher oder zur Vorbereitung Wert, den das Objekt getestet wird in den tests verwendet.
Es hängt vom Szenario ab. Wenn Sie eine test-Klasse, und aus irgendeinem seltsamen Grund, wenn Sie brauchen, um zu erstellen Instanz auf einem anderen test-Klasse, die Sie brauchen, um den Konstruktor.
Sonst testen, initialisieren, mehr passt in das Konzept. Erstens gleichen Gründen, die oben geschrieben zweite MS einführen können mehr Funktionen, die auf diesem Attribut und Sie werden davon profitieren, mit Konstruktor Sie stecken in ihn.
Ich weiß, dass ich spät zur party, aber mit
async
das ist ein weiterer Grund (nicht extsed, wenn diese Frage einfach Fragen) für[TestInitialize]
. Das können Sie tunasync
Operationen-setup (zB. laden einer Datei), die nicht möglich ist, im Konstruktor: