Tutorial: Testen einer .NET-Klassenbibliothek mit .NET mithilfe von Visual Studio
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.
Ein Komponententestprojekt erstellen
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 Projektmappe ein neues Komponententestprojekt mit dem Namen „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. Wählen Sie anschließend Weiter aus.
Wählen Sie auf der Seite Zusätzliche Informationen im Feld Zielframework die Option .NET 8 (Vorschau) aus. Wählen Sie dann Erstellen aus.
Visual Studio erstellt das Projekt und öffnet die Klassendatei mit dem folgenden Code im Codefenster. Wenn die gewünschte Sprache nicht angezeigt wird, ändern Sie die Sprachauswahl am oberen Rand 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 Namespace
Der von der Vorlage für Komponententests erstellte Quellcode führt Folgendes aus:
- Er importiert den Namespace Microsoft.VisualStudio.TestTools.UnitTesting, der für Komponententests verwendeten Typen enthält. In C# wird der Namespace über eine
global using
-Anweisung in GlobalUsings.cs importiert. - Er wendet das Attribut TestClassAttribute auf die Klasse
UnitTest1
an. - Er wendet das TestMethodAttribute-Attribut an, um
TestMethod1
in C# oderTestSub
in Visual Basic zu definieren.
Jede mit [TestMethod] gekennzeichnete Methode in einer mit [TestClass] gekennzeichneten Testklasse wird automatisch ausgeführt, wenn der Komponententest ausgeführt wird.
- Er importiert den Namespace Microsoft.VisualStudio.TestTools.UnitTesting, der für Komponententests verwendeten Typen enthält. 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. Das Hinzufügen eines Verweises auf die
StringLibrary
-Assembly ermöglicht dem Compiler, StringLibrary-Methoden zu finden, wenn das StringLibraryTest-Projekt kompiliert wird.Klicken Sie auf OK.
Hinzufügen und Ausführen von Komponententestmethoden
Wenn Visual Studio einen Komponententest ausführt, wird jede Methode, die mit dem Attribut TestMethodAttribute gekennzeichnet ist, in einer Klasse ausgeführt, die mit dem Attribut TestClassAttribute 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-Methode in einer Testmethode verwenden, um den Typ der Ausnahme anzugeben, die ausgelöst werden soll. 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, 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. 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 bei einem Testfehler 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, 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)); } } } }
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 Namespace
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).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 in einer UTF8-codierten Datei speichern, kann Visual Studio ihn als ASCII-Datei speichern. Wenn dies geschieht, decodiert die Laufzeit die UTF8-Zeichen außerhalb des ASCII-Bereichs nicht ordnungsgemäß, und die Testergebnisse sind nicht richtig.
Wählen Sie auf der Menüleiste Testen>Alle Tests ausführen aus. Wenn das Fenster Test-Explorer nicht geöffnet ist, öffnen Sie es, indem Sie Testen>Test-Explorer auswählen. Die drei Tests sind im Abschnitt Bestandene Tests aufgelistet, und im Abschnitt Zusammenfassung wird das Ergebnis des Testlaufs berichtet.
Behandeln von 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. Fügen Sie einen ungültigen Wert zur Testeingabe hinzu, um zu überprüfen, ob beim Test auch wirklich erwartungsgemäß ein Fehler auftritt.
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, dass zwei Tests erfolgreich ausgeführt wurden und einer nicht erfolgreich war.
Wählen Sie den fehlgeschlagenen Test (
TestDoesNotStartWith
) aus.Im Fenster Test-Explorer wird die Assert-Meldung angezeigt: „Fehler bei Assert.IsFalse. 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 Schritt 1 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.
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 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. Sie kann mit einer Konsolen-App gebündelt werden, die sie verwendet. Informationen zum Veröffentlichen einer Konsolen-App finden Sie in einem früheren Tutorial dieser Reihe:
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.
Ein Komponententestprojekt erstellen
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 Projektmappe ein neues Komponententestprojekt mit dem Namen „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. Wählen Sie anschließend Weiter aus.
Wählen Sie auf der Seite Zusätzliche Informationen im Feld Framework die Option .NET 7 (Standard-Laufzeitunterstützung) aus. Wählen Sie dann Erstellen aus.
Visual Studio erstellt das Projekt und öffnet die Klassendatei mit dem folgenden Code im Codefenster. Wenn die gewünschte Sprache nicht angezeigt wird, ändern Sie die Sprachauswahl am oberen Rand der Seite.
using Microsoft.VisualStudio.TestTools.UnitTesting; 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 Namespace
Der von der Vorlage für Komponententests erstellte Quellcode führt Folgendes aus:
- Er importiert den Namespace Microsoft.VisualStudio.TestTools.UnitTesting, der für Komponententests verwendeten Typen enthält.
- Er wendet das Attribut TestClassAttribute auf die Klasse
UnitTest1
an. - Er wendet das TestMethodAttribute-Attribut an, um
TestMethod1
in C# oderTestSub
in Visual Basic zu definieren.
Jede mit [TestMethod] gekennzeichnete Methode in einer mit [TestClass] gekennzeichneten Testklasse wird automatisch ausgeführt, wenn der Komponententest ausgeführt wird.
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. Das Hinzufügen eines Verweises auf die
StringLibrary
-Assembly ermöglicht dem Compiler, StringLibrary-Methoden zu finden, wenn das StringLibraryTest-Projekt kompiliert wird.Klicken Sie auf OK.
Hinzufügen und Ausführen von Komponententestmethoden
Wenn Visual Studio einen Komponententest ausführt, wird jede Methode, die mit dem Attribut TestMethodAttribute gekennzeichnet ist, in einer Klasse ausgeführt, die mit dem Attribut TestClassAttribute 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-Methode in einer Testmethode verwenden, um den Typ der Ausnahme anzugeben, die ausgelöst werden soll. 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, 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. 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 bei einem Testfehler 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 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)); } } } }
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 Namespace
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).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 in einer UTF8-codierten Datei speichern, kann Visual Studio ihn als ASCII-Datei speichern. Wenn dies geschieht, decodiert die Laufzeit die UTF8-Zeichen außerhalb des ASCII-Bereichs nicht ordnungsgemäß, und die Testergebnisse sind nicht richtig.
Wählen Sie auf der Menüleiste Testen>Alle Tests ausführen aus. Wenn das Fenster Test-Explorer nicht geöffnet ist, öffnen Sie es, indem Sie Testen>Test-Explorer auswählen. Die drei Tests sind im Abschnitt Bestandene Tests aufgelistet, und im Abschnitt Zusammenfassung wird das Ergebnis des Testlaufs berichtet.
Behandeln von 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. Fügen Sie einen ungültigen Wert zur Testeingabe hinzu, um zu überprüfen, ob beim Test auch wirklich erwartungsgemäß ein Fehler auftritt.
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, dass zwei Tests erfolgreich ausgeführt wurden und einer nicht erfolgreich war.
Wählen Sie den fehlgeschlagenen Test (
TestDoesNotStartWith
) aus.Im Fenster Test-Explorer wird die Assert-Meldung angezeigt: „Fehler bei Assert.IsFalse. 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 Schritt 1 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.
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 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. Sie kann mit einer Konsolen-App gebündelt werden, die sie verwendet. Informationen zum Veröffentlichen einer Konsolen-App finden Sie in einem früheren Tutorial dieser Reihe:
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.
Ein Komponententestprojekt erstellen
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 Projektmappe ein neues Komponententestprojekt mit dem Namen „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. Wählen Sie anschließend Weiter aus.
Wählen Sie auf der Seite Zusätzliche Informationen im Feld Framework die Option .NET 6 (langfristige Unterstützung) aus. Wählen Sie dann Erstellen aus.
Visual Studio erstellt das Projekt und öffnet die Klassendatei mit dem folgenden Code im Codefenster. Wenn die gewünschte Sprache nicht angezeigt wird, ändern Sie die Sprachauswahl am oberen Rand der Seite.
using Microsoft.VisualStudio.TestTools.UnitTesting; 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 Namespace
Der von der Vorlage für Komponententests erstellte Quellcode führt Folgendes aus:
- Er importiert den Namespace Microsoft.VisualStudio.TestTools.UnitTesting, der für Komponententests verwendeten Typen enthält.
- Er wendet das Attribut TestClassAttribute auf die Klasse
UnitTest1
an. - Er wendet das TestMethodAttribute-Attribut an, um
TestMethod1
in C# oderTestSub
in Visual Basic zu definieren.
Jede mit [TestMethod] gekennzeichnete Methode in einer mit [TestClass] gekennzeichneten Testklasse wird automatisch ausgeführt, wenn der Komponententest ausgeführt wird.
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. Das Hinzufügen eines Verweises auf die
StringLibrary
-Assembly ermöglicht dem Compiler, StringLibrary-Methoden zu finden, wenn das StringLibraryTest-Projekt kompiliert wird.Klicken Sie auf OK.
Hinzufügen und Ausführen von Komponententestmethoden
Wenn Visual Studio einen Komponententest ausführt, wird jede Methode, die mit dem Attribut TestMethodAttribute gekennzeichnet ist, in einer Klasse ausgeführt, die mit dem Attribut TestClassAttribute 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-Methode in einer Testmethode verwenden, um den Typ der Ausnahme anzugeben, die ausgelöst werden soll. 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, 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. 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 bei einem Testfehler 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 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)); } } } }
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 Namespace
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).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 in einer UTF8-codierten Datei speichern, kann Visual Studio ihn als ASCII-Datei speichern. Wenn dies geschieht, decodiert die Laufzeit die UTF8-Zeichen außerhalb des ASCII-Bereichs nicht ordnungsgemäß, und die Testergebnisse sind nicht richtig.
Wählen Sie auf der Menüleiste Testen>Alle Tests ausführen aus. Wenn das Fenster Test-Explorer nicht geöffnet ist, öffnen Sie es, indem Sie Testen>Test-Explorer auswählen. Die drei Tests sind im Abschnitt Bestandene Tests aufgelistet, und im Abschnitt Zusammenfassung wird das Ergebnis des Testlaufs berichtet.
Behandeln von 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. Fügen Sie einen ungültigen Wert zur Testeingabe hinzu, um zu überprüfen, ob beim Test auch wirklich erwartungsgemäß ein Fehler auftritt.
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, dass zwei Tests erfolgreich ausgeführt wurden und einer nicht erfolgreich war.
Wählen Sie den fehlgeschlagenen Test (
TestDoesNotStartWith
) aus.Im Fenster Test-Explorer wird die Assert-Meldung angezeigt: „Fehler bei Assert.IsFalse. 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 Schritt 1 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.
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 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. Sie kann mit einer Konsolen-App gebündelt werden, die sie verwendet. Informationen zum Veröffentlichen einer Konsolen-App finden Sie in einem früheren Tutorial dieser Reihe: