Dies ist ein Auszug aus dem Unit Testing Succinctly eBook von Marc Clifton, freundlicherweise von Syncfusion zur Verfügung gestellt.
Ein Komponententest besteht aus zwei Dingen:
Eine Klasse, die das Testgerät darstellt.
Methoden in der Klasse, die die Komponententests darstellen.
Visual Studio erstellt automatisch einen Stub für ein Testprojekt, von dem aus wir beginnen.
Erstellen eines Komponententestprojekts in Visual Studio
Komponententests werden normalerweise in einem separaten Projekt (was zu einer anderen Assembly führt) von Ihrem Anwendungscode abgelegt. In Visual Studio 2008 oder 2012 können Sie ein Komponententestprojekt erstellen, indem Sie mit der rechten Maustaste auf die Projektmappe klicken und auswählen Hinzufügen gefolgt von Neues Projekt aus dem Popup-Menü:
Neues Projekt hinzufügen
Wählen Sie im angezeigten Dialogfeld a aus Prüfung Projekt:
VS2008 Neues Testprojekt VS2012 Neues Testprojekt
Visual Studio 2008 erstellt eine Stub-Datei „UnitTest1.cs“ (wenn Sie die C # -Sprache gewählt haben) mit einer Vielzahl hilfreicher Kommentare im Stub. Visual Studio 2012 erstellt einen viel kürzeren Stub:
mit System; using Microsoft.VisualStudio.TestTools.UnitTesting; Namespace VS2012UnitTestProject1 [TestClass] public Klasse UnitTest1 [TestMethod] public void TestMethod1 ()
Für Visual Studio 2008-Benutzer
In Visual Studio 2008 wird auch eine TestContext-Klasse erstellt. Diese ist in VS2012 nicht mehr vorhanden, und wir ignorieren sie. Stattdessen wird der vorherige Stub von VS2012 verwendet.
Löschen Sie auch die Datei „ManualTest1.mht“. Andernfalls werden Sie aufgefordert, die Testergebnisse auszuwählen und die Testnotizen manuell einzugeben.
Testvorrichtungen
Beachten Sie, dass die Klasse mit dem Attribut TestClass versehen ist. Dies definiert die Testvorrichtung - eine Sammlung von Testmethoden.
Testmethoden
Beachten Sie, dass die Methode mit dem Attribut TestMethod versehen ist. Dies definiert eine Methode, die das Testgerät ausführen wird.
Die Assert-Klasse
Die Assert-Klasse definiert die folgenden statischen Methoden, mit denen die Berechnung einer Methode überprüft werden kann:
AreEqual / AreNotEqual
AreSame / AreNotSame
IsTrue / IsFalse
IsNull / IsNotNull
IsInstanceOfType / IsNotInstanceOfType
Viele dieser Zusicherungen sind überlastet, und es wird empfohlen, die vollständige Dokumentation von Microsoft zu lesen.
Grundlagen für eine Assertion
Beachten Sie, dass die folgenden Beispiele VS2008 verwenden.
Assertionen sind das Rückgrat jedes Tests. Zu den Testergebnissen gibt es eine Reihe von Aussagen, die gemacht werden können. Zunächst schreiben wir eine einfache Behauptung, in der es heißt: "Eins ist eins", mit anderen Worten: eine Binsenweisheit:
[TestClass] public Klasse UnitTest1 [TestMethod] public void TestMethod1 () Assert.IsTrue (1 == 1);
Führen Sie den Test aus, der zu "Bestanden" führen sollte:
Einfache Assertion
AreEqual / AreNotEqual
Die Methoden AreEqual und AreNotEqual vergleichen:
Objekte
Doppel
Einzel
Streicher
typisierte Daten
Sie haben die Form, den erwarteten (ersten Parameter) mit dem tatsächlichen (zweiten Parameter) zu vergleichen. Bei Einzel- und Doppelwerten kann "innerhalb einer bestimmten Genauigkeit" angegeben werden. Schließlich haben alle Überladungen die Option, eine Meldung anzuzeigen (optional formatiert), wenn die Assertion fehlschlägt.
In Bezug auf die Objektgleichheit vergleicht diese Methode, ob die Instanzen identisch sind:
öffentliche Klasse AnObject [TestMethod] public void ObjectEqualityTest () AnObject object1 = new AnObject (); AnObject object2 = new AnObject (); Assert.AreNotEqual (object1, object2);
Der vorhergehende Test ist erfolgreich, da object1 und object2 nicht gleich sind. Wenn die Klasse jedoch die Equals-Methode überschreibt, basiert die Gleichheit auf dem Vergleich der Equals-Methode, die in der Klasse implementiert ist. Zum Beispiel:
öffentliche Klasse AnObject public int SomeValue get; einstellen; public override bool Equals (object obj) return SomeValue == ((AnObject) obj) .SomeValue; [TestMethod] public void ObjectEqualityTest () AnObject object1 = new AnObject () SomeValue = 1; AnObject object2 = new AnObject () SomeValue = 1; Assert.AreEqual (object1, object2);
AreSame / AreNotSame
Diese beiden Methoden bestätigen, dass die Instanzen sind gleich (oder nicht). Zum Beispiel:
[TestMethod] public void SamenessTest () AnObject object1 = new AnObject () SomeValue = 1; AnObject object2 = new AnObject () SomeValue = 1; Assert.AreNotSame (object1, object2);
Obwohl die Klasse AnObject den Equals-Operator überschreibt, besteht der vorhergehende Test, weil der Instanzen der beiden Objekte sind nicht gleich.
IsTrue / IsFalse
Mit diesen beiden Methoden können Sie die Wahrheit eines Wertvergleichs prüfen. Aus Sicht der Lesbarkeit werden normalerweise die Methoden IsTrue und IsFalse für verwendet Wert Vergleiche, während AreEqual und AreSame normalerweise zum Vergleichen verwendet werden Instanzen (Objekte).
Zum Beispiel:
[TestMethod] public void IsTrueTest () AnObject object1 = new AnObject () SomeValue = 1; Assert.IsTrue (object1.SomeValue == 1);
Dadurch wird der Wert einer Eigenschaft überprüft.
IsNull / IsNotNull
Diese zwei Tests überprüfen, ob ein Objekt null ist oder nicht:
Diese beiden Methoden stellen sicher, dass ein Objekt eine Instanz eines bestimmten Typs ist (oder nicht). Zum Beispiel:
öffentliche Klasse AnotherObject [TestMethod] public void TypeOfTest () AnObject object1 = new AnObject (); Assert.IsNotInstanceOfType (object1, typeof (AnotherObject));
Nicht schlüssig
Mit der Assert.Inconclusive-Methode kann angegeben werden, dass entweder der Test oder die Funktionalität hinter dem Test noch nicht implementiert wurde und der Test daher nicht eindeutig ist.
Was passiert, wenn eine Assertion fehlschlägt?
In Bezug auf das Testen von Einheitentests in Visual Studio löst die Assert-Methode eine AssertFailedException aus, wenn eine Assertion fehlschlägt. Diese Ausnahme sollte niemals mit Ihrem Testcode behandelt werden.
Andere Assertionsklassen
Es gibt zwei weitere Assertionsklassen:
CollectionAssert
StringAssert
Wie ihre Namen implizieren, wirken sich diese Aussagen auf Sammlungen bzw. Zeichenfolgen aus.
Sammlungsbestätigungen
Diese Methoden sind in der Microsoft.VisualStudio.TestTools.UnitTesting.CollectionAssert-Klasse implementiert. Beachten Sie, dass der Collection-Parameter in diesen Methoden erwartet, dass die Collection ICollection implementiert (im Gegensatz zu NUnit, die IEnumerable erwartet)..
AllItemsAreInstanceOfType
Diese Assertion überprüft, ob Objekte in einer Auflistung vom selben Typ sind, einschließlich abgeleiteter Typen des erwarteten Typs, wie hier dargestellt:
öffentliche Klasse A öffentliche Klasse B: A [TestClass] öffentliche Klasse CollectionTests [TestMethod] public void InstancesOfTypeTest () Listenpunkte = neue Liste () neuer Punkt (1, 2), neuer Punkt (3, 4) ); Liste
AllItemsAreNotNull
Diese Zusicherung überprüft, dass Objekte in der Auflistung nicht null sind.
AllItemsAreUnique
Dieser Test stellt sicher, dass Objekte in einer Sammlung eindeutig sind. Wenn Strukturen verglichen werden:
[TestMethod] public void AreUniqueTest () Listenpunkte = neue Liste () neuer Punkt (1, 2), neuer Punkt (1, 2); CollectionAssert.AllItemsAreUnique (Punkte);
Die Strukturen werden nach Wert verglichen, nicht nach Instanz. Der vorherige Test schlägt fehl. Auch wenn die Klasse die Equals-Methode überschreibt:
öffentliche Klasse AnObject public int SomeValue get; einstellen; public override bool Equals (object obj) return SomeValue == ((AnObject) obj) .SomeValue;
Dieser Test besteht:
[TestMethod] public void AreUniqueObjectsTest () List items = neue Liste() neues AnObject () SomeValue = 1, neues AnObject () SomeValue = 1; CollectionAssert.AllItemsAreUnique (Elemente);
AreEqual / AreNotEqual
Diese Tests behaupten, dass zwei Sammlungen gleich sind. Die Methoden enthalten Überladungen, mit denen Sie eine Vergleichsmethode angeben können. Wenn ein Objekt die Equals-Methode überschreibt, wird diese Methode zur Bestimmung der Gleichheit verwendet. Zum Beispiel:
[TestMethod] public void AreEqualTest () List itemList1 = neue Liste() neues AnObject () SomeValue = 1, neues AnObject () SomeValue = 2; Liste itemList2 = neue Liste() neues AnObject () SomeValue = 1, neues AnObject () SomeValue = 2; CollectionAssert.AreEqual (itemList1, itemList2);
Diese beiden Auflistungen sind gleich, da die Klasse AnObject die Equals-Methode überschreibt (siehe vorheriges Beispiel)..
Um die Zusicherung zu bestehen, müssen die Listen die gleiche Länge haben und werden als ungleich betrachtet, wenn die Listen außer in einer anderen Reihenfolge identisch sind. Vergleichen Sie dies mit der nachfolgend beschriebenen AreEquivalent-Assertion.
AreEquivalent / AreNotEquivalent
Diese Aussage vergleicht zwei Listen und betrachtet Listen gleicher Artikel unabhängig von der Reihenfolge als gleichwertig. Leider scheint es einen Fehler in der Implementierung zu geben, da dieser Test fehlschlägt:
[TestMethod] public void AreEqualTest () List itemList1 = neue Liste() neues AnObject () SomeValue = 1, neues AnObject () SomeValue = 2; Liste itemList2 = neue Liste() neues AnObject () SomeValue = 2, neues AnObject () SomeValue = 1; CollectionAssert.AreEquivalent (itemList1, itemList2);
AreEquivalent Bug von Visual Studio
mit der Fehlermeldung:
CollectionAssert.AreEquivalent ist fehlgeschlagen. Die erwartete Sammlung enthält 1 Vorkommen von. Die tatsächliche Sammlung enthält 0 Vorkommen.
NUnits Umsetzung dieser Behauptung lautet:
NUnits AreEquivalent funktioniert korrekt
Enthält / DoesNotContain
Diese Behauptung überprüft, ob ein Objekt in einer Sammlung enthalten ist:
[TestMethod] public void ContainsTest () List itemList = neue Liste() neues AnObject () SomeValue = 1, neues AnObject () SomeValue = 2; CollectionAssert.Contains (itemList, new AnObject () SomeValue = 1);
Verwenden der Equals-Methode (falls überschrieben), um den Gleichheitstest durchzuführen.
IsSubsetOf / IsNotSubsetOf
Diese Assertion überprüft, ob der erste Parameter (die Teilmenge) in der Sammlung des zweiten Parameters (die Obermenge) enthalten ist..
Beachten Sie, dass der Subset-Test nicht auf Reihenfolge oder Reihenfolge prüft. Es wird lediglich geprüft, ob die Elemente in der Subset-Liste im Supersatz enthalten sind.
String Assertions
Diese Methoden sind in der Microsoft.VisualStudio.TestTools.UnitTesting.StringAssert-Klasse implementiert:
Enthält
Übereinstimmungen / DoesNotMatch
StartsWith / EndsWith
Diese werden als nächstes besprochen.
Enthält
Die Contains-Methode gibt an, dass die Teilmenge (beachten Sie, dass dies der zweite Parameter ist) in der Zeichenfolge (dem ersten Parameter) enthalten ist. Dieser Test besteht zum Beispiel:
Diese Methode gibt an, dass die Zeichenfolge (der erste Parameter) mit dem im zweiten Parameter angegebenen Regex-Muster übereinstimmt.
StartsWith / EndsWith
Diese Methode gibt an, dass die Zeichenfolge (der erste Parameter) entweder mit einer anderen Zeichenfolge (dem zweiten Parameter) beginnt oder endet..
Ausnahmen
Ausnahmen können getestet werden, ohne Try-Catch-Blöcke um die Testmethode zu schreiben. Während Sie beispielsweise Folgendes schreiben könnten:
[TestMethod] public void CatchingExceptionsTest () try Divide (5, 0); catch (ArgumentOutOfRangeException) // Akzeptiere die Ausnahme stumm als gültig.
Es ist viel einfacher, das ExpectedException-Attribut für die Testmethode zu verwenden:
Es gibt einige zusätzliche Attribute, die für die Durchführung einer Reihe von Tests sowie für einzelne Tests hilfreich sind, um die Wiederverwendbarkeit und Lesbarkeit der Komponententestcodebasis zu verbessern.
Die Unit-Test-Engine von Visual Studio bietet vier zusätzliche Methodenattribute:
ClassInitialize
ClassCleanup
TestInitialize
TestCleanup
Diese Attribute stehen vor der Ausführung aller Tests im Gerät (Klasse) sowie vor und nach jedem Test im Gerät.
Beachten Sie, dass die mit diesem Attribut versehenen Methoden statisch sein müssen.
ClassInitialize
Wenn eine Methode mit diesem Attribut versehen ist, wird der Code in der Methode ausgeführt, bevor alle Tests im Gerät ausgeführt werden. Beachten Sie, dass diese Methode einen Parameter TestContext erfordert.
Diese Methode ist nützlich, um Ressourcen zuzuordnen oder Klassen zu instanziieren, auf die alle Tests im Gerät angewiesen sind. Eine wichtige Überlegung bei Ressourcen und Objekten, die während der Fixture-Initialisierung erstellt wurden, ist, dass diese Ressourcen und Objekte als schreibgeschützt betrachtet werden sollten. Es ist nicht ratsam, dass Tests den Status von Ressourcen und Objekten ändern, von denen andere Tests abhängen. Dazu gehören Verbindungen zu Diensten wie Datenbank- und Webdiensten, deren Verbindung möglicherweise aufgrund eines Fehlers in einem Test in einen ungültigen Zustand versetzt wird, wodurch alle anderen Tests ungültig werden. Darüber hinaus ist die Reihenfolge, in der die Tests ausgeführt werden, nicht garantiert. Das Ändern des Zustands einer Ressource und eines Objekts, die in der Fixture-Initialisierung erstellt wurden, kann abhängig von der Reihenfolge, in der Tests ausgeführt werden, zu Nebenwirkungen führen.
ClassCleanup
Eine mit diesem Attribut versehene Methode ist für die Aufhebung der Zuordnung von Ressourcen, das Schließen von Verbindungen usw. verantwortlich, die während der Klasseninitialisierung erstellt wurden. Diese Methode wird immer ausgeführt, nachdem die Tests innerhalb des Geräts ausgeführt wurden, unabhängig davon, ob die Tests selbst erfolgreich waren oder nicht.
TestInitialize
Ähnlich wie das ClassInitialize-Attribut wird eine mit diesem Attribut versehene Methode ausgeführt für jeden Test vor dem Durchführen des Tests. Mit diesem Attribut soll sichergestellt werden, dass vom ClassInitialize-Code zugewiesene Ressourcen oder Objekte vor dem Ausführen jedes Tests in einem bekannten Zustand initialisiert werden.
TestCleanup
Als Ergänzung zum TestInitialize-Attribut werden mit TestCleanup dekorierte Methoden nach Abschluss ausgeführt von jedem Test.
Setup- und Teardown-Ablauf
Der folgende Code demonstriert den Ablauf von Vorrichtung und Testaufbau und -abbau in Bezug auf die tatsächlichen Tests:
[TestClass] öffentliche Klasse SetupTeardownFlow [ClassInitialize] public static void SetupFixture (TestContext-Kontext) Debug.WriteLine ("Fixture Setup."); [ClassCleanup] public static void TeardownFixture () Debug.WriteLine ("Fixture Teardown."); [TestInitialize] public void SetupTest () Debug.WriteLine ("Test Setup."); [TestCleanup] public void TeardownTest () Debug.WriteLine ("Test Teardown."); [TestMethod] public void TestA () Debug.WriteLine ("Test A."); [TestMethod] public void TestB () Debug.WriteLine ("Test B.");
Das Ausführen dieses Geräts führt zur folgenden Debug-Ausgabeverfolgung:
Fixture Setup. Versuchsaufbau. Test A. Testabzug. Versuchsaufbau. Test B. Testabzug. Fixture Teardown.
Wie im vorherigen Beispiel dargestellt, wird das Fixture initialisiert. Dann werden für jeden Test der Test-Setup- und -Deardown-Code ausgeführt, gefolgt von dem Fixture-Abbau am Ende.
Weniger häufig verwendete Attribute
Im folgenden Abschnitt werden weniger häufig verwendete Attribute beschrieben.
AssemblyInitialize / AssemblyCleanup
Methoden, die mit diesem Attribut versehen sind, müssen statisch sein und werden ausgeführt, wenn die Assembly geladen wird. Dies wirft die Frage auf, ob die Baugruppe mehr als eine Testvorrichtung hat?
[TestClass] öffentliche Klasse Fixture1 [AssemblyInitialize] public static void AssemblyInit (TestContext-Kontext) //… einige Operation [TestClass] öffentliche Klasse Fixture2 [AssemblyInitialize] öffentliche statische void AssemblyInit (TestContext-Kontext) //… eine Operation
Wenn Sie dies versuchen, führt das Testmodul keine Komponententests aus und meldet Folgendes:
"UTA013: UnitTestExamplesVS2008.Fixture2: Es können nicht mehr als eine Methode mit dem AssemblyInitialize-Attribut in einer Assembly definiert werden."
Daher kann für eine Baugruppe unabhängig von der Anzahl der Testhalterungen in dieser Baugruppe nur eine AssemblyInitialize- und eine AssemblyCleanup-Methode vorhanden sein. Es wird daher empfohlen, keine eigentlichen Tests in die Klasse aufzunehmen, die diese Methoden definiert:
[TestClass] public class AssemblyFixture [AssemblyInitialize] public static void AssemblySetup (TestContext-Kontext) Debug.WriteLine ("Assembly Initialize."); [AssemblyCleanup] public static void AssemblyTeardown () Debug.WriteLine ("Assembly Cleanup.");
Daraus ergibt sich folgende Ausführungsreihenfolge:
Assembly initialisieren. Fixture Setup. Versuchsaufbau. Test A. Testabzug. Versuchsaufbau. Test B. Testabzug. Fixture Teardown. Baugruppenbereinigung.
Beachten Sie die zusätzlichen Assembly-Initialisierungs- und Bereinigungsaufrufe.
Ignorieren
Diese Methode kann bestimmte Methoden oder ganze Vorrichtungen dekorieren.
Ignorieren Sie eine Testmethode
Wenn dieses Attribut eine Testmethode auszeichnet:
[TestMethod, Ignore] public void TestA () Debug.WriteLine ("Test A.");
Der Test wird nicht ausgeführt. Leider zeigt der Visual Studio-Testergebnisbereich nicht an, dass zurzeit Tests ignoriert werden:
Ignorierte Tests werden nicht angezeigt
Vergleichen Sie dies mit NUnit, das eindeutig ignorierte Tests anzeigt:
NUnit zeigt ignorierte Tests
Die NUnit-Anzeige markiert den gesamten Testbaum als "unbekannt", wenn eine oder mehrere Testmethoden als "Ignorieren" markiert sind.
Ignorieren Sie ein Testgerät
Die Methoden eines gesamten Gerätes können mit dem Ignore-Attribut auf Klassenebene ignoriert werden:
Wenn Sie einer Methode das Ignore-Attribut hinzufügen, stellen Sie möglicherweise fest, dass Visual Studio den Test weiterhin ausführt. Sie müssen den Testcache löschen, damit Visual Studio die Änderung übernimmt. Eine Möglichkeit, dies zu tun, besteht darin, die Lösung zu reinigen und neu zu erstellen.
Inhaber
Dieses Attribut wird zu Berichtszwecken verwendet und beschreibt die für die Komponententestmethode verantwortliche Person.
DeploymentItem
Wenn die Komponententests in einem separaten Bereitstellungsordner ausgeführt werden, können mit diesem Attribut Dateien angegeben werden, die eine Testklasse oder Testmethode zum Ausführen benötigt. Sie können Dateien oder Ordner angeben, die in den Bereitstellungsordner kopiert werden sollen, und optional den Zielpfad relativ zum Bereitstellungsordner angeben.
Beschreibung
Dieses Attribut wird für die Berichterstellung verwendet und enthält eine Beschreibung der Testmethode. Seltsamerweise ist dieses Attribut nur für Testmethoden verfügbar und nicht für Testklassen verfügbar.
HostType
Bei Testmethoden wird mit diesem Attribut der Host angegeben, auf dem der Komponententest ausgeführt wird.
Priorität
Dieses Attribut wird nicht von der Test-Engine verwendet, kann aber durch Reflektion von Ihrem eigenen Testcode verwendet werden. Die Nützlichkeit dieses Attributs ist fraglich.
Arbeitsmittel
Wenn Sie Team Foundation Server (TFS) verwenden, können Sie dieses Attribut für eine Testmethode verwenden, um die Workitem-ID anzugeben, die TFS dem bestimmten Komponententest zugewiesen hat.
CssIteration / CssProjectStructure
Diese beiden Attribute werden in Verbindung mit TeamBuild und TestManagementService verwendet und ermöglichen es Ihnen, eine Projektiteration anzugeben, der die Testmethode entspricht.
Parametrisiertes Testen mit dem DataSource-Attribut
Die Unit-Test-Engine von Microsoft unterstützt CSV-, XML- oder Datenbank-Datenquellen für parametrisierte Tests. Dies ist kein exakt parametrisiertes Testen (siehe, wie NUnit parametrisiertes Testen implementiert), da die Parameter nicht an die Komponententestmethode übergeben werden, sondern aus der Datenquelle extrahiert und an die zu testende Methode übergeben werden müssen. Die Möglichkeit, Testdaten aus verschiedenen Quellen in eine DataTable zu laden, ist jedoch hilfreich, um die Testautomatisierung voranzutreiben.
CSV-Datenquelle
Eine Textdatei mit durch Kommas getrennten Werten kann für eine Datenquelle verwendet werden:
[TestClass] öffentliche Klasse DataSourceExamples public TestContext TestContext get; einstellen; [TestMethod] [DataSource ("Microsoft.VisualStudio.TestTools.DataSource.CSV", "C: \\ Temp \\ csvData.txt", "csvData # txt", DataAccessMethod.Sequential)] public void CsvDataSourceTest () int n = Convert.ToInt32 (TestContext.DataRow ["Numerator"]); int d = Convert.ToInt32 (TestContext.DataRow ["Denominator"]); int r = Convert.ToInt32 (TestContext.DataRow ["ExpectedResult"]); Debug.WriteLine ("n =" + n + ", d =" + d + ", r =" + r);
Es ergibt sich folgende Ausgabe:
n = 10, d = 5, r = 2 n = 20, d = 5, r = 4 n = 33, d = 3, r = 11
Beachten Sie, dass das Testergebnisfenster die Parameterläufe nicht anzeigt (im Gegensatz zu NUnit):
Parametrisierte Testergebnisse
Es ist jedoch offensichtlich, dass nicht jede Testkombination angezeigt wird, insbesondere bei großen Datensätzen.
XML-Datenquelle
Gegeben eine XML-Datei wie:
Ein Beispiel für die Verwendung einer XML-Datenquelle für einen Komponententest ist:
[TestMethod] [DataSource ("Microsoft.VisualStudio.TestTools.DataSource.XML", "C: \\ Temp \\ xmlData.xml", "Row", DataAccessMethod.Sequential)] public void XmlDataSourceTest () int n = Konvertieren .Too32 (TestContext.DataRow ["Numerator"])); int d = Convert.ToInt32 (TestContext.DataRow ["Denominator"]); int r = Convert.ToInt32 (TestContext.DataRow ["ExpectedResult"]); Debug.WriteLine ("n =" + n + ", d =" + d + ", r =" + r);
Beachten Sie, dass der Testcode mit Ausnahme der Parameter für die Datenquellenattribute identisch ist.
Datenbankdatenquelle
Eine Datenbanktabelle kann auch als Datenquelle verwendet werden. Gegeben eine Tabelle wie:
Datenbanktabelle als Datenquelle
und Daten:
Datenbank-Testdaten
Eine Beispieltestmethode, die diese Daten verwendet, sieht folgendermaßen aus:
[TestMethod] [DataSource ("System.Data.SqlClient", "Datenquelle = INTERACX-HP; Anfangskatalog = UnitTesting; Integrierte Sicherheit = Wahr", "DivideTestData", DataAccessMethod.Sequential)] public void XmlDataSourceTest () int n = Convert.ToInt32 (TestContext.DataRow ["Numerator"]); int d = Convert.ToInt32 (TestContext.DataRow ["Denominator"]); int r = Convert.ToInt32 (TestContext.DataRow ["ExpectedResult"]); Debug.WriteLine ("n =" + n + ", d =" + d + ", r =" + r);
Beachten Sie auch hier, dass der Testmethodencode selbst derselbe ist. Das einzige, was wir hier gemacht haben, ist die Änderung der DataSource-Definition.
TestProperty-Attribut
Die MSDN-Dokumentation für dieses Attribut veranschaulicht, wie ein Name-Wert-Paar von TestProperty deklariert und anschließend mithilfe von Reflektion der Name und der Wert abgerufen werden. Dies scheint eine stumpfe Methode zu sein, um parametrisierte Tests zu erstellen.
Darüber hinaus wirkt sich der in Craig Anderas Blog beschriebene Code zur Verwendung des TestProperty-Attributs zur Parametrisierung des Testinitialisierungsprozesses nicht auf die TestContext.Properties-Auflistung in Visual Studio 2008 oder Visual Studio 2012 aus.