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

  1. Erstellen Sie in C# oder Visual Basic ein neues Projekt für eine Windows-Klassenbibliothek. Nennen Sie es GFUDemo_VB oder GFUDemo_CS, je nachdem, welche Sprache Sie verwenden.

  2. Klicken Sie im Projektmappen-Explorer mit der rechten Maustaste im oberen Bereich auf das Projektmappensymbol. Wählen Sie dann Hinzufügen>Neues Projekt aus.

  3. Erstellen Sie ein neues Projekt Komponententestprojekt (.NET Framework) .

Hinzufügen eines Verweises auf das Klassenbibliotheksprojekt

  1. Klicken Sie im Projektmappen-Explorer unter Ihrem Komponententestprojekt mit der rechten Maustaste auf den Eintrag Verweise, und klicken Sie dann auf Verweis hinzufügen.

  2. Klicken Sie im Dialogfeld Verweis-Manager zunächst auf die Option Projekte und dann auf das Klassenbibliotheksprojekt.

  3. Klicken Sie auf OK, um das Dialogfeld Verweis-Manager zu schließen.

  4. Speichern Sie die Projektmappe. Sie können nun mit dem Schreiben von Tests beginnen.

Generieren einer neuen Klasse aus einem Komponententest

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

  2. Suchen Sie die Deklaration für die Klasse UnitTest1 , und benennen Sie sie um in AutomobileTest.

    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.

  3. Suchen Sie die TestMethod1() -Methode, und benennen Sie sie um in DefaultAutomobileIsInitializedCorrectly(). Erstellen Sie wie in den folgenden Screenshots dargestellt innerhalb dieser Methode eine neue Klasseninstanz mit dem Namen Automobile. 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.

    Schnellaktionen in Visual Basic

    Schnellaktionen in C#

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

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

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

    Dialogfeld

  7. Klicken Sie auf OK , um das Dialogfeld zu schließen und die neue Datei zu erstellen.

  8. Ü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 TopSpeedverfü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.

  1. Fügen Sie der DefaultAutomobileIsInitializedCorrectly-Testmethode die folgende Codezeile hinzu.

    Assert.IsTrue((myAuto.Model == "Not specified") && (myAuto.TopSpeed == -1));
    
  2. Da der Code auf zwei nicht definierte Eigenschaften in Automobile verweist, wird unter Model und TopSpeed eine wellenförmige Unterstreichung angezeigt. Zeigen Sie auf Model, klicken Sie auf die Fehlerglühbirne Schnellaktionen, und wählen Sie dann Eigenschaft „Automobile.Model“ generieren aus.

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

  1. Fügen Sie die folgende zusätzliche Testmethode zur AutomobileTest -Klasse hinzu.

    [TestMethod]
    public void AutomobileWithModelNameCanStart()
    {
        string model = "Contoso";
        int topSpeed = 199;
        Automobile myAuto = new Automobile(model, topSpeed);
    }
    
  2. 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 der Automobile -Klasse aufweisen, und Code im Konstruktortext zum Speichern der Argumentwerte in den Eigenschaften Model und TopSpeed bereitgestellt.

  3. Nachdem Sie den neuen Konstruktor generiert haben, wird eine wellenförmige Unterstreichung unter dem Aufruf des Standardkonstruktors in DefaultAutomobileIsInitializedCorrectlyangezeigt. Die Fehlermeldung gibt an, dass die Automobile -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.

  1. Fügen Sie der AutomobileWithModelNameCanStart -Methode die folgenden Zeilen hinzu.

    myAuto.Start();
    Assert.IsTrue(myAuto.IsRunning == true);
    
  2. Klicken Sie auf die Fehlerglühbirne Schnellaktionen für den Methodenaufruf myAuto.Start und dann auf Methode „Automobile.Start“ generieren.

  3. 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 Namen Start() und eine Eigenschaft mit dem Namen IsRunning.

Tests ausführen

  1. 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 die Assert.IsTrue -Bedingung Falsezurückgibt. Der AutomobileWithModelNameCanStart -Test schlägt fehl, weil die Start -Methode in der Automobile -Klasse eine Ausnahme auslöst.

    Das Fenster Testergebnisse wird in der folgenden Abbildung gezeigt.

    Testergebnisse mit Fehlern

  2. Doppelklicken Sie im Fenster Testergebnisse auf jede Testergebniszeile, um zum Speicherort der einzelnen Tests zu gelangen.

Implementieren des Quellcodes

  1. Fügen Sie dem Standardkonstruktor den folgenden Code hinzu, sodass die Eigenschaften Model, TopSpeed und IsRunning mit den richtigen Standardwerten von "Not specified", -1, und False (oder false für C#) initialisiert werden.

    public Automobile()
    {
        this.Model = "Not specified";
        this.TopSpeed = -1;
        this.IsRunning = true;
    }
    
  2. Wenn die Start -Methode aufgerufen wird, sollte das IsRunning -Flag nur auf "true" festgelegt werden, wenn die Eigenschaft Model oder TopSpeed auf einen anderen als den Standardwert festgelegt sind. Entfernen Sie die NotImplementedException aus dem Methodentext, und fügen Sie den folgenden Code hinzu.

    public void Start()
    {
        if (this.Model != "Not specified" || this.TopSpeed != -1)
            this.IsRunning = true;
        else
            this.IsRunning = false;
    }
    

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.

    Testergebnisse ohne Fehler