Exemplarische Vorgehensweise: Test-First-Entwicklung mit dem Feature „Aus Verwendung generieren“
In diesem Thema wird die Verwendung der Generate From Usage-Funktion veranschaulicht, die die Test-First-Entwicklung unterstützt.
Dietestgetriebene Entwicklung ist eine Methode des Softwareentwurfs, bei der zuerst Unittests basierend auf Produktspezifikationen und dann der Quellcode geschrieben wird, der erforderlich ist, damit die Tests erfolgreich ausgeführt werden. Visual Studio unterstützt die testgetriebene Entwicklung, indem neue Typen und Members im Quellcode generiert werden, wenn Sie in Ihren Testfällen auf diese verweisen, noch bevor sie definiert werden.
Visual Studio generiert die neuen Typen und Member mit nur minimaler Unterbrechung des Workflows. Sie können Stubs für Typen, Methoden, Eigenschaften, Felder oder Konstruktoren erstellen, ohne die aktuelle Position im Code zu verlassen. Wenn Sie ein Dialogfeld zum Angeben von Optionen für die Typgenerierung öffnen, kehrt der Fokus sofort zur aktuell geöffneten Datei zurück, wenn das Dialogfeld geschlossen wird.
Das Feature Aus Verwendung generieren kann mit Testframeworks verwendet werden, die in Visual Studio integriert werden können. In diesem Thema wird das Microsoft-Unittestframework veranschaulicht.
Hinweis
Auf Ihrem Computer werden möglicherweise andere Namen oder Speicherorte für die Benutzeroberflächenelemente von Visual Studio angezeigt als die in diesem Artikel. Möglicherweise verwenden Sie eine andere Edition von Visual Studio oder andere Umgebungseinstellungen. Weitere Informationen finden Sie unter Personalisieren der IDE.
Erstellen eines Projekts für eine Windows-Klassenbibliothek und eines Testprojekts
Erstellen Sie in C# oder Visual Basic ein neues Projekt für eine Windows-Klassenbibliothek. Nennen Sie es
GFUDemo_VB
oderGFUDemo_CS
, je nachdem, welche Sprache Sie verwenden.Klicken Sie im Projektmappen-Explorer mit der rechten Maustaste im oberen Bereich auf das Projektmappensymbol. Wählen Sie dann Hinzufügen>Neues Projekt aus.
Erstellen Sie ein neues Projekt Komponententestprojekt (.NET Framework) .
Hinzufügen eines Verweises auf das Klassenbibliotheksprojekt
Klicken Sie im Projektmappen-Explorer unter Ihrem Komponententestprojekt mit der rechten Maustaste auf den Eintrag Verweise, und klicken Sie dann auf Verweis hinzufügen.
Klicken Sie im Dialogfeld Verweis-Manager zunächst auf die Option Projekte und dann auf das Klassenbibliotheksprojekt.
Klicken Sie auf OK, um das Dialogfeld Verweis-Manager zu schließen.
Speichern Sie die Projektmappe. Sie können nun mit dem Schreiben von Tests beginnen.
Generieren einer neuen Klasse aus einem Komponententest
Das Testprojekt enthält eine Datei mit dem Namen UnitTest1. Doppelklicken Sie auf diese Datei im Projektmappen-Explorer, um sie im Code-Editor zu öffnen. Eine Testklasse und eine Testmethode wurden generiert.
Suchen Sie die Deklaration für die Klasse
UnitTest1
, und benennen Sie sie um inAutomobileTest
.Hinweis
IntelliSense bietet jetzt zwei Alternativen für die IntelliSense-Anweisungsvervollständigung: Beendigungsmodus und Vorschlagsmodus. Verwenden Sie den Vorschlagsmodus für Situationen, in denen Klassen und Member verwendet werden, bevor sie definiert werden. Drücken Sie Strg+Alt+Leertaste, um bei geöffnetem IntelliSense-Fenster zwischen Beendigungs- und Vorschlagsmodus zu wechseln. Weitere Informationen finden Sie unter Verwenden von IntelliSense. Der Vorschlagsmodus ist hilfreich, wenn Sie im nächsten Schritt
Automobile
eingeben.Suchen Sie die
TestMethod1()
-Methode, und benennen Sie sie um inDefaultAutomobileIsInitializedCorrectly()
. Erstellen Sie wie in den folgenden Screenshots dargestellt innerhalb dieser Methode eine neue Klasseninstanz mit dem NamenAutomobile
. Eine wellenförmige Unterstreichung, die auf einen Kompilierzeitfehler hindeutet, und eine Fehlerglühbirne für Schnelle Aktionen werden am linken Rand oder direkt unter der Wellenlinie angezeigt, wenn Sie darauf zeigen.Klicken Sie auf die Glühbirne Schnellaktionen. Es wird eine Fehlermeldung angezeigt, die meldet, dass der
Automobile
-Typ nicht definiert ist. Außerdem werden einige Lösungen für das Problem angezeigt.Sie können auch auf Neuen Typ generieren... klicken, um das Dialogfeld Typ generieren zu öffnen. In diesem Dialogfeld werden verschiedene Optionen dargestellt. Dies umfasst u. a. die Typgenerierung in einem anderen Projekt.
Klicken Sie in der Projekt-Liste auf GFUDemo_VB oder GFUDemo_CS, um Visual Studio anzuweisen, anstelle des Testprojekts dem Klassenbibliotheksprojekt die Datei hinzuzufügen. Klicken Sie, falls noch nicht geschehen, auf Neue Datei erstellen und nennen Sie diese Datei Automobile.cs oder Automobile.vb.
Klicken Sie auf OK , um das Dialogfeld zu schließen und die neue Datei zu erstellen.
Überprüfen Sie im Projektmappen-Explorer unter dem Projektknoten GFUDemo_VB oder GFUDemo_CS, ob die neue Datei Automobile.vb bzw. Automobile.cs vorhanden ist. Im Code-Editor liegt der Fokus noch immer auf
AutomobileTest.DefaultAutomobileIsInitializedCorrectly
, wodurch Sie den Test mit so wenigen Unterbrechungen wie möglich weiterschreiben können.
Generieren eines Eigenschaftsstubs
Angenommen, die Produktspezifikation gibt an, dass die Automobile
-Klasse über zwei öffentliche Eigenschaften namens Model
und TopSpeed
verfügt. Diese Eigenschaften müssen mit den Standardwerten von "Not specified"
und -1
durch den Standardkonstruktor initialisiert werden. Im folgenden Unittest wird überprüft, ob der Standardkonstruktor die Eigenschaften auf ihre richtigen Standardwerte festlegt.
Fügen Sie der
DefaultAutomobileIsInitializedCorrectly
-Testmethode die folgende Codezeile hinzu.Da der Code auf zwei nicht definierte Eigenschaften in
Automobile
verweist, wird unterModel
undTopSpeed
eine wellenförmige Unterstreichung angezeigt. Zeigen Sie aufModel
, klicken Sie auf die Fehlerglühbirne Schnellaktionen, und wählen Sie dann Eigenschaft „Automobile.Model“ generieren aus.Generieren Sie auf dieselbe Weise einen Eigenschaftenstub für die
TopSpeed
-Eigenschaft.In der
Automobile
-Klasse werden die Typen der neuen Eigenschaften ordnungsgemäß aus dem Kontext abgeleitet.
Generieren eines Stubs für einen neuen Konstruktor
Jetzt möchten wir Ihnen zeigen, wie Sie eine Testmethode erstellen, die einen Konstruktorstub generiert, um die Eigenschaften Model
und TopSpeed
zu initialisieren. Später fügen Sie weiteren Code hinzu, um den Test abzuschließen.
Fügen Sie die folgende zusätzliche Testmethode zur
AutomobileTest
-Klasse hinzu.Klicken Sie unterhalb der roten Wellenlinie auf die Fehlerglühbirne Schnellaktionen, und klicken Sie anschließend auf Generate constructor in 'Automobile' (Konstruktor in „Automobile“ generieren).
In der
Automobile
-Klassendatei hat der neue Konstruktor die Namen der lokalen Variablen geprüft, die im Konstruktoraufruf verwendet werden, Eigenschaften gefunden, die die gleichen Namen in derAutomobile
-Klasse aufweisen, und Code im Konstruktortext zum Speichern der Argumentwerte in den EigenschaftenModel
undTopSpeed
bereitgestellt.Nachdem Sie den neuen Konstruktor generiert haben, wird eine wellenförmige Unterstreichung unter dem Aufruf des Standardkonstruktors in
DefaultAutomobileIsInitializedCorrectly
angezeigt. Die Fehlermeldung gibt an, dass dieAutomobile
-Klasse über keinen Konstruktor verfügt, der keine Argumente annimmt. Um einen expliziten Standardkonstruktor ohne Parameter zu generieren, klicken Sie zunächst auf die Fehlerglühbirne Schnellaktionen und dann auf Generate constructor in 'Automobile' (Konstruktor in „Automobile“ generieren).
Generieren eines Stubs für eine Methode
Angenommen, die Spezifikation gibt an, dass ein neues Automobile
in einen IsRunning
-Zustand versetzt werden kann, wenn die zugehörigen Eigenschaften Model
und TopSpeed
auf andere als die Standardwerte festgelegt werden.
Fügen Sie der
AutomobileWithModelNameCanStart
-Methode die folgenden Zeilen hinzu.Klicken Sie auf die Fehlerglühbirne Schnellaktionen für den Methodenaufruf
myAuto.Start
und dann auf Methode „Automobile.Start“ generieren.Klicken Sie auf die Glühbirne Schnellaktionen für die
IsRunning
-Eigenschaft und dann auf Generate method 'Automobile.Start' (Methode „Automobile.Start“ generieren).Die
Automobile
-Klasse enthält nun eine Methode mit dem NamenStart()
und eine Eigenschaft mit dem NamenIsRunning
.
Tests ausführen
Klicken Sie im Menü Test auf Ausführen>Alle Tests.
Der Befehl Ausführen>Alle Tests führt alle Tests in sämtlichen Testframeworks aus, die für die aktuelle Projektmappe geschrieben sind. In diesem Fall sind zwei Tests vorhanden, und beide schlagen erwartungsgemäß fehl. Der
DefaultAutomobileIsInitializedCorrectly
-Test schlägt fehl, weil dieAssert.IsTrue
-BedingungFalse
zurückgibt. DerAutomobileWithModelNameCanStart
-Test schlägt fehl, weil dieStart
-Methode in derAutomobile
-Klasse eine Ausnahme auslöst.Das Fenster Testergebnisse wird in der folgenden Abbildung gezeigt.
Doppelklicken Sie im Fenster Testergebnisse auf jede Testergebniszeile, um zum Speicherort der einzelnen Tests zu gelangen.
Implementieren des Quellcodes
Fügen Sie dem Standardkonstruktor den folgenden Code hinzu, sodass die Eigenschaften
Model
,TopSpeed
undIsRunning
mit den richtigen Standardwerten von"Not specified"
,-1
, undFalse
(oderfalse
für C#) initialisiert werden.Wenn die
Start
-Methode aufgerufen wird, sollte dasIsRunning
-Flag nur auf "true" festgelegt werden, wenn die EigenschaftModel
oderTopSpeed
auf einen anderen als den Standardwert festgelegt sind. Entfernen Sie dieNotImplementedException
aus dem Methodentext, und fügen Sie den folgenden Code hinzu.
Erneutes Ausführen der Tests
Zeigen Sie im Menü Test auf Ausführen, und klicken Sie dann auf Alle Tests.
Dieses Mal werden die Tests bestanden. Das Fenster Testergebnisse wird in der folgenden Abbildung gezeigt.