Komponententest prägnant Visual Studio

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:

[TestMethod] public void IsNullTest () AnObject object1 = null; Assert.IsNull (object1);  

IsInstanceOfType / IsNotInstanceOfType

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 items = neue Liste() neues B (), neues A (); CollectionAssert.AllItemsAreInstancesOfType (points, typeof (Point)); CollectionAssert.AllItemsAreInstancesOfType (items, typeof (A));   

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..

[TestMethod] public void SubsetTest () string subset = "abc"; String Superset = "1d2c3b4a"; CollectionAssert.IsSubsetOf (subset.ToCharArray (), superset.ToCharArray ());  

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:

[TestClass] öffentliche Klasse StringTests [TestMethod] public void ContainsTest () string subset = "abc"; String Superset = "123abc456"; StringAssert.Contains (Obermenge, Teilmenge);  

Übereinstimmungen / DoesNotMatch

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:

[TestMethod] [ExpectedException (typeof (ArgumentOutOfRangeException))] public void BadParameterTest () Divide (5, 0);  

Andere nützliche Attribute

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.

Setup / Teardown

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:

[TestClass, Ignore] öffentliche Klasse SetupTeardownFlow … etc… 

Testcache löschen

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:

Zähler, Nenner, ErwarteteErgebnisse 10, 5, 2 20,5, 4 33, 3, 11 

und in einer Testmethode verwendet:

[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.