Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
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-Klassenbibliothek in Visual Studio Code erstellen.
Erstellen eines Komponententestprojekts
Komponententests bieten automatisierte Softwaretests während der Entwicklung und Veröffentlichung. MSTest ist eines von drei Testframeworks, aus denen Sie wählen können. Die beiden anderen sind xUnit und nUnit.
Starten Sie Visual Studio.
Öffnen Sie die Projektmappe
ClassLibraryProjects, die Sie in Tutorial: Erstellen einer .NET-Klassenbibliothek in Visual Studio Code erstellt haben.Fügen Sie der Lösung ein neues Unittestprojekt namens "StringLibraryTest" hinzu.
Klicken Sie im Projektmappen-Explorer mit der rechten Maustaste auf die Projektmappe, und wählen Sie Hinzufügen>Neues Projekt aus.
Geben Sie auf der Seite Neues Projekt hinzufügenmstest in das Suchfeld ein. Wählen Sie C# oder Visual Basic in der Liste der Sprachen und dann in der Liste der Plattformen Alle Plattformen aus.
Wählen Sie die Vorlage MSTest-Testprojekt aus, und klicken Sie dann auf Weiter.
Geben Sie im auf der Seite Neues Projekt konfigurieren im Feld Projektname den Namen StringLibraryTest ein. Klicken Sie dann auf Weiter.
Wählen Sie auf der Seite Zusätzliche Informationen im Feld Zielframework die Option .NET 8 aus. Wählen Sie dann Erstellen aus.
Visual Studio erstellt das Projekt und öffnet die Klassendatei mit dem folgenden Code im Codefenster. Wenn die sprache, die Sie verwenden möchten, nicht angezeigt wird, ändern Sie die Sprachauswahl oben auf der Seite.
namespace StringLibraryTest; [TestClass] public class UnitTest1 { [TestMethod] public void TestMethod1() { } }Imports Microsoft.VisualStudio.TestTools.UnitTesting Namespace StringLibraryTest <TestClass> Public Class UnitTest1 <TestMethod> Sub TestSub() End Sub End Class End NamespaceDer von der Vorlage für Komponententests erstellte Quellcode führt Folgendes aus:
- Importiert den Microsoft.VisualStudio.TestTools.UnitTesting-Namespace, der die Typen enthält, die für Komponententests verwendet werden. In C# wird der Namespace über eine
global using-Anweisung in GlobalUsings.cs importiert. - Wendet das TestClassAttribute Attribut auf die
UnitTest1Klasse an. - Wendet das TestMethodAttribute-Attribut an, um
TestMethod1in C# oderTestSubin Visual Basic festzulegen.
Jede methode, die mit [TestMethod] in einer mit [TestClass] markierten Testklasse markiert ist, wird automatisch ausgeführt, wenn der Komponententest ausgeführt wird.
- Importiert den Microsoft.VisualStudio.TestTools.UnitTesting-Namespace, der die Typen enthält, die für Komponententests verwendet werden. In C# wird der Namespace über eine
Hinzufügen eines Projektverweises
Damit das Testprojekt mit der StringLibrary-Klasse funktioniert, fügen Sie im Projekt StringLibraryTest einen Verweis auf das Projekt StringLibrary hinzu.
Öffnen Sie im Projektmappen-Explorer das Kontextmenü für den Knoten Abhängigkeiten des StringLibraryTest-Projekts, und wählen Sie Projektverweis hinzufügen aus.
Erweitern Sie im Dialogfeld Verweis-Manager den Knoten Projekte, und aktivieren Sie das Kontrollkästchen neben StringLibrary. Durch Hinzufügen eines Verweises auf die
StringLibraryAssembly kann der Compiler stringLibrary-Methoden suchen, während das StringLibraryTest-Projekt kompiliert wird.Wählen Sie OK aus.
Hinzufügen und Ausführen von Komponententestmethoden
Wenn Visual Studio einen Komponententest ausführt, führt sie jede Methode aus, die mit dem TestMethodAttribute Attribut in einer Klasse gekennzeichnet ist, 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 sind.
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 viele 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. Ebenso möchten Sie viele Zeichenfolgen bereitstellen, die mit einem anderen Zeichen als 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, möchten Sie auch sicherstellen, dass sie eine leere Zeichenfolge (String.Empty), eine gültige Zeichenfolge, die keine Zeichen enthält und deren Length 0 ist, und eine null-Zeichenfolge, die nicht initialisiert wurde, erfolgreich verarbeitet. Rufen Sie direkt als statische Methode auf StartsWithUpper und übergeben Sie ein einzelnes String Argument. Oder rufen Sie StartsWithUpper als Erweiterungsmethode für eine string Variable auf, die zugewiesen ist null.
Definieren Sie drei Methoden, von denen jede eine Assert Methode für jedes Element in einem Zeichenfolgenarray aufruft. Rufen Sie eine Methodenüberladung auf, mit der Sie eine Fehlermeldung angeben können, die bei Testfehlern angezeigt werden soll. Die Meldung enthält die Zeichenfolge, die den Fehler verursacht hat.
So erstellen Sie die Testmethoden:
Ersetzen Sie den Code im Codefenster UnitTest1.cs oder UnitTest1.vb durch den folgenden Code:
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, $"Expected for '{word}': true; Actual: {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, $"Expected for '{word}': false; Actual: {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, $"Expected for '{word ?? "<null>"}': false; Actual: {result}"); } } }Imports Microsoft.VisualStudio.TestTools.UnitTesting Imports UtilityLibraries Namespace StringLibraryTest <TestClass> Public Class UnitTest1 <TestMethod> Public Sub TestStartsWithUpper() ' Tests that we expect to return true. Dim words() As String = {"Alphabet", "Zebra", "ABC", "Αθήνα", "Москва"} For Each word In words Dim result As Boolean = word.StartsWithUpper() Assert.IsTrue(result, $"Expected for '{word}': true; Actual: {result}") Next End Sub <TestMethod> Public Sub TestDoesNotStartWithUpper() ' Tests that we expect to return false. Dim words() As String = {"alphabet", "zebra", "abc", "αυτοκινητοβιομηχανία", "государство", "1234", ".", ";", " "} For Each word In words Dim result As Boolean = word.StartsWithUpper() Assert.IsFalse(result, $"Expected for '{word}': false; Actual: {result}") Next End Sub <TestMethod> Public Sub DirectCallWithNullOrEmpty() ' Tests that we expect to return false. Dim words() As String = {String.Empty, Nothing} For Each word In words Dim result As Boolean = StringLibrary.StartsWithUpper(word) Assert.IsFalse(result, $"Expected for '{If(word Is Nothing, "<null>", word)}': false; Actual: {result}") Next End Sub End Class End NamespaceDer 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).Wählen Sie in der Menüleiste Datei>UnitTest1.cs speichern unter oder Datei>UnitTest1.vb speichern unter aus. Wählen Sie im Dialogfeld Datei speichern unter den Pfeil neben der Schaltfläche Speichern, und wählen Sie dann Mit Codierung speichern... aus.
Wählen Sie im Dialogfeld Speichern unter bestätigen die Schaltfläche Ja, um die Datei zu speichern.
Wählen Sie im Dialogfeld Erweiterte SpeicheroptionenUnicode (UTF-8 mit Signatur) – Codepage 65001 aus der Dropdownliste Codierung aus, und klicken Sie auf OK.
Wenn Sie den Quellcode nicht als UTF8-codierte Datei speichern, speichert Visual Studio ihn möglicherweise als ASCII-Datei. In diesem Fall decodiert die Laufzeit nicht genau die UTF8-Zeichen außerhalb des ASCII-Bereichs, und die Testergebnisse sind nicht korrekt.
Wählen Sie auf der Menüleiste Testen>Alle Tests ausführen aus. Wenn das Fenster Test-Explorer nicht geöffnet wird, öffnen Sie es, indem Sie Test>Test-Explorerauswählen. Die drei Tests sind im Abschnitt Bestandene Tests aufgelistet, und im Abschnitt Zusammenfassung wird das Ergebnis des Testlaufs berichtet.
Umgang mit Testfehlern
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 erwarten, dass er fehlschlägt, 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. Sie müssen die Datei nicht speichern, das Visual Studio offene Dateien automatisch speichert, wenn eine Projektmappe zum Ausführen von Tests erstellt wurde.string[] words = { "alphabet", "Error", "zebra", "abc", "αυτοκινητοβιομηχανία", "государство", "1234", ".", ";", " " };Dim words() As String = { "alphabet", "Error", "zebra", "abc", "αυτοκινητοβιομηχανία", "государство", "1234", ".", ";", " " }Führen Sie den Test aus, indem Sie auf der Menüleiste Testen>Alle Tests ausführen auswählen. Das Fenster Test-Explorer zeigt an, dass zwei Tests erfolgreich waren und ein Test fehlgeschlagen ist.
Wählen Sie den fehlgeschlagenen Test (
TestDoesNotStartWith) aus.Im Fenster Test-Explorer wird die Assert-Meldung angezeigt: „Fehler bei Assert.IsFalse. Erwartet für 'Fehler': false; tatsächlich: True. Aufgrund des Fehlens wurden die Zeichenfolgen im Array nach 'Fehler' nicht überprüft.
Entfernen Sie die Zeichenfolge „Error“, die Sie in Schritt 1 hinzugefügt haben. Führen Sie den Test erneut aus. Nun ist er erfolgreich.
Testen der Releaseversion der Bibliothek
Nachdem die Tests nun beim Ausführen des Debugbuilds der Bibliothek bestanden haben, führen Sie die Tests erneut mit dem Releasebuild der Bibliothek aus. Einige Faktoren, einschließlich Compileroptimierungen, können manchmal ein anderes Verhalten zwischen Debug- und Releasebuilds erzeugen.
So testen Sie die endgültige Produktversion:
Ändern Sie in der Symbolleiste von Visual Studio die Buildkonfiguration von Debuggen zu Freigabe.
Klicken Sie im Projektmappen-Explorer mit der rechten Maustaste auf das StringLibrary-Projekt, und wählen Sie aus dem Kontextmenü Erstellen aus, um die Bibliothek erneut zu kompilieren.
Führen Sie den Komponententest aus, indem Sie auf der Menüleiste Test>Alle Tests ausführen auswählen. Die Tests sind erfolgreich.
Debuggen von Tests
Wenn Sie Visual Studio als IDE verwenden, können Sie den gleichen Prozess wie im Tutorial: Debuggen einer .NET-Konsolenanwendung mit Visual Studio Code beschrieben zum Debuggen von Code mithilfe Ihres Komponententestprojekts verwenden. Anstatt das App-Projekt ShowCase zu starten, klicken Sie erst mit der rechten Maustaste auf das Projekt StringLibraryTests und anschließend mit der linken im Kontextmenü auf Tests debuggen.
Visual Studio startet das Testprojekt mit angefügtem Debugger. Die Ausführung wird an jedem Haltepunkt beendet, den Sie dem Testprojekt oder dem zugrunde liegenden Bibliothekscode hinzugefügt haben.
Zusätzliche Ressourcen
Nächste Schritte
In diesem Tutorial haben Sie Komponententests für eine Klassenbibliothek ausgeführt. Machen Sie die Bibliothek für andere verfügbar, indem Sie sie als Paket in 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: