Zelfstudie: Een .NET-klassebibliotheek testen met Visual Studio Code

Deze zelfstudie laat zien hoe u eenheidstests automatiseert door een testproject toe te voegen aan een oplossing.

Vereisten

Een eenheidstestproject maken

Eenheidstests bieden geautomatiseerde softwaretests tijdens uw ontwikkeling en publicatie. Het testframework dat u in deze zelfstudie gebruikt, is MSTest. MSTest is een van de drie testframeworks waaruit u kunt kiezen. De andere zijn xUnit en nUnit.

  1. Start Visual Studio Code.

  2. Open de ClassLibraryProjects oplossing die u hebt gemaakt in Een .NET-klassebibliotheek maken met Visual Studio Code.

  3. Maak een eenheidstestproject met de naam StringLibraryTest.

    dotnet new mstest -o StringLibraryTest
    

    De projectsjabloon maakt een UnitTest1.cs-bestand met de volgende code:

    namespace StringLibraryTest;
    
    [TestClass]
    public class UnitTest1
    {
        [TestMethod]
        public void TestMethod1()
        {
        }
    }
    

    De broncode die door de eenheidstestsjabloon is gemaakt, doet het volgende:

    Elke methode die is getagd met [TestMethod] in een testklasse die is getagd met [TestClass] wordt automatisch uitgevoerd wanneer de eenheidstest wordt aangeroepen.

  4. Voeg het testproject toe aan de oplossing.

    dotnet sln add StringLibraryTest/StringLibraryTest.csproj
    

Een projectreferentie toevoegen

Voeg een verwijzing in het project toe aan het StringLibraryTest project om het testproject te laten werken met de StringLibraryStringLibrary klasse.

  1. Voer de volgende opdracht uit:

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

Testmethoden voor eenheden toevoegen en uitvoeren

Wanneer Visual Studio een eenheidstest aanroept, wordt elke methode uitgevoerd die is gemarkeerd met het TestMethodAttribute kenmerk in een klasse die is gemarkeerd met het TestClassAttribute kenmerk. Een testmethode eindigt wanneer de eerste fout wordt gevonden of wanneer alle tests in de methode zijn geslaagd.

De meest voorkomende tests roepen leden van de Assert klasse aan. Veel assertiemethoden bevatten ten minste twee parameters, waarvan een het verwachte testresultaat is en waarvan het werkelijke testresultaat is. Sommige van de meest gebruikte methoden van de Assert klasse worden weergegeven in de volgende tabel:

Assert-methoden Function
Assert.AreEqual Controleert of twee waarden of objecten gelijk zijn. De assert mislukt als de waarden of objecten niet gelijk zijn.
Assert.AreSame Controleert of twee objectvariabelen naar hetzelfde object verwijzen. De assert mislukt als de variabelen verwijzen naar verschillende objecten.
Assert.IsFalse Controleert of een voorwaarde is false. De assert mislukt als de voorwaarde is true.
Assert.IsNotNull Controleert of een object niet nullis. De assert mislukt als het object is null.

U kunt de Assert.ThrowsException methode ook gebruiken in een testmethode om aan te geven welk type uitzondering wordt verwacht te genereren. De test mislukt als de opgegeven uitzondering niet wordt gegenereerd.

Bij het testen van de StringLibrary.StartsWithUpper methode wilt u een aantal tekenreeksen opgeven die beginnen met een hoofdletter. U verwacht dat de methode in deze gevallen wordt geretourneerd true , zodat u de Assert.IsTrue methode kunt aanroepen. Op dezelfde manier wilt u een aantal tekenreeksen opgeven die beginnen met iets anders dan een hoofdletter. U verwacht dat de methode in deze gevallen wordt geretourneerd false , zodat u de Assert.IsFalse methode kunt aanroepen.

Omdat uw bibliotheekmethode tekenreeksen verwerkt, wilt u er ook voor zorgen dat er een lege tekenreeks (String.Empty) en een null tekenreeks wordt verwerkt. Een lege tekenreeks is een tekenreeks die geen tekens heeft en waarvan Length de tekenreeks 0 is. Een null tekenreeks is een tekenreeks die niet is geïnitialiseerd. U kunt rechtstreeks aanroepen StartsWithUpper als een statische methode en één String argument doorgeven. U kunt ook aanroepen StartsWithUpper als een extensiemethode voor een string variabele die is toegewezen aan null.

U definieert drie methoden, die elk een Assert methode aanroepen voor elk element in een tekenreeksmatrix. U roept een overbelasting van de methode aan waarmee u een foutbericht kunt opgeven dat moet worden weergegeven in het geval van een testfout. Het bericht identificeert de tekenreeks die de fout heeft veroorzaakt.

De testmethoden maken:

  1. Open StringLibraryTest/UnitTest1.cs en vervang alle code door de volgende 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));
            }
        }
    }
    

    De test van hoofdletters in de TestStartsWithUpper methode bevat de Griekse hoofdletter alfa (U+0391) en de Cyrillische hoofdletter EM (U+041C). De test van kleine letters in de TestDoesNotStartWithUpper methode bevat de Griekse kleine letter alfa (U+03B1) en de Cyrillische kleine letter Ghe (U+0433).

  2. Uw wijzigingen opslaan.

  3. Voer de tests uit:

    dotnet test StringLibraryTest/StringLibraryTest.csproj
    

    In de terminaluitvoer ziet u dat alle tests zijn geslaagd.

    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)
    

Testfouten afhandelen

Als u testgestuurde ontwikkeling (TDD) uitvoert, schrijft u eerst tests en mislukken ze de eerste keer dat u ze uitvoert. Vervolgens voegt u code toe aan de app waarmee de test slaagt. Voor deze zelfstudie hebt u de test gemaakt nadat u de app-code hebt geschreven die wordt gevalideerd, zodat u de test niet hebt gezien. Als u wilt controleren of een test mislukt wanneer u verwacht dat deze mislukt, voegt u een ongeldige waarde toe aan de testinvoer.

  1. Wijzig de words matrix in de TestDoesNotStartWithUpper methode om de tekenreeks 'Fout' op te nemen.

    string[] words = { "alphabet", "Error", "zebra", "abc", "αυτοκινητοβιομηχανία", "государство",
                       "1234", ".", ";", " " };
    
  2. Voer de tests uit:

    dotnet test StringLibraryTest/StringLibraryTest.csproj
    

    In de terminaluitvoer ziet u dat één test mislukt en wordt er een foutbericht weergegeven voor de mislukte test: 'Assert.IsFalse is mislukt. Verwacht voor 'Fout': onwaar; werkelijk: Waar". Vanwege de fout zijn er geen tekenreeksen in de matrix getest nadat 'Fout' is getest.

    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. Verwijder de tekenreeks 'Fout' die u in stap 1 hebt toegevoegd. Voer de test opnieuw uit en de tests zijn geslaagd.

De releaseversie van de bibliotheek testen

Nu alle tests zijn geslaagd bij het uitvoeren van de build voor foutopsporing van de bibliotheek, voert u de tests een extra tijd uit voor de release-build van de bibliotheek. Een aantal factoren, waaronder compileroptimalisaties, kan soms verschillend gedrag produceren tussen foutopsporing en release-builds.

  1. Voer de tests uit met de buildconfiguratie van de release:

    dotnet test StringLibraryTest/StringLibraryTest.csproj --configuration Release
    

    De tests slagen.

Foutopsporingstests

Als u Visual Studio Code als uw IDE gebruikt, kunt u hetzelfde proces gebruiken dat wordt weergegeven in Foutopsporing in een .NET-consoletoepassing met Visual Studio Code om fouten in code op te sporen met behulp van uw eenheidstestproject. Open StringLibraryTest/UnitTest1.cs in plaats van het project ShowCase-app te starten en selecteer Alle tests opsporen tussen regel 7 en 8. Als u het niet kunt vinden, drukt u op Ctrl+Shift+P om het opdrachtenpalet te openen en het venster Opnieuw laden in te voeren.

Visual Studio Code start het testproject met het bijgevoegde foutopsporingsprogramma. De uitvoering stopt op elk onderbrekingspunt dat u hebt toegevoegd aan het testproject of de onderliggende bibliotheekcode.

Aanvullende bronnen

Volgende stappen

In deze zelfstudie hebt u een klassebibliotheek getest. U kunt de bibliotheek beschikbaar maken voor anderen door deze als pakket te publiceren naar NuGet . Volg een NuGet-zelfstudie voor meer informatie:

Als u een bibliotheek publiceert als een NuGet-pakket, kunnen anderen deze installeren en gebruiken. Volg een NuGet-zelfstudie voor meer informatie:

Een bibliotheek hoeft niet als pakket te worden gedistribueerd. Het kan worden gebundeld met een console-app die deze gebruikt. Zie de eerdere zelfstudie in deze reeks voor meer informatie over het publiceren van een console-app:

De Visual Studio Code-extensie C# Dev Kit biedt meer hulpprogramma's voor het ontwikkelen van C#-apps en -bibliotheken:

Deze zelfstudie laat zien hoe u eenheidstests automatiseert door een testproject toe te voegen aan een oplossing.

Vereisten

Een eenheidstestproject maken

Eenheidstests bieden geautomatiseerde softwaretests tijdens uw ontwikkeling en publicatie. Het testframework dat u in deze zelfstudie gebruikt, is MSTest. MSTest is een van de drie testframeworks waaruit u kunt kiezen. De andere zijn xUnit en nUnit.

  1. Start Visual Studio Code.

  2. Open de ClassLibraryProjects oplossing die u hebt gemaakt in Een .NET-klassebibliotheek maken met Visual Studio Code.

  3. Maak een eenheidstestproject met de naam StringLibraryTest.

    dotnet new mstest -o StringLibraryTest
    

    De projectsjabloon maakt een UnitTest1.cs-bestand met de volgende code:

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

    De broncode die door de eenheidstestsjabloon is gemaakt, doet het volgende:

    Elke methode die is getagd met [TestMethod] in een testklasse die is getagd met [TestClass] wordt automatisch uitgevoerd wanneer de eenheidstest wordt aangeroepen.

  4. Voeg het testproject toe aan de oplossing.

    dotnet sln add StringLibraryTest/StringLibraryTest.csproj
    

Een projectreferentie toevoegen

Voeg een verwijzing in het project toe aan het StringLibraryTest project om het testproject te laten werken met de StringLibraryStringLibrary klasse.

  1. Voer de volgende opdracht uit:

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

Testmethoden voor eenheden toevoegen en uitvoeren

Wanneer Visual Studio een eenheidstest aanroept, wordt elke methode uitgevoerd die is gemarkeerd met het TestMethodAttribute kenmerk in een klasse die is gemarkeerd met het TestClassAttribute kenmerk. Een testmethode eindigt wanneer de eerste fout wordt gevonden of wanneer alle tests in de methode zijn geslaagd.

De meest voorkomende tests roepen leden van de Assert klasse aan. Veel assertiemethoden bevatten ten minste twee parameters, waarvan een het verwachte testresultaat is en waarvan het werkelijke testresultaat is. Sommige van de meest gebruikte methoden van de Assert klasse worden weergegeven in de volgende tabel:

Assert-methoden Function
Assert.AreEqual Controleert of twee waarden of objecten gelijk zijn. De assert mislukt als de waarden of objecten niet gelijk zijn.
Assert.AreSame Controleert of twee objectvariabelen naar hetzelfde object verwijzen. De assert mislukt als de variabelen verwijzen naar verschillende objecten.
Assert.IsFalse Controleert of een voorwaarde is false. De assert mislukt als de voorwaarde is true.
Assert.IsNotNull Controleert of een object niet nullis. De assert mislukt als het object is null.

U kunt de Assert.ThrowsException methode ook gebruiken in een testmethode om aan te geven welk type uitzondering wordt verwacht te genereren. De test mislukt als de opgegeven uitzondering niet wordt gegenereerd.

Bij het testen van de StringLibrary.StartsWithUpper methode wilt u een aantal tekenreeksen opgeven die beginnen met een hoofdletter. U verwacht dat de methode in deze gevallen wordt geretourneerd true , zodat u de Assert.IsTrue methode kunt aanroepen. Op dezelfde manier wilt u een aantal tekenreeksen opgeven die beginnen met iets anders dan een hoofdletter. U verwacht dat de methode in deze gevallen wordt geretourneerd false , zodat u de Assert.IsFalse methode kunt aanroepen.

Omdat uw bibliotheekmethode tekenreeksen verwerkt, wilt u er ook voor zorgen dat er een lege tekenreeks (String.Empty) en een null tekenreeks wordt verwerkt. Een lege tekenreeks is een tekenreeks die geen tekens heeft en waarvan Length de tekenreeks 0 is. Een null tekenreeks is een tekenreeks die niet is geïnitialiseerd. U kunt rechtstreeks aanroepen StartsWithUpper als een statische methode en één String argument doorgeven. U kunt ook aanroepen StartsWithUpper als een extensiemethode voor een string variabele die is toegewezen aan null.

U definieert drie methoden, die elk een Assert methode aanroepen voor elk element in een tekenreeksmatrix. U roept een overbelasting van de methode aan waarmee u een foutbericht kunt opgeven dat moet worden weergegeven in het geval van een testfout. Het bericht identificeert de tekenreeks die de fout heeft veroorzaakt.

De testmethoden maken:

  1. Open StringLibraryTest/UnitTest1.cs en vervang alle code door de volgende 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));
            }
        }
    }
    

    De test van hoofdletters in de TestStartsWithUpper methode bevat de Griekse hoofdletter alfa (U+0391) en de Cyrillische hoofdletter EM (U+041C). De test van kleine letters in de TestDoesNotStartWithUpper methode bevat de Griekse kleine letter alfa (U+03B1) en de Cyrillische kleine letter Ghe (U+0433).

  2. Uw wijzigingen opslaan.

  3. Voer de tests uit:

    dotnet test StringLibraryTest/StringLibraryTest.csproj
    

    In de terminaluitvoer ziet u dat alle tests zijn geslaagd.

    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)
    

Testfouten afhandelen

Als u testgestuurde ontwikkeling (TDD) uitvoert, schrijft u eerst tests en mislukken ze de eerste keer dat u ze uitvoert. Vervolgens voegt u code toe aan de app waarmee de test slaagt. Voor deze zelfstudie hebt u de test gemaakt nadat u de app-code hebt geschreven die wordt gevalideerd, zodat u de test niet hebt gezien. Als u wilt controleren of een test mislukt wanneer u verwacht dat deze mislukt, voegt u een ongeldige waarde toe aan de testinvoer.

  1. Wijzig de words matrix in de TestDoesNotStartWithUpper methode om de tekenreeks 'Fout' op te nemen.

    string[] words = { "alphabet", "Error", "zebra", "abc", "αυτοκινητοβιομηχανία", "государство",
                       "1234", ".", ";", " " };
    
  2. Voer de tests uit:

    dotnet test StringLibraryTest/StringLibraryTest.csproj
    

    In de terminaluitvoer ziet u dat één test mislukt en wordt er een foutbericht weergegeven voor de mislukte test: 'Assert.IsFalse is mislukt. Verwacht voor 'Fout': onwaar; werkelijk: Waar". Vanwege de fout zijn er geen tekenreeksen in de matrix getest nadat 'Fout' is getest.

    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. Verwijder de tekenreeks 'Fout' die u in stap 1 hebt toegevoegd. Voer de test opnieuw uit en de tests zijn geslaagd.

De releaseversie van de bibliotheek testen

Nu alle tests zijn geslaagd bij het uitvoeren van de build voor foutopsporing van de bibliotheek, voert u de tests een extra tijd uit voor de release-build van de bibliotheek. Een aantal factoren, waaronder compileroptimalisaties, kan soms verschillend gedrag produceren tussen foutopsporing en release-builds.

  1. Voer de tests uit met de buildconfiguratie van de release:

    dotnet test StringLibraryTest/StringLibraryTest.csproj --configuration Release
    

    De tests slagen.

Foutopsporingstests

Als u Visual Studio Code als uw IDE gebruikt, kunt u hetzelfde proces gebruiken dat wordt weergegeven in Foutopsporing in een .NET-consoletoepassing met Visual Studio Code om fouten in code op te sporen met behulp van uw eenheidstestproject. Open StringLibraryTest/UnitTest1.cs in plaats van het project ShowCase-app te starten en selecteer Alle tests opsporen tussen regel 7 en 8. Als u het niet kunt vinden, drukt u op Ctrl+Shift+P om het opdrachtenpalet te openen en het venster Opnieuw laden in te voeren.

Visual Studio Code start het testproject met het bijgevoegde foutopsporingsprogramma. De uitvoering stopt op elk onderbrekingspunt dat u hebt toegevoegd aan het testproject of de onderliggende bibliotheekcode.

Aanvullende bronnen

Volgende stappen

In deze zelfstudie hebt u een klassebibliotheek getest. U kunt de bibliotheek beschikbaar maken voor anderen door deze als pakket te publiceren naar NuGet . Volg een NuGet-zelfstudie voor meer informatie:

Als u een bibliotheek publiceert als een NuGet-pakket, kunnen anderen deze installeren en gebruiken. Volg een NuGet-zelfstudie voor meer informatie:

Een bibliotheek hoeft niet als pakket te worden gedistribueerd. Het kan worden gebundeld met een console-app die deze gebruikt. Zie de eerdere zelfstudie in deze reeks voor meer informatie over het publiceren van een console-app:

Deze zelfstudie laat zien hoe u eenheidstests automatiseert door een testproject toe te voegen aan een oplossing.

Vereisten

Een eenheidstestproject maken

Eenheidstests bieden geautomatiseerde softwaretests tijdens uw ontwikkeling en publicatie. Het testframework dat u in deze zelfstudie gebruikt, is MSTest. MSTest is een van de drie testframeworks waaruit u kunt kiezen. De andere zijn xUnit en nUnit.

  1. Start Visual Studio Code.

  2. Open de ClassLibraryProjects oplossing die u hebt gemaakt in Een .NET-klassebibliotheek maken met Visual Studio Code.

  3. Maak een eenheidstestproject met de naam StringLibraryTest.

    dotnet new mstest -f net6.0 -o StringLibraryTest
    

    Met de -f net6.0 opdracht wordt het standaarddoelframework gewijzigd in net6.0 versie.

    De -o of --output opdracht geeft de locatie op waarop de gegenereerde uitvoer moet worden weergegeven.

    De projectsjabloon maakt een UnitTest1.cs-bestand met de volgende code:

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

    De broncode die door de eenheidstestsjabloon is gemaakt, doet het volgende:

    Elke methode die is getagd met [TestMethod] in een testklasse die is getagd met [TestClass] wordt automatisch uitgevoerd wanneer de eenheidstest wordt aangeroepen.

  4. Voeg het testproject toe aan de oplossing.

    dotnet sln add StringLibraryTest/StringLibraryTest.csproj
    

Een projectreferentie toevoegen

Voeg een verwijzing in het project toe aan het StringLibraryTest project om het testproject te laten werken met de StringLibraryStringLibrary klasse.

  1. Voer de volgende opdracht uit:

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

Testmethoden voor eenheden toevoegen en uitvoeren

Wanneer Visual Studio een eenheidstest aanroept, wordt elke methode uitgevoerd die is gemarkeerd met het TestMethodAttribute kenmerk in een klasse die is gemarkeerd met het TestClassAttribute kenmerk. Een testmethode eindigt wanneer de eerste fout wordt gevonden of wanneer alle tests in de methode zijn geslaagd.

De meest voorkomende tests roepen leden van de Assert klasse aan. Veel assertiemethoden bevatten ten minste twee parameters, waarvan een het verwachte testresultaat is en waarvan het werkelijke testresultaat is. Sommige van de meest gebruikte methoden van de Assert klasse worden weergegeven in de volgende tabel:

Assert-methoden Function
Assert.AreEqual Controleert of twee waarden of objecten gelijk zijn. De assert mislukt als de waarden of objecten niet gelijk zijn.
Assert.AreSame Controleert of twee objectvariabelen naar hetzelfde object verwijzen. De assert mislukt als de variabelen verwijzen naar verschillende objecten.
Assert.IsFalse Controleert of een voorwaarde is false. De assert mislukt als de voorwaarde is true.
Assert.IsNotNull Controleert of een object niet nullis. De assert mislukt als het object is null.

U kunt de Assert.ThrowsException methode ook gebruiken in een testmethode om aan te geven welk type uitzondering wordt verwacht te genereren. De test mislukt als de opgegeven uitzondering niet wordt gegenereerd.

Bij het testen van de StringLibrary.StartsWithUpper methode wilt u een aantal tekenreeksen opgeven die beginnen met een hoofdletter. U verwacht dat de methode in deze gevallen wordt geretourneerd true , zodat u de Assert.IsTrue methode kunt aanroepen. Op dezelfde manier wilt u een aantal tekenreeksen opgeven die beginnen met iets anders dan een hoofdletter. U verwacht dat de methode in deze gevallen wordt geretourneerd false , zodat u de Assert.IsFalse methode kunt aanroepen.

Omdat uw bibliotheekmethode tekenreeksen verwerkt, wilt u er ook voor zorgen dat er een lege tekenreeks (String.Empty) en een null tekenreeks wordt verwerkt. Een lege tekenreeks is een tekenreeks die geen tekens heeft en waarvan Length de tekenreeks 0 is. Een null tekenreeks is een tekenreeks die niet is geïnitialiseerd. U kunt rechtstreeks aanroepen StartsWithUpper als een statische methode en één String argument doorgeven. U kunt ook aanroepen StartsWithUpper als een extensiemethode voor een string variabele die is toegewezen aan null.

U definieert drie methoden, die elk een Assert methode aanroepen voor elk element in een tekenreeksmatrix. U roept een overbelasting van de methode aan waarmee u een foutbericht kunt opgeven dat moet worden weergegeven in het geval van een testfout. Het bericht identificeert de tekenreeks die de fout heeft veroorzaakt.

De testmethoden maken:

  1. Open StringLibraryTest/UnitTest1.cs en vervang alle code door de volgende 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));
            }
        }
    }
    

    De test van hoofdletters in de TestStartsWithUpper methode bevat de Griekse hoofdletter alfa (U+0391) en de Cyrillische hoofdletter EM (U+041C). De test van kleine letters in de TestDoesNotStartWithUpper methode bevat de Griekse kleine letter alfa (U+03B1) en de Cyrillische kleine letter Ghe (U+0433).

  2. Uw wijzigingen opslaan.

  3. Voer de tests uit:

    dotnet test StringLibraryTest/StringLibraryTest.csproj
    

    In de terminaluitvoer ziet u dat alle tests zijn geslaagd.

    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)
    

Testfouten afhandelen

Als u testgestuurde ontwikkeling (TDD) uitvoert, schrijft u eerst tests en mislukken ze de eerste keer dat u ze uitvoert. Vervolgens voegt u code toe aan de app waarmee de test slaagt. Voor deze zelfstudie hebt u de test gemaakt nadat u de app-code hebt geschreven die wordt gevalideerd, zodat u de test niet hebt gezien. Als u wilt controleren of een test mislukt wanneer u verwacht dat deze mislukt, voegt u een ongeldige waarde toe aan de testinvoer.

  1. Wijzig de words matrix in de TestDoesNotStartWithUpper methode om de tekenreeks 'Fout' op te nemen.

    string[] words = { "alphabet", "Error", "zebra", "abc", "αυτοκινητοβιομηχανία", "государство",
                       "1234", ".", ";", " " };
    
  2. Voer de tests uit:

    dotnet test StringLibraryTest/StringLibraryTest.csproj
    

    In de terminaluitvoer ziet u dat één test mislukt en wordt er een foutbericht weergegeven voor de mislukte test: 'Assert.IsFalse is mislukt. Verwacht voor 'Fout': onwaar; werkelijk: Waar". Vanwege de fout zijn er geen tekenreeksen in de matrix getest nadat 'Fout' is getest.

    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. Verwijder de tekenreeks 'Fout' die u in stap 1 hebt toegevoegd. Voer de test opnieuw uit en de tests zijn geslaagd.

De releaseversie van de bibliotheek testen

Nu alle tests zijn geslaagd bij het uitvoeren van de build voor foutopsporing van de bibliotheek, voert u de tests een extra tijd uit voor de release-build van de bibliotheek. Een aantal factoren, waaronder compileroptimalisaties, kan soms verschillend gedrag produceren tussen foutopsporing en release-builds.

  1. Voer de tests uit met de buildconfiguratie van de release:

    dotnet test StringLibraryTest/StringLibraryTest.csproj --configuration Release
    

    De tests slagen.

Foutopsporingstests

Als u Visual Studio Code als uw IDE gebruikt, kunt u hetzelfde proces gebruiken dat wordt weergegeven in Foutopsporing in een .NET-consoletoepassing met Visual Studio Code om fouten in code op te sporen met behulp van uw eenheidstestproject. Open StringLibraryTest/UnitTest1.cs in plaats van het project ShowCase-app te starten en selecteer Alle tests opsporen tussen regel 7 en 8. Als u het niet kunt vinden, drukt u op Ctrl+Shift+P om het opdrachtenpalet te openen en het venster Opnieuw laden in te voeren.

Visual Studio Code start het testproject met het bijgevoegde foutopsporingsprogramma. De uitvoering stopt op elk onderbrekingspunt dat u hebt toegevoegd aan het testproject of de onderliggende bibliotheekcode.

Aanvullende bronnen

Volgende stappen

In deze zelfstudie hebt u een klassebibliotheek getest. U kunt de bibliotheek beschikbaar maken voor anderen door deze als pakket te publiceren naar NuGet . Volg een NuGet-zelfstudie voor meer informatie:

Als u een bibliotheek publiceert als een NuGet-pakket, kunnen anderen deze installeren en gebruiken. Volg een NuGet-zelfstudie voor meer informatie:

Een bibliotheek hoeft niet als pakket te worden gedistribueerd. Het kan worden gebundeld met een console-app die deze gebruikt. Zie de eerdere zelfstudie in deze reeks voor meer informatie over het publiceren van een console-app: