Tutorial: Testen einer .NET-Klassenbibliothek mit Visual Studio Code
In diesem Tutorial wird gezeigt, wie Sie Komponententests automatisieren, indem Sie einer Projektmappe ein Testprojekt hinzufügen.
Voraussetzungen
- In diesem Tutorial wird die Projektmappe verwendet, die Sie in Tutorial: Erstellen einer .NET-Standard-Bibliothek in Visual Studio Code erstellen.
Erstellen eines Komponententestprojekts
Komponententests bieten automatisierte Softwaretests während der Entwicklung und Veröffentlichung. Das in diesem Tutorial verwendete Testframework ist MSTest. MSTest ist eines von drei Testframeworks, aus denen Sie wählen können. Die beiden anderen sind xUnit und nUnit.
Starten Sie Visual Studio Code.
Öffnen Sie die
ClassLibraryProjects
-Projektmappe, die Sie in Tutorial: Erstellen einer .NET-Standard-Bibliothek in Visual Studio Code erstellt haben.Von Lösungs-Explorer, Wählen Sie Neues Projekt, oder wählen Sie in der Befehlspalette .NET: Neues Projekt.
Wählen Sie MSTest Test-Projekt, benennen Sie es „StringLibraryTest“, wählen Sie das Standardverzeichnis und wählen Sie Projekt erstellen.
Die Projektvorlage erstellt die Datei UnitTest1.cs, die den folgenden Code enthält:
namespace StringLibraryTest; [TestClass] public class UnitTest1 { [TestMethod] public void TestMethod1() { } }
Der von der Vorlage für Komponententests erstellte Quellcode führt Folgendes aus:
- Er wendet das Attribut TestClassAttribute auf die Klasse
UnitTest1
an. - Er wendet das Attribut TestMethodAttribute an, um
TestMethod1
zu definieren. - Er importiert den Microsoft.VisualStudio.TestTools.UnitTesting-Namespace, der die Typen enthält, die für Unittests verwendet werden. In C# wird der Namespace über eine
global using
-Anweisung in GlobalUsings.cs importiert.
Jede Methode, die mit [TestMethod] gekennzeichnet ist, wird in einer Testklasse, die mit [TestClass] gekennzeichnet ist, automatisch ausgeführt, wenn der Unit-Test aufgerufen wird.
- Er wendet das Attribut TestClassAttribute auf die Klasse
Hinzufügen eines Projektverweises
Damit das Testprojekt mit der StringLibrary
-Klasse arbeitet, fügen Sie im StringLibraryTest
-Projekt einen Verweis auf das StringLibrary
-Projekt hinzu.
Von Lösungs-Explorer Klicken Sie mit der rechten Maustaste auf das Projekt 'StringLibraryTest' und wählen Sie Projektreferenz hinzufügen.
Wählen Sie „StringLibrary” aus.
Hinzufügen und Ausführen von Komponententestmethoden
Wenn Visual Studio einen Komponententest aufruft, wird jede Methode, die mit dem TestMethodAttribute-Attribut gekennzeichnet ist, in einer Klasse ausgeführt, die mit dem TestClassAttribute-Attribut gekennzeichnet ist. Eine Testmethode endet, wenn der erste Fehler gefunden wird, oder wenn alle in der Methode enthaltenen Tests erfolgreich ausgeführt wurden.
In den am häufigsten verwendeten Tests werden Member der Klasse Assert aufgerufen. Viele Assert-Methoden enthalten mindestens zwei Parameter, von denen einer das erwartete und der andere das tatsächliche Testergebnis ist. Die am häufigsten aufgerufenen Methoden der Assert
-Klasse werden in der nachfolgenden Tabelle aufgeführt:
Assert-Methoden | Funktion |
---|---|
Assert.AreEqual |
Überprüft, ob zwei Werte oder Objekte gleich sind. Der Assert ist nicht erfolgreich, wenn die Werte oder Objekte nicht gleich sind. |
Assert.AreSame |
Überprüft, ob zwei Objektvariablen auf das gleiche Objekt verweisen. Die Bestätigung ist nicht erfolgreich, wenn die Variablen auf verschiedene Objekte verweisen. |
Assert.IsFalse |
Überprüft, ob eine Bedingung false ist. Die Bestätigung ist nicht erfolgreich, wenn die Bedingung true ist. |
Assert.IsNotNull |
Überprüft, ob ein Objekt nicht null ist. Die Bestätigung ist nicht erfolgreich, wenn das Objekt null ist. |
Sie können auch die Assert.ThrowsException (oder Assert.Throws
und Assert.ThrowsExactly
bei Verwendung von MSTest 3.8 und höher) in einer Testmethode verwenden, um den erwarteten Ausnahmetyp anzugeben. Der Test ist nicht erfolgreich, wenn die angegebene Ausnahme nicht ausgelöst wird.
Beim Testen der StringLibrary.StartsWithUpper
-Methode möchten Sie eine Reihe von Zeichenfolgen bereitstellen, die mit einem Großbuchstaben beginnen. Sie erwarten, dass die Methode in diesen Fällen true
zurückgibt, also können Sie die Methode Assert.IsTrue aufrufen. Außerdem möchten Sie eine Reihe von Zeichenfolgen bereitstellen, die nicht mit einem Großbuchstaben beginnen. Sie erwarten, dass die Methode in diesen Fällen false
zurückgibt, also können Sie die Methode Assert.IsFalse aufrufen.
Da Ihre Bibliotheksmethode Zeichenfolgen verarbeitet, sollten Sie sicherstellen, dass sie eine leere Zeichenfolge (String.Empty
) und eine null
-Zeichenfolge erfolgreich verarbeiten kann. Eine leere Zeichenfolge enthält keine Zeichen, und ihre Length-Eigenschaft weist den Wert „0“ auf. Eine null
-Zeichenfolge ist eine Zeichenfolge, die nicht initialisiert wurde. Sie können StartsWithUpper
als statische Methode direkt aufrufen und ein einzelnes String-Argument übergeben. Alternativ können Sie StartsWithUpper
als Erweiterungsmethode für eine string
-Variable aufrufen, die null
zugewiesen ist.
Sie definieren drei Methoden, von denen jede eine zugehörige Assert-Methode für jedes Element in einem Zeichenfolgenarray aufruft. Sie rufen eine Methodenüberladung auf, mit der Sie eine Fehlermeldung angeben können, die im Falle eines Testfehlers angezeigt werden soll. Die Meldung enthält die Zeichenfolge, die den Fehler verursacht hat.
So erstellen Sie die Testmethoden:
Öffnen Sie die Datei StringLibraryTest/UnitTest1.cs, und ersetzen Sie den gesamten Code durch den folgenden:
using Microsoft.VisualStudio.TestTools.UnitTesting; using UtilityLibraries; namespace StringLibraryTest { [TestClass] public class UnitTest1 { [TestMethod] public void TestStartsWithUpper() { // Tests that we expect to return true. string[] words = { "Alphabet", "Zebra", "ABC", "Αθήνα", "Москва" }; foreach (var word in words) { bool result = word.StartsWithUpper(); Assert.IsTrue(result, string.Format("Expected for '{0}': true; Actual: {1}", word, result)); } } [TestMethod] public void TestDoesNotStartWithUpper() { // Tests that we expect to return false. string[] words = { "alphabet", "zebra", "abc", "αυτοκινητοβιομηχανία", "государство", "1234", ".", ";", " " }; foreach (var word in words) { bool result = word.StartsWithUpper(); Assert.IsFalse(result, string.Format("Expected for '{0}': false; Actual: {1}", word, result)); } } [TestMethod] public void DirectCallWithNullOrEmpty() { // Tests that we expect to return false. string?[] words = { string.Empty, null }; foreach (var word in words) { bool result = StringLibrary.StartsWithUpper(word); Assert.IsFalse(result, string.Format("Expected for '{0}': false; Actual: {1}", word == null ? "<null>" : word, result)); } } } }
Der Test für Großbuchstaben in der
TestStartsWithUpper
-Methode enthält den griechischen Großbuchstaben Alpha (U+0391) und den kyrillischen Großbuchstaben EM (U+041C). Der Test für Kleinbuchstaben in derTestDoesNotStartWithUpper
-Methode enthält den griechischen Kleinbuchstaben alpha (U+03B1) und den kyrillischen Kleinbuchstaben ghe (U+0433).Speichern Sie die Änderungen.
Erstelle und führe deine Tests aus
Unter Lösungs-Explorer, klicken Sie mit der rechten Maustaste auf die Lösung und wählen Sie Bauen Sie oder wählen Sie in der Befehlspalette .NET: Bauen Sie.
Wählen Sie die Prüfung Fenster, wählen Sie Tests durchführen oder wählen Sie in der Befehlspalette Test: Alle Tests durchführen.
Testfehler beheben
Bei der testgesteuerten Entwicklung (Test-Driven Development, TDD) schreiben Sie zunächst Tests, bei deren ersten Ausführung Fehler auftreten. Anschließend fügen Sie der App Code hinzu, mit dem der Test erfolgreich ausgeführt wird. Für dieses Tutorial haben Sie den Test, der den Code überprüft, nach Schreiben des App-Codes erstellt, sodass beim Test kein Fehler aufgetreten ist. Um zu überprüfen, ob ein Test fehlschlägt, wenn Sie dies erwarten, fügen Sie der Testeingabe einen ungültigen Wert hinzu.
Verändern Sie das
words
-Array in derTestDoesNotStartWithUpper
-Methode, um die Zeichenfolge "Error" einzufügen.string[] words = { "alphabet", "Error", "zebra", "abc", "αυτοκινητοβιομηχανία", "государство", "1234", ".", ";", " " };
Führen Sie die Tests aus, indem Sie auf den grünen Fehler neben dem Test im Editor klicken.
Die Ausgabe zeigt, dass der Test fehlschlägt, und enthält eine Fehlermeldung für den fehlgeschlagenen Test: „Assert.IsFalse ist fehlgeschlagen. Für 'Error' erwartet: False; tatsächlich: True“. Wegen des Fehlers wurden keine auf „Error“ folgenden Zeichenfolgen im Array getestet.
Entfernen Sie die Zeichenfolge "Error", die Sie in dem Schritt hinzugefügt haben.
Führen Sie den Test erneut aus. Nun ist er erfolgreich.
Testen der Releaseversion der Bibliothek
Nachdem die Tests beim Ausführen des Debugbuilds der Bibliothek nun alle erfolgreich waren, führen Sie die Tests auch für den Releasebuild der Bibliothek aus. Eine Reihe von Faktoren einschließlich der Compileroptimierungen kann manchmal zu einem unterschiedlichen Verhalten von Debug- und endgültiger Produktversion führen.
Führen Sie die Tests mit der Releasebuildkonfiguration aus:
dotnet test StringLibraryTest/StringLibraryTest.csproj --configuration Release
Die Tests sind erfolgreich.
Debuggen von Tests
Wenn Sie Visual Studio Code als IDE verwenden, können Sie den gleichen Prozess wie unter Tutorial: Debuggen einer .NET Core-Konsolenanwendung mit Visual Studio Code beschrieben verwenden, um Code mit Ihrem Komponententestprojekt zu debuggen. Anstelle des Starts der Schaukasten App-Projekt, öffnen StringLibraryTest/UnitTest1.cs, und wählen Sie Debug-Tests in der aktuellen Da zwischen den Zeilen 7 und 8. Wenn Sie sie nicht finden können, drücken Sie Ctrl+Schicht+P um die Befehlspalette zu öffnen, und geben Sie Fenster neu laden.
Visual Studio Code startet das Testprojekt mit angefügtem Debugger. Die Ausführung wird an jedem Haltepunkt angehalten, den Sie dem Testprojekt oder zugrunde liegenden Bibliothekscode hinzugefügt haben.
Zusätzliche Ressourcen
Nächste Schritte
In diesem Tutorial haben Sie Komponententests für eine Klassenbibliothek ausgeführt. Sie können die Bibliothek anderen Benutzern zur Verfügung stellen, indem Sie sie als Paket auf NuGet veröffentlichen. Weitere Informationen dazu finden Sie in einem NuGet-Tutorial:
Wenn Sie eine Bibliothek als NuGet-Paket veröffentlichen, können andere Benutzer diese installieren und verwenden. Weitere Informationen dazu finden Sie in einem NuGet-Tutorial:
Eine Bibliothek muss nicht als Paket verteilt werden. Es kann mit einer Konsolen-App gebündelt werden, die es verwendet. Informationen zum Veröffentlichen einer Konsolen-App finden Sie in einem früheren Tutorial dieser Reihe:
Das Visual Studio Code-Erweiterung C#-Entwicklerkit bietet weitere Tools für die Entwicklung von C#-Apps und -Bibliotheken: