Testen einer .NET-Klassenbibliothek mit Visual Studio

Wichtig

Microsoft hat die Einstellung von Visual Studio für Mac angekündigt. Visual Studio für Mac wird ab dem 31. August 2024 nicht mehr unterstützt. Zu den Alternativen gehören:

  • Visual Studio Code mit dem C# Dev-Kit und verwandten Erweiterungen, z. B. .NET MAUI und Unity.
  • Visual Studio läuft unter Windows in einer VM auf einem Mac.
  • Visual Studio läuft unter Windows in einer VM in der Cloud.

Weitere Informationen finden Sie in der Einstellungsankündigung von Visual Studio für Mac.

In diesem Tutorial wird gezeigt, wie Sie Komponententests automatisieren, indem Sie einer Projektmappe ein Testprojekt hinzufügen.

Voraussetzungen

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.

  1. Starten Sie Visual Studio für Mac.

  2. Öffnen Sie die ClassLibraryProjects-Projektmappe, die Sie in Tutorial: Erstellen einer .NET-Standard-Bibliothek in Visual Studio für Mac erstellt haben.

  3. Klicken Sie im Pad Projektmappe bei gedrückter CTRL-TASTE auf die Projektmappe ClassLibraryProjects, und wählen Sie Hinzufügen>Neues Projekt aus.

  4. Wählen Sie im Dialogfeld Neues Projekt unter dem Knoten Web und Konsole die Option Tests aus. Wählen Sie das ProjektMSTest-Projekt und dann Weiter aus.

    Visual Studio Mac New Project dialog creating test project

  5. Wählen Sie .NET 5.0 als Zielframework und anschließend Weiter aus.

  6. Nennen Sie das neue Projekt „StringLibraryTest“, und wählen Sie Erstellen aus.

    Visual Studio Mac New Project dialog providing project name

    Visual Studio erstellt eine Klassendatei mit folgendem Code:

    using Microsoft.VisualStudio.TestTools.UnitTesting;
    
    namespace StringLibraryTest
    {
        [TestClass]
        public class UnitTest1
        {
            [TestMethod]
            public void TestMethod1()
            {
            }
        }
    }
    

    Der von der Vorlage für Komponententests erstellte Quellcode führt Folgendes aus:

    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 einen Verweis auf das Projekt StringLibrary hinzu.

  1. Klicken Sie im Pad Projektmappe bei gedrückter CTRL-TASTE unter StringLibraryTest auf Abhängigkeiten. Wählen Sie im Kontextmenü Verweis hinzufügen aus.

  2. Wählen Sie im Dialogfeld Verweise das Projekt StringLibrary aus. Klicken Sie auf OK.

    Visual Studio Mac Edit References dialog

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:

  1. Öffnen Sie die Datei UnitTest1.cs, und ersetzen Sie den Code 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));
                }
            }
        }
    }
    

    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 der TestDoesNotStartWithUpper-Methode enthält den griechischen Kleinbuchstaben alpha (U+03B1) und den kyrillischen Kleinbuchstaben ghe (U+0433).

  2. Wählen Sie auf der Menüleiste Datei>Speichern unter aus. Stellen Sie im Dialogfeld sicher, dass Codierung auf Unicode (UTF-8) festgelegt ist.

    Visual Studio Save File As dialog

  3. Wenn Sie gefragt werden, ob Sie die vorhandene Datei ersetzen möchten, wählen Sie Ersetzen aus.

    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.

  4. Öffnen Sie das Panel Komponententests auf der rechten Seite des Bildschirms. Wählen Sie Ansicht>Tests aus dem Menü aus.

  5. Klicken Sie auf das Andocksymbol, um das Panel geöffnet zu lassen.

    Visual Studio for Mac Unit Tests panel dock icon

  6. Klicken Sie auf die Schaltfläche Alle ausführen.

    Alle Tests erfolgreich.

    Visual Studio for Mac expected test passes

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.

  1. Verändern Sie das words-Array in der TestDoesNotStartWithUpper-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", ".", ";", " " };
    
  2. Führen Sie die Tests erneut aus.

    Das Fenster Test-Explorer zeigt nun an, dass zwei Tests erfolgreich waren und einer nicht.

    Test Explorer window with failing tests

  3. Klicken Sie bei gedrückter CTRL-TASTE auf den fehlgeschlagenen Test, TestDoesNotStartWithUpper. Wählen Sie im Kontextmenü Ergebnisbereich anzeigen aus.

    Im Pad Ergebnisse wird die Meldung angezeigt, die von Assert generiert wurde: „Fehler bei Assert.IsFalse. Für 'Error' erwartet: False; tatsächlich: True“. Wegen des Fehlers wurden keine auf „Error“ folgenden Zeichenfolgen im Array getestet.

    Test Explorer window showing the IsFalse assertion failure

  4. 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:

  1. Ändern Sie in der Symbolleiste von Visual Studio die Buildkonfiguration von Debuggen zu Freigabe.

    Visual Studio toolbar with release build highlighted

  2. Klicken Sie im Pad Projektmappe bei gedrückter CTRL-TASTE auf das Projekt StringLibrary, und wählen Sie im Kontextmenü Build aus, um die Bibliothek erneut zu kompilieren.

    StringLibrary context menu with build command

  3. Führen Sie die Komponententests erneut aus.

    Die Tests sind erfolgreich.

Debuggen von Tests

Wenn Sie Visual Studio für Mac als IDE verwenden, können Sie den gleichen Prozess wie im Tutorial: Debuggen einer .NET-Konsolenanwendung mit Visual Studio für Mac beschrieben zum Debuggen von Code mithilfe Ihres Komponententestprojekts verwenden. Anstatt das App-Projekt ShowCase zu starten, klicken Sie bei gedrückter STRG-TASTE auf das Projekt StringLibraryTests. Wählen Sie dann im Kontextmenü die Option Debuggen des Projekts starten aus.

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: