Erste Schritte mit Live Unit Testing
Wenn Sie Live Unit Testing in einer Visual Studio-Lösung aktivieren, wird die Testabdeckung und der Status Ihrer Tests visuell dargestellt. Live Unit Testing führt tests auch dynamisch aus, wenn Sie Ihren Code ändern, und benachrichtigt Sie sofort, wenn Ihre Änderungen zu Testfehlern führen.
Live Unit Testing kann verwendet werden, um Lösungen zu testen, die auf .NET Framework, .NET Core oder .NET 5+ abzielen. In diesem Lernprogramm lernen Sie, Live Unit Testing zu verwenden, indem Sie eine einfache Klassenbibliothek erstellen, die auf .NET ausgerichtet ist, und Sie erstellen ein MSTest-Projekt, das .NET zum Testen verwendet.
Die vollständige C#-Lösung kann aus dem MicrosoftDocs/visualstudio-docs Repo auf GitHub heruntergeladen werden.
Voraussetzungen
Dieses Lernprogramm erfordert, dass Sie Visual Studio Enterprise Edition mit der .NET-Desktopentwicklung Workload installiert haben.
Erstellen Sie die Lösung und das Klassenbibliotheksprojekt
Erstellen Sie zunächst eine Visual Studio-Projektmappe mit dem Namen UtilityLibraries, die aus einem einzelnen .NET-Klassenbibliotheksprojekt besteht, StringLibrary.
Die Lösung ist nur ein Container für ein oder mehrere Projekte. Um eine leere Lösung zu erstellen, öffnen Sie Visual Studio, und gehen Sie wie folgt vor:
Klicken Sie in der Menüleiste von Visual Studio auf Datei>Neu>Projekt.
Geben Sie Lösung in das Suchfeld der Vorlage ein, und wählen Sie dann die Vorlage Leere Lösung aus. Benennen Sie das Projekt UtilityLibraries.
Beenden Sie die Erstellung der Lösung.
Nachdem Sie die Lösung erstellt haben, erstellen Sie eine Klassenbibliothek mit dem Namen StringLibrary, die eine Reihe von Erweiterungsmethoden zum Arbeiten mit Zeichenfolgen enthält.
Klicken Sie im Projektmappen-Explorermit der rechten Maustaste auf die UtilityLibraries-Projektmappe, und wählen Sie Hinzufügen>Neues Projektaus.
Geben Sie Klassenbibliothek in das Suchfeld der Vorlage ein, und wählen Sie die Klassenbibliothek Vorlage aus, die auf .NET oder .NET Standard ausgerichtet ist. Klicken Sie auf Weiter.
Nennen Sie das Projekt StringLibrary.
Klicken Sie auf Erstellen, um das Projekt zu erstellen.
Ersetzen Sie den gesamten vorhandenen Code im Code-Editor durch den folgenden Code:
using System; namespace UtilityLibraries { public static class StringLibrary { public static bool StartsWithUpper(this string s) { if (String.IsNullOrWhiteSpace(s)) return false; return Char.IsUpper(s[0]); } public static bool StartsWithLower(this string s) { if (String.IsNullOrWhiteSpace(s)) return false; return Char.IsLower(s[0]); } public static bool HasEmbeddedSpaces(this string s) { foreach (var ch in s.Trim()) { if (ch == ' ') return true; } return false; } } }
StringLibrary verfügt über drei statische Methoden:
StartsWithUpper
gibttrue
zurück, wenn eine Zeichenfolge mit einem Großbuchstaben beginnt; andernfalls wirdfalse
zurückgegeben.StartsWithLower
gibttrue
zurück, wenn eine Zeichenfolge mit einem Kleinbuchstaben beginnt; andernfalls wirdfalse
zurückgegeben.HasEmbeddedSpaces
gibttrue
zurück, wenn eine Zeichenfolge ein eingebettetes Leerzeichen enthält; andernfalls wirdfalse
zurückgegeben.
Klicken Sie im Hauptebenenmenü von Visual Studio auf Erstellen>Projektmappe. Das Erstellen sollte nun erfolgreich abgeschlossen werden.
Erstellen des Testprojekts
Der nächste Schritt besteht darin, das Komponententestprojekt zum Testen der StringLibrary-Bibliothek zu erstellen. Erstellen Sie die Komponententests, indem Sie die folgenden Schritte ausführen:
Klicken Sie im Projektmappen-Explorermit der rechten Maustaste auf die UtilityLibraries-Projektmappe, und wählen Sie Hinzufügen>Neues Projektaus.
Geben Sie Komponententest in das Suchfeld der Vorlage ein, wählen Sie C#- als Sprache aus, und wählen Sie dann die MSTest Unit Test Project für .NET-Vorlage aus. Klicken Sie auf Weiter.
Anmerkung
In Visual Studio 2019, Version 16.9, ist der Name der MSTest-Projektvorlage Unit Test Project.
Nennen Sie das Projekt StringLibraryTests, und klicken Sie auf Weiter.
Wählen Sie entweder das empfohlene Zielframework oder .NET 8 aus, und wählen Sie dann Createaus.
Anmerkung
Dieses Lernprogramm für die ersten Schritte verwendet Live Unit Testing mit dem MSTest-Testframework. Sie können auch die xUnit- und NUnit-Testframeworks verwenden.
Das Komponententestprojekt kann nicht automatisch auf die Klassenbibliothek zugreifen, die getestet wird. Sie gewähren der Testbibliothek Zugriff, indem Sie einen Verweis auf das Klassenbibliotheksprojekt hinzufügen. Klicken Sie hierzu mit der rechten Maustaste auf das
StringLibraryTests
Projekt, und wählen Sie >Projektreferenz hinzufügenaus. Stellen Sie im Dialogfeld Referenz-Manager sicher, dass die Registerkarte Lösung ausgewählt ist, und wählen Sie das StringLibrary-Projekt aus, wie in der folgenden Abbildung dargestellt.Ersetzen Sie den in der Vorlage angegebenen Codebaustein für den Komponententest durch den folgenden Code:
using System; 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, $"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 ? "<null>" : word)}': " + $"false; Actual: {result}"); } } } }
Speichern Sie Ihr Projekt, indem Sie auf der Symbolleiste das Symbol Speichern auswählen.
Da der Komponententestcode einige Nicht-ASCII-Zeichen enthält, wird das folgende Dialogfeld angezeigt, um zu warnen, dass einige Zeichen verloren gehen, wenn Sie die Datei im Standard-ASCII-Format speichern.
Klicken Sie auf die Schaltfläche Mit anderer Codierung speichern.
Wählen Sie in der Dropdownliste Codierung des Dialogfelds Erweiterte Speicheroptionen die Option Unicode (UTF-8 ohne Signatur) - Codepage 65001aus, wie in der folgenden Abbildung gezeigt.
Kompilieren Sie das Komponententestprojekt, indem Sie im Hauptebenenmenü von Visual Studio auf Erstellen>Projektmappe neu erstellen klicken.
Sie haben eine Klassenbibliothek sowie einige Komponententests dafür erstellt. Sie haben jetzt die Vorbereitungen abgeschlossen, die für die Verwendung von Live Unit Testing erforderlich sind.
Aktivieren von Live-Komponententests
Bisher haben Sie die Tests für die StringLibrary-Klassenbibliothek zwar geschrieben, aber Sie haben sie nicht ausgeführt. Live Unit Testing führt sie automatisch aus, sobald Sie sie aktiviert haben. Gehen Sie dazu wie folgt vor:
Wählen Sie optional das Code-Editor-Fenster aus, das den Code für StringLibrary enthält. Dies ist entweder Class1.cs für ein C#-Projekt oder Class1.vb für ein Visual Basic-Projekt. (Mit diesem Schritt können Sie das Ergebnis Ihrer Tests und den Umfang der Codeabdeckung visuell überprüfen, sobald Sie Live Unit Testing aktiviert haben.)
Wählen Sie Test>Live Unit Testing>Start aus dem Visual Studio-Menü der obersten Ebene aus.
Überprüfen Sie die Konfiguration für Live-Komponententests, indem Sie sicherstellen, dass der Repositorystamm den Pfad zu den Quelldateien sowohl für das Hilfsprojekt als auch für das Testprojekt enthält. Wählen Sie Weiter und dann Fertig stellen aus.
Wählen Sie im Fenster „Live Unit Testing“ den Link Alle Tests einschließen aus. Wählen Sie alternativ das Symbol für die Wiedergabeliste und dann StringLibraryTest aus. Dadurch werden alle Tests unterhalb ausgewählt. Heben Sie nun die Auswahl der Schaltfläche Playlist auf, um den Bearbeitungsmodus zu beenden.
Visual Studio erstellt das Projekt neu und startet den Live Unit Test, der automatisch alle Ihre Tests ausführt.
- Visual Studio erstellt das Projekt neu und startet den Live Unit Test, der automatisch alle Ihre Tests ausführt.
Wenn die Ausführung der Tests abgeschlossen ist, zeigt Live Unit Testing sowohl die Gesamtergebnisse als auch das Ergebnis einzelner Tests an. Darüber hinaus zeigt das Code-Editor-Fenster sowohl die Testcodeabdeckung als auch das Ergebnis für Ihre Tests grafisch an. Wie die folgende Abbildung zeigt, wurden alle drei Tests erfolgreich ausgeführt. Es wird auch gezeigt, dass unsere Tests alle Codepfade in der StartsWithUpper
-Methode abgedeckt haben und alle diese Tests erfolgreich ausgeführt wurden (was durch das grüne Häkchen "✓" angezeigt wird). Schließlich zeigt es, dass keine der anderen Methoden in StringLibrary Codeabdeckung hat (die durch eine blaue Linie "➖" angegeben wird).
Sie können auch detailliertere Informationen zu Testabdeckung und Testergebnissen erhalten, indem Sie im Code-Editor-Fenster ein bestimmtes Codeabdeckungssymbol auswählen. Gehen Sie wie folgt vor, um dieses Detail zu untersuchen:
Klicken Sie auf das grüne Häkchen in der Zeile, die in der
StartsWithUpper
-Methodeif (String.IsNullOrWhiteSpace(s))
liest. Wie die folgende Abbildung zeigt, gibt Live Unit Testing an, dass drei Tests diese Codezeile abdecken und dass alle erfolgreich ausgeführt wurden.Klicken Sie auf das grüne Häkchen in der Zeile, die in der
StartsWithUpper
-Methodereturn Char.IsUpper(s[0])
liest. Wie die folgende Abbildung zeigt, gibt Live Unit Testing an, dass nur zwei Tests diese Codezeile abdecken und dass alle erfolgreich ausgeführt wurden.
Das Hauptproblem, das Live Unit Testing identifiziert, ist eine unvollständige Codeabdeckung. Sie werden es im nächsten Abschnitt adressieren.
Erweitern der Testabdeckung
In diesem Abschnitt erweitern Sie die Einheitstests auf die StartsWithLower
-Methode. Während Sie dies tun, testet Live Unit Testing ihren Code dynamisch weiter.
Gehen Sie wie folgt vor, um die Codeabdeckung auf die StartsWithLower
-Methode zu erweitern:
Fügen Sie der Testquellcodedatei Ihres Projekts die folgenden
TestStartsWithLower
undTestDoesNotStartWithLower
Methoden hinzu:// Code to add to UnitTest1.cs [TestMethod] public void TestStartsWithLower() { // Tests that we expect to return true. string[] words = { "alphabet", "zebra", "abc", "αυτοκινητοβιομηχανία", "государство" }; foreach (var word in words) { bool result = word.StartsWithLower(); Assert.IsTrue(result, $"Expected for '{word}': true; Actual: {result}"); } } [TestMethod] public void TestDoesNotStartWithLower() { // Tests that we expect to return false. string[] words = { "Alphabet", "Zebra", "ABC", "Αθήνα", "Москва", "1234", ".", ";", " "}; foreach (var word in words) { bool result = word.StartsWithLower(); Assert.IsFalse(result, $"Expected for '{word}': false; Actual: {result}"); } }
Ändern Sie die
DirectCallWithNullOrEmpty
-Methode, indem Sie den folgenden Code unmittelbar nach dem Aufruf derMicrosoft.VisualStudio.TestTools.UnitTesting.Assert.IsFalse
-Methode hinzufügen.// Code to add to UnitTest1.cs result = StringLibrary.StartsWithLower(word); Assert.IsFalse(result, $"Expected for '{(word == null ? "<null>" : word)}': " + $"false; Actual: {result}");
Live Unit Testing führt beim Ändern des Quellcodes automatisch neue und geänderte Tests aus. Wie die folgende Abbildung zeigt, sind alle Tests, einschließlich der beiden, die Sie hinzugefügt haben, und der von Ihnen geänderten Tests erfolgreich.
Wechseln Sie zu dem Fenster, das den Quellcode für die StringLibrary-Klasse enthält. Live Unit Testing zeigt jetzt, dass unsere Codeabdeckung auf die
StartsWithLower
-Methode erweitert wird.
In einigen Fällen sind erfolgreiche Tests im Test-Explorer möglicherweise abgeblendt. Das bedeutet, dass ein Test derzeit ausgeführt wird oder dass der Test nicht erneut ausgeführt wird, da es keine Codeänderungen gab, die sich auf den Test seit der letzten Ausführung auswirken würden.
Bisher sind alle unsere Tests erfolgreich. Im nächsten Abschnitt untersuchen wir, wie Sie Testfehler behandeln können.
Behandeln eines Testfehlers
In diesem Abschnitt erfahren Sie, wie Sie Live Unit Testing verwenden können, um Testfehler zu identifizieren, zu beheben und anzugehen. Dazu erweitern Sie die Testabdeckung auf die HasEmbeddedSpaces
-Methode.
Fügen Sie der Testdatei die folgende Methode hinzu:
[TestMethod] public void TestHasEmbeddedSpaces() { // Tests that we expect to return true. string[] phrases = { "one car", "Name\u0009Description", "Line1\nLine2", "Line3\u000ALine4", "Line5\u000BLine6", "Line7\u000CLine8", "Line0009\u000DLine10", "word1\u00A0word2" }; foreach (var phrase in phrases) { bool result = phrase.HasEmbeddedSpaces(); Assert.IsTrue(result, $"Expected for '{phrase}': true; Actual: {result}"); } }
Wenn der Test ausgeführt wird, gibt Live Unit Testing an, dass die
TestHasEmbeddedSpaces
-Methode fehlgeschlagen ist, wie die folgende Abbildung zeigt:Wählen Sie das Fenster aus, in dem der Bibliothekscode angezeigt wird. Live Unit Testing hat die Codeabdeckung auf die
HasEmbeddedSpaces
-Methode erweitert. Außerdem wird der Testfehler gemeldet, indem ein "🞩" in Rot zu Zeilen hinzugefügt wird, die fehlerhafte Tests abdecken.Zeigen Sie mit der Maus auf die Zeile mit der
HasEmbeddedSpaces
Methodensignatur. Wie in der folgenden Abbildung gezeigt, informiert Live Unit Testing in Form einer QuickInfo darüber, dass die Methode von einem Test abgedeckt wird:Wählen Sie den fehlgeschlagenen TestHasEmbeddedSpaces Test aus. Live Unit Testing bietet Ihnen einige Optionen, z. B. das Ausführen aller Tests und das Debuggen aller Tests, wie die folgende Abbildung zeigt:
Wählen Sie Debug All, um den fehlgeschlagenen Test zu beheben.
Visual Studio führt den Test im Debugmodus aus.
Der Test weist jede Zeichenfolge in einem Array einer Variablen namens
phrase
zu und übergibt sie an dieHasEmbeddedSpaces
-Methode. Die Ausführung des Programms hält an und ruft den Debugger auf, wenn der Assertionsausdruck zum ersten Malfalse
ist. Das Ausnahmedialogfeld, das aus dem unerwarteten Wert imMicrosoft.VisualStudio.TestTools.UnitTesting.Assert.IsTrue
Methodenaufruf resultiert, wird in der folgenden Abbildung gezeigt.Darüber hinaus stehen alle von Visual Studio bereitgestellten Debuggingtools zur Verfügung, um uns bei der Problembehandlung bei unserem fehlgeschlagenen Test zu unterstützen, wie in der folgenden Abbildung dargestellt:
Beachten Sie im Fenster Auto, dass der Wert der Variable
phrase
„Name\tDescription“ lautet und damit dem zweiten Element des Arrays entspricht. Die Testmethode erwartet, dassHasEmbeddedSpaces
true
zurückgibt, wenn diese Zeichenfolge übergeben wird; Stattdessen wirdfalse
zurückgegeben. Offenbar erkennt die Methode das Tabstoppzeichen „\t“ nicht als eingebettetes Leerzeichen.Wählen Sie Debug>Continueaus, drücken Sie F5, oder klicken Sie auf die Schaltfläche Weiter auf der Symbolleiste, um die Ausführung des Testprogramms fortzusetzen. Da eine unbehandelte Ausnahme aufgetreten ist, wird der Test beendet. Dies stellt genügend Informationen für eine vorläufige Untersuchung des Fehlers bereit. Entweder
TestHasEmbeddedSpaces
(die Testroutine) hat eine falsche Annahme gemacht, oderHasEmbeddedSpaces
erkennt nicht ordnungsgemäß alle eingebetteten Leerzeichen.Um das Problem zu diagnostizieren und zu beheben, beginnen Sie mit der
StringLibrary.HasEmbeddedSpaces
-Methode. Sehen Sie sich den Vergleich in derHasEmbeddedSpaces
-Methode an. Es betrachtet einen eingebetteten Raum als U+0020. Der Unicode-Standard enthält jedoch eine Reihe anderer Leerzeichen. Dies deutet darauf hin, dass der Bibliothekscode fälschlicherweise auf ein Leerzeichen getestet wurde.Ersetzen Sie den Gleichheitsvergleich durch einen Aufruf der System.Char.IsWhiteSpace-Methode:
if (Char.IsWhiteSpace(ch))
Live Unit Testing führt die fehlgeschlagene Testmethode automatisch erneut aus.
Live Unit Testing zeigt die aktualisierten Ergebnisse an, die auch im Code-Editor-Fenster angezeigt werden.