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

Ein Komponententestprojekt erstellen

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.

  1. Starten Sie Visual Studio Code.

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

  3. Erstellen Sie ein Komponententestprojekt namens „StringLibraryTest“.

    dotnet new mstest -o StringLibraryTest
    

    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:

    Jede mit [TestMethod] gekennzeichnete Methode in einer mit [TestClass] gekennzeichneten Testklasse wird automatisch ausgeführt, wenn der Komponententest aufgerufen wird.

  4. Fügen Sie das Testprojekt zur Projektmappe hinzu.

    dotnet sln add StringLibraryTest/StringLibraryTest.csproj
    

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.

  1. Führen Sie den folgenden Befehl aus:

    dotnet add StringLibraryTest/StringLibraryTest.csproj reference StringLibrary/StringLibrary.csproj
    

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

  2. Speichern Sie die Änderungen.

  3. Führen Sie die Tests aus:

    dotnet test StringLibraryTest/StringLibraryTest.csproj
    

    Die Terminalausgabe gibt an, dass alle Tests bestanden wurden.

    Starting test execution, please wait...
    A total of 1 test files matched the specified pattern.
    
    Passed!  - Failed:     0, Passed:     3, Skipped:     0, Total:     3, Duration: 3 ms - StringLibraryTest.dll (net8.0)
    

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.

    string[] words = { "alphabet", "Error", "zebra", "abc", "αυτοκινητοβιομηχανία", "государство",
                       "1234", ".", ";", " " };
    
  2. Führen Sie die Tests aus:

    dotnet test StringLibraryTest/StringLibraryTest.csproj
    

    Die Terminalausgabe zeigt, dass bei einem Test ein Fehler auftritt, und gibt eine Fehlermeldung für diesen Test an: „Fehler bei Assert.IsFalse. Für 'Error' erwartet: False; tatsächlich: True“. Wegen des Fehlers wurden keine auf „Error“ folgenden Zeichenfolgen im Array getestet.

    Starting test execution, please wait...
    A total of 1 test files matched the specified pattern.
      Failed TestDoesNotStartWithUpper [28 ms]
      Error Message:
       Assert.IsFalse failed. Expected for 'Error': false; Actual: True
      Stack Trace:
         at StringLibraryTest.UnitTest1.TestDoesNotStartWithUpper() in C:\ClassLibraryProjects\StringLibraryTest\UnitTest1.cs:line 33
    
    Failed!  - Failed:     1, Passed:     2, Skipped:     0, Total:     3, Duration: 31 ms - StringLibraryTest.dll (net5.0)
    
  3. 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.

  1. 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. Anstatt das App-Projekt ShowCase zu starten, öffnen Sie StringLibraryTest/UnitTest1.cs, und wählen Sie Alle Tests debuggen zwischen den Zeilen 7 und 8 aus. Wenn Sie den Test nicht finden können, drücken Sie STRG+UMSCHALT+P, um die Befehlspalette zu öffnen, und geben Sie Fenster erneut Laden ein.

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

Das Visual Studio Code-Erweiterung C#-Entwicklerkit bietet weitere Tools für die Entwicklung von C#-Apps und -Bibliotheken:

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

  1. Starten Sie Visual Studio Code.

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

  3. Erstellen Sie ein Komponententestprojekt namens „StringLibraryTest“.

    dotnet new mstest -o StringLibraryTest
    

    Die Projektvorlage erstellt die Datei „UnitTest1.cs“, die den folgenden Code enthält:

    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 aufgerufen wird.

  4. Fügen Sie das Testprojekt zur Projektmappe hinzu.

    dotnet sln add StringLibraryTest/StringLibraryTest.csproj
    

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.

  1. Führen Sie den folgenden Befehl aus:

    dotnet add StringLibraryTest/StringLibraryTest.csproj reference StringLibrary/StringLibrary.csproj
    

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

  2. Speichern Sie die Änderungen.

  3. Führen Sie die Tests aus:

    dotnet test StringLibraryTest/StringLibraryTest.csproj
    

    Die Terminalausgabe gibt an, dass alle Tests bestanden wurden.

    Starting test execution, please wait...
    A total of 1 test files matched the specified pattern.
    
    Passed!  - Failed:     0, Passed:     3, Skipped:     0, Total:     3, Duration: 3 ms - StringLibraryTest.dll (net7.0)
    

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.

    string[] words = { "alphabet", "Error", "zebra", "abc", "αυτοκινητοβιομηχανία", "государство",
                       "1234", ".", ";", " " };
    
  2. Führen Sie die Tests aus:

    dotnet test StringLibraryTest/StringLibraryTest.csproj
    

    Die Terminalausgabe zeigt, dass bei einem Test ein Fehler auftritt, und gibt eine Fehlermeldung für diesen Test an: „Fehler bei Assert.IsFalse. Für 'Error' erwartet: False; tatsächlich: True“. Wegen des Fehlers wurden keine auf „Error“ folgenden Zeichenfolgen im Array getestet.

    Starting test execution, please wait...
    A total of 1 test files matched the specified pattern.
      Failed TestDoesNotStartWithUpper [28 ms]
      Error Message:
       Assert.IsFalse failed. Expected for 'Error': false; Actual: True
      Stack Trace:
         at StringLibraryTest.UnitTest1.TestDoesNotStartWithUpper() in C:\ClassLibraryProjects\StringLibraryTest\UnitTest1.cs:line 33
    
    Failed!  - Failed:     1, Passed:     2, Skipped:     0, Total:     3, Duration: 31 ms - StringLibraryTest.dll (net5.0)
    
  3. 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.

  1. 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. Anstatt das App-Projekt ShowCase zu starten, öffnen Sie StringLibraryTest/UnitTest1.cs, und wählen Sie Alle Tests debuggen zwischen den Zeilen 7 und 8 aus. Wenn Sie den Test nicht finden können, drücken Sie STRG+UMSCHALT+P, um die Befehlspalette zu öffnen, und geben Sie Fenster erneut Laden ein.

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

Ein Komponententestprojekt erstellen

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.

  1. Starten Sie Visual Studio Code.

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

  3. Erstellen Sie ein Komponententestprojekt namens „StringLibraryTest“.

    dotnet new mstest -f net6.0 -o StringLibraryTest
    

    Der -f net6.0-Befehl ändert das Standardzielframework in net6.0-Version.

    Der Befehl -o oder --output gibt den Speicherort für die generierte Ausgabe an.

    Die Projektvorlage erstellt die Datei „UnitTest1.cs“, die den folgenden Code enthält:

    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 aufgerufen wird.

  4. Fügen Sie das Testprojekt zur Projektmappe hinzu.

    dotnet sln add StringLibraryTest/StringLibraryTest.csproj
    

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.

  1. Führen Sie den folgenden Befehl aus:

    dotnet add StringLibraryTest/StringLibraryTest.csproj reference StringLibrary/StringLibrary.csproj
    

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

  2. Speichern Sie die Änderungen.

  3. Führen Sie die Tests aus:

    dotnet test StringLibraryTest/StringLibraryTest.csproj
    

    Die Terminalausgabe gibt an, dass alle Tests bestanden wurden.

    Starting test execution, please wait...
    A total of 1 test files matched the specified pattern.
    
    Passed!  - Failed:     0, Passed:     3, Skipped:     0, Total:     3, Duration: 3 ms - StringLibraryTest.dll (net6.0)
    

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.

    string[] words = { "alphabet", "Error", "zebra", "abc", "αυτοκινητοβιομηχανία", "государство",
                       "1234", ".", ";", " " };
    
  2. Führen Sie die Tests aus:

    dotnet test StringLibraryTest/StringLibraryTest.csproj
    

    Die Terminalausgabe zeigt, dass bei einem Test ein Fehler auftritt, und gibt eine Fehlermeldung für diesen Test an: „Fehler bei Assert.IsFalse. Für 'Error' erwartet: False; tatsächlich: True“. Wegen des Fehlers wurden keine auf „Error“ folgenden Zeichenfolgen im Array getestet.

    Starting test execution, please wait...
    A total of 1 test files matched the specified pattern.
      Failed TestDoesNotStartWithUpper [28 ms]
      Error Message:
       Assert.IsFalse failed. Expected for 'Error': false; Actual: True
      Stack Trace:
         at StringLibraryTest.UnitTest1.TestDoesNotStartWithUpper() in C:\ClassLibraryProjects\StringLibraryTest\UnitTest1.cs:line 33
    
    Failed!  - Failed:     1, Passed:     2, Skipped:     0, Total:     3, Duration: 31 ms - StringLibraryTest.dll (net5.0)
    
  3. 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.

  1. 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. Anstatt das App-Projekt ShowCase zu starten, öffnen Sie StringLibraryTest/UnitTest1.cs, und wählen Sie Alle Tests debuggen zwischen den Zeilen 7 und 8 aus. Wenn Sie den Test nicht finden können, drücken Sie STRG+UMSCHALT+P, um die Befehlspalette zu öffnen, und geben Sie Fenster erneut Laden ein.

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