Grundlagen zum Komponententest
Überprüfen Sie, ob Ihr Code wie erwartet funktioniert, indem Sie Komponententests erstellen und ausführen. Diese Tests werden als „Komponententests“ bezeichnet, da Sie die Funktionalität Ihres Programms in einzelne testfähige Verhalten gliedern, die Sie als einzelne Komponenten testen können. Mit dem Test-Explorer von Visual Studio können Sie Komponententests flexibel und effizient ausführen und die Ergebnisse in Visual Studio anzeigen. In Visual Studio werden die Komponententest-Frameworks von Microsoft für verwalteten und systemeigenen Code installiert. Verwenden Sie ein Komponententest-Framework , um Komponententests zu erstellen, auszuführen und Berichte mit den Ergebnissen dieser Tests zu erstellen. Führen Sie Komponententests erneut durch, wenn Sie Änderungen vorgenommen haben, um zu testen, dass der Code weiterhin ordnungsgemäß ausgeführt wird. In Visual Studio Enterprise wird dies mit Live Unit Testing automatisch durchgeführt, sodass Tests erkannt werden, die von Ihren Codeänderungen beeinträchtigt werden. Diese werden im Hintergrund während Ihrer Eingabe ausgeführt.
Komponententests dienen dann am besten der Qualität Ihres Codes, wenn sie ein integraler Bestandteil des Softwareentwicklungsworkflows sind. Sobald Sie eine Funktion oder einen anderen Block mit Anwendungscode geschrieben haben, können Sie Komponententests erstellen, mit denen Sie das Verhalten des Codes bei der Eingabe von Standarddaten, falschen Daten und Daten an der Grenze des Gültigkeitsbereichs überprüfen können. Zudem bieten die Tests die Möglichkeit, alle im Code enthaltenen expliziten oder impliziten Annahmen zu überprüfen. Mit der testgesteuerten Entwicklungwerden die Komponententests erstellt, bevor der Code geschrieben wird. So werden die Komponententests als Entwurfsdokumentation und als funktionale Spezifikationen der Funktionen verwendet.
Mit dem Test-Explorer können auch Drittanbieter- und Open-Source-Komponententest-Frameworks ausgeführt werden, in denen Test-Explorer-Add-On-Schnittstellen implementiert sind. Sie können viele dieser Frameworks über den Visual Studio-Erweiterungs-Manager und die Visual Studio Gallery hinzufügen. Weitere Informationen finden Sie unter Installieren von Frameworks für Komponententests von Drittanbietern.
Sie können schnell generieren Testprojekte und Testmethoden im Code oder die Tests manuell erstellen, wenn Sie sie benötigen. Wenn Sie IntelliTest verwenden, um .NET-Code zu untersuchen, können Sie Testdaten und eine Suite von Komponententests generieren. Für jede Anweisung im Code wird eine Testeingabe generiert, die die betreffende Anweisung ausführt. Hier erfahren Sie, wie Sie Komponententests für .NET Code generieren.
Erste Schritte
Eine Einführung in Unittests, in der Sie direkt in die Codierung eingeführt werden, finden Sie in diesen Artikeln:
Exemplarische Vorgehensweise: Erstellen und Ausführen von Komponententests für .NET-Code
Exemplarische Vorgehensweise: Testgesteuerte Entwicklung mit dem Test-Explorer
Beispiel einer Banklösung
In diesem Artikel dient die Entwicklung einer fiktiven Anwendung mit dem Namen MyBank
als Beispiel. Sie benötigen den tatsächlichen Code nicht, um den Erläuterungen in diesem Artikel folgen zu können. Testmethoden werden in C# geschrieben und mithilfe des Microsoft Unit Testing Framework for Managed Code angezeigt. Die Konzepte lassen sich jedoch leicht auf andere Sprachen und Frameworks übertragen.
Der erste Entwurf für die Anwendung MyBank
umfasst eine Kontenkomponente, die ein Einzelkonto und die zugehörigen Transaktionen mit der Bank darstellt, sowie eine Datenbankkomponente, die die Funktionen zum Aggregieren und Verwalten der Einzelkonten darstellt.
Erstellen Sie eine Bank
-Projektmappe, die zwei Projekte enthält:
Accounts
BankDB
Der erste Entwurf des Projekts Accounts
enthält eine Klasse, die die grundlegenden Informationen über ein Konto aufnimmt, eine Schnittstelle, die die allgemeinen Funktionen jedes Kontotyps wie das Einzahlen und Abheben von Geld festlegt, und eine von der Schnittstelle abgeleitete Klasse, die ein Girokonto darstellt. Erstellen Sie zunächst die folgenden Quelldateien für das Projekt "Accounts":
InAccountInfo.cs werden die grundlegenden Informationen für ein Konto definiert.
In IAccount.cs wird eine
IAccount
-Standardschnittstelle für ein Konto definiert, die Methoden zum Einzahlen und zum Abheben von Geld und zum Abrufen des Kontostands umfasst.CheckingAccount.cs enthält die
CheckingAccount
-Klasse, die dieIAccount
-Schnittstelle für ein Girokonto implementiert.
Sie wissen aus Erfahrung, dass bei einer Abhebung von einem Girokonto sichergestellt werden muss, dass der abzuhebende Betrag kleiner als der Kontostand ist. Daher überschreiben Sie die IAccount.Withdraw
-Methode in CheckingAccount
mit einer Methode, die prüft, ob diese Bedingung erfüllt ist. Hierfür kann folgende Methode formuliert werden:
public void Withdraw(double amount)
{
if(m_balance >= amount)
{
m_balance -= amount;
}
else
{
throw new ArgumentException(nameof(amount), "Withdrawal exceeds balance!");
}
}
Der nun vorliegende Code kann getestet werden.
Erstellen von Unittests mit Copilot
Sie können auch den Copilot /tests
Schrägstrich-Befehl verwenden, um Unittests aus Code zu generieren. Sie können z. B. /tests using NUnit Framework
eingeben, um NUnit-Tests zu generieren. Weitere Informationen finden Sie unter Verwenden von Schrägstrichbefehlen in Copilot Chat.
Erstellen von Komponententestprojekten und Testmethoden in C#
Für C# ist es häufig schneller, das Komponententestprojekt und die Komponententest-Stubs aus Ihrem Code zu generieren. Sie können das Komponententestprojekt und die Tests je nach Ihren Anforderungen auch manuell erstellen. Wenn Sie Komponententests aus Code mit dem Framework eines Drittanbieters erstellen möchten, muss eine dieser Erweiterungen installiert sein: NUnit oder xUnit. Wenn Sie kein C# verwenden, überspringen Sie diesen Abschnitt, und fahren Sie mit Manuelles Erstellen des Komponententestprojekts und der Komponententests fort.
Generieren des Komponententestprojekts und der Komponententest-Stubs
Klicken Sie im Code-Editorfenster mit der rechten Maustaste, und wählen Sie im Kontextmenü die Option Komponententests erstellen aus.
Hinweis
Der Menübefehl Komponententests erstellen ist nur für C#-Code verfügbar. Für die Verwendung dieser Methode mit .NET Core oder .NET Standard ist mindestens Visual Studio 2019 erforderlich.
Hinweis
Der Menübefehl Komponententests erstellen ist nur für C#-Code verfügbar. Für die Verwendung dieser Methode mit .NET Core oder .NET Standard ist mindestens Visual Studio 2019 erforderlich.
Wählen Sie OK, um die Komponententests mit den Standardeinstellungen erstellen. Sie können die Werte zum Erstellen und Benennen des Komponententestprojekts und der Komponententests jedoch ändern. Sie können den Code auswählen, der den Komponententestmethoden standardmäßig hinzugefügt wird.
Die Komponententest-Stubs werden in einem neuen Komponententestprojekt für alle Methoden in der Klasse erstellt.
Erfahren Sie jetzt direkt, wie Sie Ihre Tests schreiben, um einen sinnvollen Komponententest sowie weitere Komponententests zu erstellen, die Sie für einen gründlichen Test Ihres Codes noch hinzufügen möchten.
Manuelles Erstellen des Komponententestpojekts und der Komponententests
Ein Komponententestprojekt entspricht in der Regel der Struktur eines einzelnen Codeprojekts. Im MyBank-Beispiel fügen Sie der Projektmappe AccountsTests
die beiden Komponententestprojekte BankDbTests
und Bank
hinzu. Die Testprojektnamen wurden willkürlich ausgewählt, es ist jedoch empfehlenswert, eine standardmäßige Benennungskonvention zu verwenden.
So fügen Sie einer Projektmappe ein Komponententestprojekt hinzu
Klicken Sie im Projektmappen-Explorer mit der rechten Maustaste auf die Projektmappe, und wählen Sie dann Hinzufügen>Neues Projekt aus.
Geben Sie testen in das Projektvorlagen-Suchfeld ein, um eine Komponententest-Projektvorlage für das Testframework zu finden, das Sie verwenden möchten. (In den Beispielen zu diesem Artikel verwenden wir das MSTest-Tool.)
Benennen Sie das Projekt auf der nächsten Seite. Beispielsweise können Sie das Projekt zum Testen des Projekts
Accounts
in unserem BeispielAccountsTests
nennen.Fügen Sie im Komponententestprojekt unter "Test" einen Verweis auf das Codeprojekt hinzu, in unserem Beispiel auf das Projekt "Accounts".
So erstellen Sie den Verweis auf das Codeprojekt
Klicken Sie im Komponententestprojekt in Projektmappen-Explorer mit der rechten Maustaste auf Verweise oder Abhängigkeiten, und wählen Sie dann Projektverweis hinzufügen oder Verweis hinzufügen, je nach Verfügbarkeit, aus.
Öffnen Sie im Dialogfeld Verweis-Manager den Knoten Projektmappe, und wählen Sie Projekte aus. Wählen Sie den Namen des Codeprojekts aus, und schließen Sie das Dialogfeld.
Jedes Komponententestprojekt enthält Klassen, die die Namen der Klassen im Codeprojekt widerspiegeln. In diesem Beispiel enthält das Projekt AccountsTests
die folgenden Klassen:
Die
AccountInfoTests
-Klasse enthält die Komponententestmethoden für dieAccountInfo
-Klasse im ProjektAccounts
.Die
CheckingAccountTests
-Klasse enthält die Komponententestmethoden für dieCheckingAccount
-Klasse.
Erstellen der Tests
Das verwendete Komponententestframework und Visual Studio IntelliSense führen Sie durch das Erstellen von Komponententests für ein Codeprojekt. Für die meisten Frameworks müssen Sie zum Ausführen im Test-Explorer bestimmte Attribute hinzufügen, um die Komponententestmethoden anzugeben. Die Frameworks bieten zudem eine Möglichkeit, anzuzeigen, ob die Testmethode erfolgreich war oder fehlgeschlagen ist. Dazu dienen in der Regel Assert-Anweisungen oder Methodenattribute. Mit anderen Attributen werden optionale Setup-Methoden angegeben, die bei der Initialisierung der Klasse und vor jeder Testmethode und vor Teardown-Methoden ausgeführt werden, die wiederum nach jeder Testmethode und bevor die Klasse zerstört wird ausgeführt werden.
Das Muster "AAA" (Arrange, Act, Assert) stellt ein häufig verwendetes Verfahren zum Schreiben von Komponententests für eine zu testende Methode dar.
Im Abschnitt Arrange (Vorbereitung) einer Komponententestmethode werden Objekte initialisiert und die Werte der Daten festgelegt, die an die zu testende Methode übergeben werden.
Im Abschnitt Act (Aktion) wird die zu testende Methode mit den vorbereiteten Parametern aufgerufen.
Im Abschnitt Assert (Bestätigung) wird überprüft, ob die zu testende Methode wie erwartet funktioniert. Die Methoden in der Klasse Assert werden häufig zur Überprüfung für .NET verwendet.
Zum Testen der CheckingAccount.Withdraw
-Methode in diesem Beispiel können Sie zwei Tests schreiben. Einen, der das Standardverhalten der Methode überprüft und einen, der überprüft, dass eine Abhebung, die den Kontostand übersteigt, einen Fehler auslöst. Der folgende Code zeigt einen MSTest-Komponententest, der in .NET unterstützt wird. Fügen Sie der CheckingAccountTests
-Klasse die folgenden Methoden hinzu:
[TestMethod]
public void Withdraw_ValidAmount_ChangesBalance()
{
// arrange
double currentBalance = 10.0;
double withdrawal = 1.0;
double expected = 9.0;
var account = new CheckingAccount("JohnDoe", currentBalance);
// act
account.Withdraw(withdrawal);
// assert
Assert.AreEqual(expected, account.Balance);
}
[TestMethod]
public void Withdraw_AmountMoreThanBalance_Throws()
{
// arrange
var account = new CheckingAccount("John Doe", 10.0);
// act and assert
Assert.ThrowsException<System.ArgumentException>(() => account.Withdraw(20.0));
}
Weitere Informationen zu den Microsoft-Unittest-Frameworks finden Sie in einem der folgenden Artikel:
Festlegen von Timeouts für Komponententests
Wenn Sie das MSTest-Framework nutzen, können Sie die TimeoutAttribute-Klasse verwenden, um ein Timeout für eine einzelne Testmethode festzulegen:
[TestMethod]
[Timeout(2000)] // Milliseconds
public void My_Test()
{ ...
}
So legen Sie das maximal zulässige Timeout fest:
[TestMethod]
[Timeout(TestTimeout.Infinite)] // Milliseconds
public void My_Test ()
{ ...
}
Ausführen von Tests im Test-Explorer
Wenn Sie das Testprojekt erstellen, werden die Tests im Test-Explorer angezeigt. Falls der Test-Explorer nicht geöffnet ist, wählen Sie im Visual Studio-Menü Test zuerst Fenster und dann Test-Explorer aus, oder drücken Sie STRG + E, T.
Beim Ausführen, Schreiben und erneuten Ausführen der Tests kann der Test-Explorer die Ergebnisse in den Gruppen Fehlgeschlagene Tests, Bestandene Tests, Abgebrochene Tests sowie Nicht ausgeführte Tests anzeigen. In der Symbolleiste können Sie unterschiedliche Optionen für „Gruppieren nach“ auswählen.
Sie können die Tests in jeder Ansicht durch entsprechenden Text im Suchfeld auf globaler Ebene filtern oder indem Sie einen der vordefinierten Filter auswählen. Sie können jederzeit eine beliebige Auswahl der Tests ausführen. Die Ergebnisse eines Testlaufs sind sofort oben im Explorer-Fenster in der Erfolgreich/Fehler-Leiste sichtbar. Details zu den Ergebnissen einer Testmethode werden angezeigt, wenn Sie den Test auswählen.
Ausführen und Anzeigen von Tests
Mithilfe der Test-Explorer-Symbolleiste können Sie die Tests ermitteln, organisieren und ausführen, die Sie interessieren.
Wählen Sie Alle ausführen aus, oder drücken Sie STRG + R, V, um alle Tests auszuführen. Wenn Sie Ausführen auswählen oder STRG + R, T drücken, können Sie die auszuführenden Tests auswählen. Wählen Sie einen Test aus, um die Details dieses Tests im Testdetailbereich anzuzeigen. Klicken Sie im Kontextmenü auf Test öffnen (auf der Tastatur: F12), um den Quellcode für den ausgewählten Test anzuzeigen.
Wenn einzelne Tests keine Abhängigkeiten aufweisen, die verhindern, dass sie in beliebiger Reihenfolge ausgeführt werden können, sollten Sie parallele Testausführung über das Eigenschaftenmenü auf der Symbolleiste aktivieren. Dadurch lässt sich die Zeit deutlich verkürzen, die zum Ausführen aller Tests erforderlich ist.
Ausführen von Tests nach jedem Build
Klicken Sie zum Ausführen der Komponententests nach jedem lokalen Buildvorgang in der Test-Explorer-Symbolleiste auf das Einstellungssymbol, und wählen Sie Nach dem Buildvorgang Tests ausführen aus.
Filtern und Gruppieren der Testliste
Wenn Sie über viele Tests verfügen, können Sie im Suchfeld von Test-Explorer eine Eingabe vornehmen, um die Liste entsprechend der angegebenen Zeichenfolge zu filtern. Sie können den Filter weiter einschränken, indem Sie eine Option in der Filterliste auswählen.
Schaltfläche | Beschreibung |
---|---|
Wählen Sie die Schaltfläche Gruppieren nach aus, um die Tests nach Kategorie zu gruppieren. |
Weitere Informationen finden Sie unter Run unit tests with Test Explorer (Ausführen von Komponententests mit dem Test-Explorer).
Fragen und Antworten
F: Wie kann ich Komponententests debuggen?
Antwort: Mit dem Test-Explorer können Sie Debugsitzungen für Ihre Tests starten. Beim schrittweisen Durchlaufen des Codes mit dem Visual Studio-Debugger wechseln Sie nahtlos zwischen den Komponententests und dem zu testenden Projekt hin und zurück. Starten des Debuggens:
Legen Sie im Visual Studio-Editor in mindestens einer zu debuggenden Testmethode einen Haltepunkt fest.
Hinweis
Da Testmethoden in jeder die oft ausgegebene Befehlszeilen Reihenfolge ausgeführt werden können, legen Sie Haltepunkte in allen Testmethoden fest, die Sie debuggen möchten.
Wählen Sie im Test-Explorer die Testmethoden aus, und wählen Sie dann im Kontextmenü Ausgewählte Tests debuggen aus.
Erfahren Sie mehr über das Debuggen von Komponententests.
Frage: Wenn ich TDD verwende, wie generiere ich dann Code aus meinen Tests?
Antwort: Verwenden Sie Schnelle Aktionen zum Generieren von Klassen und Methoden in Ihrem Projektcode. Schreiben Sie eine Anweisung in einer Testmethode, mit der die Klasse oder die Methode aufgerufen wird, die Sie generieren möchten. Öffnen Sie anschließend die Glühbirne, die unter dem Fehler angezeigt wird. Wenn es sich um den Aufruf eines Konstruktors der neuen Klasse handelt, wählen Sie im Menü Typ generieren aus, und befolgen Sie die Schritte im Assistenten, um die Klasse in das Codeprojekt einzufügen. Wenn es sich um den Aufruf einer Methode handelt, wählen Sie im IntelliSense-Menü Methode generieren aus.
F: Kann ich Komponententests erstellen, die mehrere Datensätze als Eingabe zum Ausführen des Tests verwenden?
A: Ja. Mitdatengesteuerten Testmethoden können Sie einen Wertebereich in einer einzigen Komponententestmethode testen. Verwenden Sie ein DataRow
-, DynamicData
- oder DataSource
-Attribut für die Testmethode, die die Datenquelle mit den Variablenwerten enthält, die Sie testen möchten.
Die mit dem Attribut versehene Methode wird für jede Zeile in der Datenquelle ein Mal ausgeführt. Der Test-Explorer meldet einen Testfehler für die Methode, wenn eine der Iterationen fehlschlägt. Im Detailbereich mit dem Testergebnis für die Methode wird die Methode mit dem Status "Erfolgreich" bzw. "Fehler" für jede Datenzeile angezeigt.
Erfahren Sie mehr über datengesteuerte Komponententests.
F: Kann ich anzeigen, wie viel meines Codes durch die Komponententests getestet wird?
A: Ja. Mit dem Codeabdeckungstool von Visual Studio in Visual Studio Enterprise können Sie die Menge des Codes ermitteln, die tatsächlich von den Komponententests getestet wird. Es werden alle systemeigenen und verwalteten Sprachen sowie alle Komponententestframeworks, die durch das Komponententestframework ausgeführt werden können, unterstützt.
Das Codeabdeckungstool kann für ausgewählte oder alle Tests in einer Projektmappe ausgeführt werden. Im Fenster Code Coverage-Ergebnisse wird der Prozentsatz der durchlaufenen Produktcodeblöcke angezeigt, angeordnet nach Zeile, Funktion, Klasse, Namespace und Modul.
Um Code Coverage für Testmethoden in einer Projektmappe auszuführen, wählen Sie Test>Code Coverage für alle Tests analysieren aus.
Die Abdeckungsergebnisse werden im Fenster Code Coverage-Ergebnisse angezeigt.
Erfahren Sie mehr über Code Coverage.
F: Wie kann ich in meinem Code Methoden testen, die über externe Abhängigkeiten verfügen?
A: Ja. Wenn Sie über Visual Studio Enterprise verfügen, können Sie Microsoft Fakes für Testmethoden verwenden, die Sie mithilfe von Komponententestframeworks für verwalteten Code schreiben können.
Microsoft Fakes verwendet zwei Ansätze zum Erstellen von Ersatzklassen für externe Abhängigkeiten:
Stubs generieren Ersatzklassen, die von der übergeordneten Schnittstelle der Abhängigkeitszielklasse abgeleitet werden. Stubmethoden können als Ersatz für öffentliche virtuelle Methoden der Zielklasse verwendet werden.
Shims verwenden die Laufzeitinstrumentation, um Aufrufe einer Zielmethode zu einer Shim-Ersatzmethode für nicht virtuelle Methoden umzuleiten.
Bei beiden Ansätzen verwenden Sie die generierten Delegaten von Aufrufen der Abhängigkeitsmethode, um das Verhalten festzulegen, das Sie in der Testmethode haben möchten.
Erfahren Sie mehr über das Isolieren von Komponententestmethoden Microsoft Fakes.
F: Kann ich andere Komponententestframeworks verwenden, um Komponententests zu erstellen?
A: Ja, führen Sie diese Schritte aus, um andere Frameworks zu finden und zu installieren. Öffnen Sie die Projektmappe nach dem Neustart von Visual Studio erneut, um die Komponententests zu erstellen, und wählen Sie dann hier Ihre installierten Frameworks aus:
Ihre Komponententest-Stubs werden mit dem ausgewählten Framework erstellt.
F: Wie exportiere ich die Ergebnisse meiner Unit-Tests?
A: Sie können eine .runsettings-Datei entweder mit der Kommandozeile oder der Visual Studio-IDE verwenden, um Unit-Tests zu konfigurieren und die Testergebnisdatei festzulegen. Weitere Informationen finden Sie unter LoggerRunSettings-Element.