Delen via


Zelfstudie: Een .NET-klassebibliotheek testen met .NET met behulp van Visual Studio

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. MSTest is een van de drie testframeworks waaruit u kunt kiezen. De andere zijn xUnit en nUnit.

  1. Start Visual Studio.

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

  3. Voeg een nieuw eenheidstestproject met de naam StringLibraryTest toe aan de oplossing.

    1. Klik met de rechtermuisknop op de oplossing in Solution Explorer en selecteer Nieuw project toevoegen>.

    2. Voer op de pagina Een nieuw project toevoegen mstest in het zoekvak in. Kies C# of Visual Basic in de lijst Taal en kies vervolgens Alle platforms in de lijst Platform.

    3. Kies de sjabloon MSTest Test Project en kies vervolgens Volgende.

    4. Voer op de pagina Uw nieuwe project configureren stringLibraryTest in het vak Projectnaamin. Kies vervolgens Volgende.

    5. Selecteer op de pagina Aanvullende informatie .NET 8 (preview) in het frameworkvak. Kies Maken.

  4. Visual Studio maakt het project en opent het klassebestand in het codevenster met de volgende code. Als de taal die u wilt gebruiken niet wordt weergegeven, wijzigt u de taalkiezer boven aan de pagina.

    namespace StringLibraryTest;
    
    [TestClass]
    public class UnitTest1
    {
        [TestMethod]
        public void TestMethod1()
        {
        }
    }
    
    Imports Microsoft.VisualStudio.TestTools.UnitTesting
    
    Namespace StringLibraryTest
        <TestClass>
        Public Class UnitTest1
            <TestMethod>
            Sub TestSub()
    
            End Sub
        End Class
    End Namespace
    

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

    • Hiermee importeert u de Microsoft.VisualStudio.TestTools.UnitTesting naamruimte, die de typen bevat die worden gebruikt voor eenheidstests. In C# wordt de naamruimte geïmporteerd via een global using instructie in GlobalUsings.cs.
    • Het kenmerk wordt toegepast TestClassAttribute op de UnitTest1 klasse.
    • Het kenmerk wordt toegepast TestMethodAttribute om te definiëren TestMethod1 in C# of TestSub in Visual Basic.

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

Een projectreferentie toevoegen

Als het testproject met de StringLibrary klasse werkt, voegt u een verwijzing toe in het project StringLibraryTest aan het StringLibrary project.

  1. Klik in Solution Explorer met de rechtermuisknop op het knooppunt Afhankelijkheden van het project StringLibraryTest en selecteer Projectverwijzing toevoegen in het contextmenu.

  2. Vouw in het dialoogvenster Reference Manager het knooppunt Projecten uit en selecteer het vak naast StringLibrary. Door een verwijzing naar de StringLibrary assembly toe te voegen, kan de compiler StringLibrary-methoden vinden tijdens het compileren van het project StringLibraryTest.

  3. Selecteer OK.

Testmethoden voor eenheden toevoegen en uitvoeren

Wanneer Visual Studio een eenheidstest uitvoert, 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 Functie
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), een geldige tekenreeks met geen tekens en waarvan Length de waarde 0 is, en een null 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. Vervang in het codevenster UnitTest1.cs of UnitTest1.vb de code door de volgende code:

    using UtilityLibraries;
    
    namespace StringLibraryTest
    {
        [TestClass]
        public class UnitTest1
        {
            [TestMethod]
            public void TestStartsWithUpper()
            {
                // Tests that we expect to return true.
                string[] words = { "Alphabet", "Zebra", "ABC", "Αθήνα", "Москва" };
                foreach (var word in words)
                {
                    bool result = word.StartsWithUpper();
                    Assert.IsTrue(result,
                           string.Format("Expected for '{0}': true; Actual: {1}",
                                         word, result));
                }
            }
    
            [TestMethod]
            public void TestDoesNotStartWithUpper()
            {
                // Tests that we expect to return false.
                string[] words = { "alphabet", "zebra", "abc", "αυτοκινητοβιομηχανία", "государство",
                                   "1234", ".", ";", " " };
                foreach (var word in words)
                {
                    bool result = word.StartsWithUpper();
                    Assert.IsFalse(result,
                           string.Format("Expected for '{0}': false; Actual: {1}",
                                         word, result));
                }
            }
    
            [TestMethod]
            public void DirectCallWithNullOrEmpty()
            {
                // Tests that we expect to return false.
                string?[] words = { string.Empty, null };
                foreach (var word in words)
                {
                    bool result = StringLibrary.StartsWithUpper(word);
                    Assert.IsFalse(result,
                           string.Format("Expected for '{0}': false; Actual: {1}",
                                         word == null ? "<null>" : word, result));
                }
            }
        }
    }
    
    Imports Microsoft.VisualStudio.TestTools.UnitTesting
    Imports UtilityLibraries
    
    Namespace StringLibraryTest
        <TestClass>
        Public Class UnitTest1
            <TestMethod>
            Public Sub TestStartsWithUpper()
                ' Tests that we expect to return true.
                Dim words() As String = {"Alphabet", "Zebra", "ABC", "Αθήνα", "Москва"}
                For Each word In words
                    Dim result As Boolean = word.StartsWithUpper()
                    Assert.IsTrue(result,
                           $"Expected for '{word}': true; Actual: {result}")
                Next
            End Sub
    
            <TestMethod>
            Public Sub TestDoesNotStartWithUpper()
                ' Tests that we expect to return false.
                Dim words() As String = {"alphabet", "zebra", "abc", "αυτοκινητοβιομηχανία", "государство",
                                   "1234", ".", ";", " "}
                For Each word In words
                    Dim result As Boolean = word.StartsWithUpper()
                    Assert.IsFalse(result,
                           $"Expected for '{word}': false; Actual: {result}")
                Next
            End Sub
    
            <TestMethod>
            Public Sub DirectCallWithNullOrEmpty()
                ' Tests that we expect to return false.
                Dim words() As String = {String.Empty, Nothing}
                For Each word In words
                    Dim result As Boolean = StringLibrary.StartsWithUpper(word)
                    Assert.IsFalse(result,
                           $"Expected for '{If(word Is Nothing, "<null>", word)}': false; Actual: {result}")
                Next
            End Sub
        End Class
    End Namespace
    

    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. Selecteer in de menubalk File>Save UnitTest1.cs As of File>Save UnitTest1.vb As. Selecteer in het dialoogvenster Bestand opslaan als de pijl naast de knop Opslaan en selecteer Opslaan met codering.

    Visual Studio Save File As dialog

  3. Selecteer in het dialoogvenster Opslaan als bevestigen de knop Ja om het bestand op te slaan.

  4. Selecteer In het dialoogvenster Geavanceerde opties voor opslaan Unicode (UTF-8 met handtekening) - Codepage 65001 in de vervolgkeuzelijst Codering en selecteer OK.

    Visual Studio Advanced Save Options dialog

    Als u uw broncode niet opslaat als een UTF8-gecodeerd bestand, kan Visual Studio deze opslaan als een ASCII-bestand. Als dat gebeurt, worden de UTF8-tekens buiten het ASCII-bereik niet nauwkeurig gedecodeerd door de runtime en zijn de testresultaten niet juist.

  5. Selecteer Alle >tests uitvoeren op de menubalk. Als het testverkennervenster niet wordt geopend, opent u het door Test>Explorer te kiezen. De drie tests worden weergegeven in de sectie Geslaagde tests en de sectie Samenvatting rapporteert het resultaat van de testuitvoering.

    Test Explorer window with passing tests

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. U hoeft het bestand niet op te slaan omdat in Visual Studio automatisch geopende bestanden worden opgeslagen wanneer een oplossing is gebouwd om tests uit te voeren.

    string[] words = { "alphabet", "Error", "zebra", "abc", "αυτοκινητοβιομηχανία", "государство",
                       "1234", ".", ";", " " };
    
    Dim words() As String = { "alphabet", "Error", "zebra", "abc", "αυτοκινητοβιομηχανία", "государство",
                       "1234", ".", ";", " " }
    
    
  2. Voer de test uit door Alle>tests testen te selecteren in de menubalk. Het venster Test Explorer geeft aan dat er twee tests zijn geslaagd en één test is mislukt.

    Test Explorer window with failing tests

  3. Selecteer de mislukte test. TestDoesNotStartWith

    In het venster Test Explorer wordt het bericht weergegeven dat is geproduceerd door de assert: '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.

    Test Explorer window showing the IsFalse assertion failure

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

Ga als volgende te werk om de release-build te testen:

  1. Wijzig in de werkbalk van Visual Studio de buildconfiguratie van Foutopsporing in Release.

    Visual Studio toolbar with release build highlighted

  2. Klik in Solution Explorer met de rechtermuisknop op het StringLibrary-project en selecteer Build in het contextmenu om de bibliotheek opnieuw te compileren.

    StringLibrary context menu with build command

  3. Voer de eenheidstests uit door Alle>tests testen te kiezen in de menubalk. De tests slagen.

Foutopsporingstests

Als u Visual Studio als uw IDE gebruikt, kunt u hetzelfde proces gebruiken dat wordt weergegeven in zelfstudie: Fouten opsporen in een .NET-consoletoepassing met Visual Studio om fouten in code op te sporen met behulp van uw eenheidstestproject. In plaats van het project ShowCase-app te starten, klikt u met de rechtermuisknop op het project StringLibraryTests en selecteert u Debug Tests in het contextmenu.

Visual Studio 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. MSTest is een van de drie testframeworks waaruit u kunt kiezen. De andere zijn xUnit en nUnit.

  1. Start Visual Studio.

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

  3. Voeg een nieuw eenheidstestproject met de naam StringLibraryTest toe aan de oplossing.

    1. Klik met de rechtermuisknop op de oplossing in Solution Explorer en selecteer Nieuw project toevoegen>.

    2. Voer op de pagina Een nieuw project toevoegen mstest in het zoekvak in. Kies C# of Visual Basic in de lijst Taal en kies vervolgens Alle platforms in de lijst Platform.

    3. Kies de sjabloon MSTest Test Project en kies vervolgens Volgende.

    4. Voer op de pagina Uw nieuwe project configureren stringLibraryTest in het vak Projectnaamin. Kies vervolgens Volgende.

    5. Selecteer op de pagina Aanvullende informatie .NET 7 (standaardtermondersteuning) in het vak Framework. Kies Maken.

  4. Visual Studio maakt het project en opent het klassebestand in het codevenster met de volgende code. Als de taal die u wilt gebruiken niet wordt weergegeven, wijzigt u de taalkiezer boven aan de pagina.

    using Microsoft.VisualStudio.TestTools.UnitTesting;
    
    namespace StringLibraryTest
    {
        [TestClass]
        public class UnitTest1
        {
            [TestMethod]
            public void TestMethod1()
            {
            }
        }
    }
    
    Imports Microsoft.VisualStudio.TestTools.UnitTesting
    
    Namespace StringLibraryTest
        <TestClass>
        Public Class UnitTest1
            <TestMethod>
            Sub TestSub()
    
            End Sub
        End Class
    End Namespace
    

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

Een projectreferentie toevoegen

Als het testproject met de StringLibrary klasse werkt, voegt u een verwijzing toe in het project StringLibraryTest aan het StringLibrary project.

  1. Klik in Solution Explorer met de rechtermuisknop op het knooppunt Afhankelijkheden van het project StringLibraryTest en selecteer Projectverwijzing toevoegen in het contextmenu.

  2. Vouw in het dialoogvenster Reference Manager het knooppunt Projecten uit en selecteer het vak naast StringLibrary. Door een verwijzing naar de StringLibrary assembly toe te voegen, kan de compiler StringLibrary-methoden vinden tijdens het compileren van het project StringLibraryTest.

  3. Selecteer OK.

Testmethoden voor eenheden toevoegen en uitvoeren

Wanneer Visual Studio een eenheidstest uitvoert, 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 Functie
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), een geldige tekenreeks met geen tekens en waarvan Length de waarde 0 is, en een null 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. Vervang in het codevenster UnitTest1.cs of UnitTest1.vb de 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));
                }
            }
        }
    }
    
    Imports Microsoft.VisualStudio.TestTools.UnitTesting
    Imports UtilityLibraries
    
    Namespace StringLibraryTest
        <TestClass>
        Public Class UnitTest1
            <TestMethod>
            Public Sub TestStartsWithUpper()
                ' Tests that we expect to return true.
                Dim words() As String = {"Alphabet", "Zebra", "ABC", "Αθήνα", "Москва"}
                For Each word In words
                    Dim result As Boolean = word.StartsWithUpper()
                    Assert.IsTrue(result,
                           $"Expected for '{word}': true; Actual: {result}")
                Next
            End Sub
    
            <TestMethod>
            Public Sub TestDoesNotStartWithUpper()
                ' Tests that we expect to return false.
                Dim words() As String = {"alphabet", "zebra", "abc", "αυτοκινητοβιομηχανία", "государство",
                                   "1234", ".", ";", " "}
                For Each word In words
                    Dim result As Boolean = word.StartsWithUpper()
                    Assert.IsFalse(result,
                           $"Expected for '{word}': false; Actual: {result}")
                Next
            End Sub
    
            <TestMethod>
            Public Sub DirectCallWithNullOrEmpty()
                ' Tests that we expect to return false.
                Dim words() As String = {String.Empty, Nothing}
                For Each word In words
                    Dim result As Boolean = StringLibrary.StartsWithUpper(word)
                    Assert.IsFalse(result,
                           $"Expected for '{If(word Is Nothing, "<null>", word)}': false; Actual: {result}")
                Next
            End Sub
        End Class
    End Namespace
    

    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. Selecteer in de menubalk File>Save UnitTest1.cs As of File>Save UnitTest1.vb As. Selecteer in het dialoogvenster Bestand opslaan als de pijl naast de knop Opslaan en selecteer Opslaan met codering.

    Visual Studio Save File As dialog

  3. Selecteer in het dialoogvenster Opslaan als bevestigen de knop Ja om het bestand op te slaan.

  4. Selecteer In het dialoogvenster Geavanceerde opties voor opslaan Unicode (UTF-8 met handtekening) - Codepage 65001 in de vervolgkeuzelijst Codering en selecteer OK.

    Visual Studio Advanced Save Options dialog

    Als u uw broncode niet opslaat als een UTF8-gecodeerd bestand, kan Visual Studio deze opslaan als een ASCII-bestand. Als dat gebeurt, worden de UTF8-tekens buiten het ASCII-bereik niet nauwkeurig gedecodeerd door de runtime en zijn de testresultaten niet juist.

  5. Selecteer Alle >tests uitvoeren op de menubalk. Als het testverkennervenster niet wordt geopend, opent u het door Test>Explorer te kiezen. De drie tests worden weergegeven in de sectie Geslaagde tests en de sectie Samenvatting rapporteert het resultaat van de testuitvoering.

    Test Explorer window with passing tests

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. U hoeft het bestand niet op te slaan omdat in Visual Studio automatisch geopende bestanden worden opgeslagen wanneer een oplossing is gebouwd om tests uit te voeren.

    string[] words = { "alphabet", "Error", "zebra", "abc", "αυτοκινητοβιομηχανία", "государство",
                       "1234", ".", ";", " " };
    
    Dim words() As String = { "alphabet", "Error", "zebra", "abc", "αυτοκινητοβιομηχανία", "государство",
                       "1234", ".", ";", " " }
    
    
  2. Voer de test uit door Alle>tests testen te selecteren in de menubalk. Het venster Test Explorer geeft aan dat er twee tests zijn geslaagd en één test is mislukt.

    Test Explorer window with failing tests

  3. Selecteer de mislukte test. TestDoesNotStartWith

    In het venster Test Explorer wordt het bericht weergegeven dat is geproduceerd door de assert: '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.

    Test Explorer window showing the IsFalse assertion failure

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

Ga als volgende te werk om de release-build te testen:

  1. Wijzig in de werkbalk van Visual Studio de buildconfiguratie van Foutopsporing in Release.

    Visual Studio toolbar with release build highlighted

  2. Klik in Solution Explorer met de rechtermuisknop op het StringLibrary-project en selecteer Build in het contextmenu om de bibliotheek opnieuw te compileren.

    StringLibrary context menu with build command

  3. Voer de eenheidstests uit door Alle>tests testen te kiezen in de menubalk. De tests slagen.

Foutopsporingstests

Als u Visual Studio als uw IDE gebruikt, kunt u hetzelfde proces gebruiken dat wordt weergegeven in zelfstudie: Fouten opsporen in een .NET-consoletoepassing met Visual Studio om fouten in code op te sporen met behulp van uw eenheidstestproject. In plaats van het project ShowCase-app te starten, klikt u met de rechtermuisknop op het project StringLibraryTests en selecteert u Debug Tests in het contextmenu.

Visual Studio 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. MSTest is een van de drie testframeworks waaruit u kunt kiezen. De andere zijn xUnit en nUnit.

  1. Start Visual Studio.

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

  3. Voeg een nieuw eenheidstestproject met de naam StringLibraryTest toe aan de oplossing.

    1. Klik met de rechtermuisknop op de oplossing in Solution Explorer en selecteer Nieuw project toevoegen>.

    2. Voer op de pagina Een nieuw project toevoegen mstest in het zoekvak in. Kies C# of Visual Basic in de lijst Taal en kies vervolgens Alle platforms in de lijst Platform.

    3. Kies de sjabloon MSTest Test Project en kies vervolgens Volgende.

    4. Voer op de pagina Uw nieuwe project configureren stringLibraryTest in het vak Projectnaamin. Kies vervolgens Volgende.

    5. Selecteer op de pagina Aanvullende informatie .NET 6 (langetermijnondersteuning) in het vak Framework. Kies Maken.

  4. Visual Studio maakt het project en opent het klassebestand in het codevenster met de volgende code. Als de taal die u wilt gebruiken niet wordt weergegeven, wijzigt u de taalkiezer boven aan de pagina.

    using Microsoft.VisualStudio.TestTools.UnitTesting;
    
    namespace StringLibraryTest
    {
        [TestClass]
        public class UnitTest1
        {
            [TestMethod]
            public void TestMethod1()
            {
            }
        }
    }
    
    Imports Microsoft.VisualStudio.TestTools.UnitTesting
    
    Namespace StringLibraryTest
        <TestClass>
        Public Class UnitTest1
            <TestMethod>
            Sub TestSub()
    
            End Sub
        End Class
    End Namespace
    

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

Een projectreferentie toevoegen

Als het testproject met de StringLibrary klasse werkt, voegt u een verwijzing toe in het project StringLibraryTest aan het StringLibrary project.

  1. Klik in Solution Explorer met de rechtermuisknop op het knooppunt Afhankelijkheden van het project StringLibraryTest en selecteer Projectverwijzing toevoegen in het contextmenu.

  2. Vouw in het dialoogvenster Reference Manager het knooppunt Projecten uit en selecteer het vak naast StringLibrary. Door een verwijzing naar de StringLibrary assembly toe te voegen, kan de compiler StringLibrary-methoden vinden tijdens het compileren van het project StringLibraryTest.

  3. Selecteer OK.

Testmethoden voor eenheden toevoegen en uitvoeren

Wanneer Visual Studio een eenheidstest uitvoert, 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 Functie
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), een geldige tekenreeks met geen tekens en waarvan Length de waarde 0 is, en een null 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. Vervang in het codevenster UnitTest1.cs of UnitTest1.vb de 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));
                }
            }
        }
    }
    
    Imports Microsoft.VisualStudio.TestTools.UnitTesting
    Imports UtilityLibraries
    
    Namespace StringLibraryTest
        <TestClass>
        Public Class UnitTest1
            <TestMethod>
            Public Sub TestStartsWithUpper()
                ' Tests that we expect to return true.
                Dim words() As String = {"Alphabet", "Zebra", "ABC", "Αθήνα", "Москва"}
                For Each word In words
                    Dim result As Boolean = word.StartsWithUpper()
                    Assert.IsTrue(result,
                           $"Expected for '{word}': true; Actual: {result}")
                Next
            End Sub
    
            <TestMethod>
            Public Sub TestDoesNotStartWithUpper()
                ' Tests that we expect to return false.
                Dim words() As String = {"alphabet", "zebra", "abc", "αυτοκινητοβιομηχανία", "государство",
                                   "1234", ".", ";", " "}
                For Each word In words
                    Dim result As Boolean = word.StartsWithUpper()
                    Assert.IsFalse(result,
                           $"Expected for '{word}': false; Actual: {result}")
                Next
            End Sub
    
            <TestMethod>
            Public Sub DirectCallWithNullOrEmpty()
                ' Tests that we expect to return false.
                Dim words() As String = {String.Empty, Nothing}
                For Each word In words
                    Dim result As Boolean = StringLibrary.StartsWithUpper(word)
                    Assert.IsFalse(result,
                           $"Expected for '{If(word Is Nothing, "<null>", word)}': false; Actual: {result}")
                Next
            End Sub
        End Class
    End Namespace
    

    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. Selecteer in de menubalk File>Save UnitTest1.cs As of File>Save UnitTest1.vb As. Selecteer in het dialoogvenster Bestand opslaan als de pijl naast de knop Opslaan en selecteer Opslaan met codering.

    Visual Studio Save File As dialog

  3. Selecteer in het dialoogvenster Opslaan als bevestigen de knop Ja om het bestand op te slaan.

  4. Selecteer In het dialoogvenster Geavanceerde opties voor opslaan Unicode (UTF-8 met handtekening) - Codepage 65001 in de vervolgkeuzelijst Codering en selecteer OK.

    Visual Studio Advanced Save Options dialog

    Als u uw broncode niet opslaat als een UTF8-gecodeerd bestand, kan Visual Studio deze opslaan als een ASCII-bestand. Als dat gebeurt, worden de UTF8-tekens buiten het ASCII-bereik niet nauwkeurig gedecodeerd door de runtime en zijn de testresultaten niet juist.

  5. Selecteer Alle >tests uitvoeren op de menubalk. Als het testverkennervenster niet wordt geopend, opent u het door Test>Explorer te kiezen. De drie tests worden weergegeven in de sectie Geslaagde tests en de sectie Samenvatting rapporteert het resultaat van de testuitvoering.

    Test Explorer window with passing tests

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. U hoeft het bestand niet op te slaan omdat in Visual Studio automatisch geopende bestanden worden opgeslagen wanneer een oplossing is gebouwd om tests uit te voeren.

    string[] words = { "alphabet", "Error", "zebra", "abc", "αυτοκινητοβιομηχανία", "государство",
                       "1234", ".", ";", " " };
    
    Dim words() As String = { "alphabet", "Error", "zebra", "abc", "αυτοκινητοβιομηχανία", "государство",
                       "1234", ".", ";", " " }
    
    
  2. Voer de test uit door Alle>tests testen te selecteren in de menubalk. Het venster Test Explorer geeft aan dat er twee tests zijn geslaagd en één test is mislukt.

    Test Explorer window with failing tests

  3. Selecteer de mislukte test. TestDoesNotStartWith

    In het venster Test Explorer wordt het bericht weergegeven dat is geproduceerd door de assert: '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.

    Test Explorer window showing the IsFalse assertion failure

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

Ga als volgende te werk om de release-build te testen:

  1. Wijzig in de werkbalk van Visual Studio de buildconfiguratie van Foutopsporing in Release.

    Visual Studio toolbar with release build highlighted

  2. Klik in Solution Explorer met de rechtermuisknop op het StringLibrary-project en selecteer Build in het contextmenu om de bibliotheek opnieuw te compileren.

    StringLibrary context menu with build command

  3. Voer de eenheidstests uit door Alle>tests testen te kiezen in de menubalk. De tests slagen.

Foutopsporingstests

Als u Visual Studio als uw IDE gebruikt, kunt u hetzelfde proces gebruiken dat wordt weergegeven in zelfstudie: Fouten opsporen in een .NET-consoletoepassing met Visual Studio om fouten in code op te sporen met behulp van uw eenheidstestproject. In plaats van het project ShowCase-app te starten, klikt u met de rechtermuisknop op het project StringLibraryTests en selecteert u Debug Tests in het contextmenu.

Visual Studio 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: