Dela via


Självstudie: Testa ett .NET-klassbibliotek med .NET med Visual Studio

Den här självstudien visar hur du automatiserar enhetstestning genom att lägga till ett testprojekt i en lösning.

Förutsättningar

Skapa ett enhetstestprojekt

Enhetstester ger automatiserad programvarutestning under din utveckling och publicering. MSTest är ett av tre testramverk som du kan välja mellan. De andra är xUnit och nUnit.

  1. Starta Visual Studio.

  2. Öppna lösningen ClassLibraryProjects som du skapade i Skapa ett .NET-klassbibliotek med Visual Studio.

  3. Lägg till ett nytt enhetstestprojekt med namnet "StringLibraryTest" i lösningen.

    1. Högerklicka på lösningen i Solution Explorer och välj Lägg till>nytt projekt.

    2. På sidan Lägg till ett nytt projekt anger du mstest i sökrutan. Välj C# eller Visual Basic i listan Språk och välj sedan Alla plattformar i listan Plattform.

    3. Välj mallen MSTest Test Project och välj sedan Nästa.

    4. På sidan Konfigurera det nya projektet anger du StringLibraryTest i rutan Projektnamn . Välj sedan Nästa.

    5. På sidan Ytterligare information väljer du .NET 8 (förhandsversion) i rutan Framework . Välj sedan Skapa.

  4. Visual Studio skapar projektet och öppnar klassfilen i kodfönstret med följande kod. Om det språk du vill använda inte visas ändrar du språkväljaren överst på sidan.

    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
    

    Källkoden som skapas av enhetstestmallen gör följande:

    Varje metod som taggas med [TestMethod] i en testklass taggad med [TestClass] körs automatiskt när enhetstestet körs.

Lägga till en projektreferens

För att testprojektet ska fungera med StringLibrary klassen lägger du till en referens i StringLibraryTest-projektet i StringLibrary projektet.

  1. Högerklicka noden Beroenden i Projektet StringLibraryTest i Solution Explorer och välj Lägg till projektreferens på snabbmenyn.

  2. I dialogrutan Referenshanteraren expanderar du noden Projekt och markerar rutan bredvid StringLibrary. Genom att lägga till en referens till StringLibrary sammansättningen kan kompilatorn hitta StringLibrary-metoder när stringlibraryTest-projektet kompileras.

  3. Välj OK.

Lägga till och köra enhetstestmetoder

När Visual Studio kör ett enhetstest körs varje metod som är markerad med TestMethodAttribute attributet i en klass som är markerad med TestClassAttribute attributet. En testmetod slutar när det första felet hittas eller när alla tester i metoden har lyckats.

De vanligaste testerna anropar klassens Assert medlemmar. Många kontrollmetoder innehåller minst två parametrar, varav en är det förväntade testresultatet och det andra är det faktiska testresultatet. Några av Assert klassens vanligaste metoder visas i följande tabell:

Assert-metoder Funktion
Assert.AreEqual Verifierar att två värden eller objekt är lika med. Kontrollen misslyckas om värdena eller objekten inte är lika med.
Assert.AreSame Verifierar att två objektvariabler refererar till samma objekt. Kontrollen misslyckas om variablerna refererar till olika objekt.
Assert.IsFalse Verifierar att ett villkor är false. Kontrollen misslyckas om villkoret är true.
Assert.IsNotNull Verifierar att ett objekt inte nullär . Kontrollen misslyckas om objektet är null.

Du kan också använda Assert.ThrowsException metoden i en testmetod för att ange vilken typ av undantag den förväntas generera. Testet misslyckas om det angivna undantaget inte utlöses.

När du testar StringLibrary.StartsWithUpper metoden vill du ange ett antal strängar som börjar med ett versalt tecken. Du förväntar dig att metoden ska returneras true i dessa fall, så att du kan anropa Assert.IsTrue metoden. På samma sätt vill du ange ett antal strängar som börjar med något annat än ett versalt tecken. Du förväntar dig att metoden ska returneras false i dessa fall, så att du kan anropa Assert.IsFalse metoden.

Eftersom biblioteksmetoden hanterar strängar vill du också se till att den hanterar en tom sträng (String.Empty), en giltig sträng som inte har några tecken och vars Length är 0 och en null sträng som inte har initierats. Du kan anropa StartsWithUpper direkt som en statisk metod och skicka ett enda String argument. Eller så kan du anropa StartsWithUpper som en tilläggsmetod för en string variabel som tilldelats till null.

Du definierar tre metoder som var och en anropar en Assert metod för varje element i en strängmatris. Du anropar en metodöverlagring som gör att du kan ange ett felmeddelande som ska visas vid testfel. Meddelandet identifierar strängen som orsakade felet.

Så här skapar du testmetoderna:

  1. I kodfönstret UnitTest1.cs eller UnitTest1.vb ersätter du koden med följande kod:

    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
    

    Testet av versaler i TestStartsWithUpper metoden innehåller den grekiska versaler alfa (U+0391) och kyrilliska versaler EM (U+041C). Testet av gemener i metoden innehåller den grekiska alfabeteckningen TestDoesNotStartWithUpper (U+03B1) och den kyrilliska små bokstaven Ghe (U+0433).

  2. På menyraden väljer du Arkiv>Spara enhetTest1.cs Som eller Filspara>enhetTest1.vb Som. I dialogrutan Spara fil som väljer du pilen bredvid knappen Spara och väljer Spara med kodning.

    Visual Studio Save File As dialog

  3. I dialogrutan Bekräfta Spara som väljer du knappen Ja för att spara filen.

  4. I dialogrutan Avancerade spara alternativ väljer du Unicode (UTF-8 med signatur) – Kodsida 65001 i listrutan Kodning och väljer OK.

    Visual Studio Advanced Save Options dialog

    Om du inte sparar källkoden som en UTF8-kodad fil kan Visual Studio spara den som en ASCII-fil. När det händer avkodar körningen inte UTF8-tecknen utanför ASCII-intervallet korrekt och testresultaten blir inte korrekta.

  5. På menyraden väljer du Testa>Kör alla tester. Om testutforskarens fönster inte öppnas öppnar du det genom att välja Test>testutforskaren. De tre testerna visas i avsnittet Godkänd testning och avsnittet Sammanfattning rapporterar resultatet av testkörningen.

    Test Explorer window with passing tests

Hantera testfel

Om du utför testdriven utveckling (TDD) skriver du tester först och de misslyckas första gången du kör dem. Sedan lägger du till kod i appen som gör att testet lyckas. I den här självstudien har du skapat testet när du har skrivit appkoden som den validerar, så du har inte sett testet misslyckas. Om du vill verifiera att ett test misslyckas när du förväntar dig att det ska misslyckas lägger du till ett ogiltigt värde i testindata.

  1. Ändra matrisen wordsTestDoesNotStartWithUpper i metoden så att den innehåller strängen "Error". Du behöver inte spara filen eftersom Visual Studio automatiskt sparar öppna filer när en lösning skapas för att köra tester.

    string[] words = { "alphabet", "Error", "zebra", "abc", "αυτοκινητοβιομηχανία", "государство",
                       "1234", ".", ";", " " };
    
    Dim words() As String = { "alphabet", "Error", "zebra", "abc", "αυτοκινητοβιομηχανία", "государство",
                       "1234", ".", ";", " " }
    
    
  2. Kör testet genom att välja Testa>kör alla tester på menyraden. Fönstret Testutforskaren anger att två tester lyckades och ett misslyckades.

    Test Explorer window with failing tests

  3. Välj det misslyckade testet. TestDoesNotStartWith

    I fönstret Testutforskaren visas meddelandet som skapats av kontrollen: "Assert.IsFalse failed. Förväntas för "Error": false; actual: True". På grund av felet har inga strängar i matrisen efter att "Fel" testats.

    Test Explorer window showing the IsFalse assertion failure

  4. Ta bort strängen "Fel" som du lade till i steg 1. Kör testet igen och testerna godkänns.

Testa versionen av biblioteket

Nu när testerna har godkänts när du kör felsökningsversionen av biblioteket kör du testerna ytterligare en gång mot versionsversionen av biblioteket. Ett antal faktorer, inklusive kompilatoroptimeringar, kan ibland ge olika beteende mellan felsöknings- och versionsversioner.

Så här testar du versionsversionen:

  1. I Visual Studio-verktygsfältet ändrar du byggkonfigurationen från Felsökning till Version.

    Visual Studio toolbar with release build highlighted

  2. Högerklicka Projektet StringLibrary i Solution Explorer och välj Skapa på snabbmenyn för att kompilera om biblioteket.

    StringLibrary context menu with build command

  3. Kör enhetstesterna genom att välja Testa>kör alla tester från menyraden. Testerna godkänns.

Felsöka tester

Om du använder Visual Studio som din IDE kan du använda samma process som visas i Självstudie: Felsöka ett .NET-konsolprogram med Visual Studio för att felsöka kod med hjälp av ditt enhetstestprojekt. I stället för att starta ShowCase-appprojektet högerklickar du på projektet StringLibraryTests och väljer Felsöka tester på snabbmenyn.

Visual Studio startar testprojektet med felsökningsprogrammet kopplat. Körningen stoppas vid alla brytpunkter som du har lagt till i testprojektet eller den underliggande bibliotekskoden.

Ytterligare resurser

Nästa steg

I den här självstudien testade du ett klassbibliotek. Du kan göra biblioteket tillgängligt för andra genom att publicera det till NuGet som ett paket. Om du vill veta hur du följer en NuGet-självstudie:

Om du publicerar ett bibliotek som ett NuGet-paket kan andra installera och använda det. Om du vill veta hur du följer en NuGet-självstudie:

Ett bibliotek behöver inte distribueras som ett paket. Den kan paketeras med en konsolapp som använder den. Mer information om hur du publicerar en konsolapp finns i den tidigare självstudien i den här serien:

Den här självstudien visar hur du automatiserar enhetstestning genom att lägga till ett testprojekt i en lösning.

Förutsättningar

Skapa ett enhetstestprojekt

Enhetstester ger automatiserad programvarutestning under din utveckling och publicering. MSTest är ett av tre testramverk som du kan välja mellan. De andra är xUnit och nUnit.

  1. Starta Visual Studio.

  2. Öppna lösningen ClassLibraryProjects som du skapade i Skapa ett .NET-klassbibliotek med Visual Studio.

  3. Lägg till ett nytt enhetstestprojekt med namnet "StringLibraryTest" i lösningen.

    1. Högerklicka på lösningen i Solution Explorer och välj Lägg till>nytt projekt.

    2. På sidan Lägg till ett nytt projekt anger du mstest i sökrutan. Välj C# eller Visual Basic i listan Språk och välj sedan Alla plattformar i listan Plattform.

    3. Välj mallen MSTest Test Project och välj sedan Nästa.

    4. På sidan Konfigurera det nya projektet anger du StringLibraryTest i rutan Projektnamn . Välj sedan Nästa.

    5. På sidan Ytterligare information väljer du .NET 7 (Standard-term support) i rutan Framework . Välj sedan Skapa.

  4. Visual Studio skapar projektet och öppnar klassfilen i kodfönstret med följande kod. Om det språk du vill använda inte visas ändrar du språkväljaren överst på sidan.

    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
    

    Källkoden som skapas av enhetstestmallen gör följande:

    Varje metod som taggas med [TestMethod] i en testklass taggad med [TestClass] körs automatiskt när enhetstestet körs.

Lägga till en projektreferens

För att testprojektet ska fungera med StringLibrary klassen lägger du till en referens i StringLibraryTest-projektet i StringLibrary projektet.

  1. Högerklicka noden Beroenden i Projektet StringLibraryTest i Solution Explorer och välj Lägg till projektreferens på snabbmenyn.

  2. I dialogrutan Referenshanteraren expanderar du noden Projekt och markerar rutan bredvid StringLibrary. Genom att lägga till en referens till StringLibrary sammansättningen kan kompilatorn hitta StringLibrary-metoder när stringlibraryTest-projektet kompileras.

  3. Välj OK.

Lägga till och köra enhetstestmetoder

När Visual Studio kör ett enhetstest körs varje metod som är markerad med TestMethodAttribute attributet i en klass som är markerad med TestClassAttribute attributet. En testmetod slutar när det första felet hittas eller när alla tester i metoden har lyckats.

De vanligaste testerna anropar klassens Assert medlemmar. Många kontrollmetoder innehåller minst två parametrar, varav en är det förväntade testresultatet och det andra är det faktiska testresultatet. Några av Assert klassens vanligaste metoder visas i följande tabell:

Assert-metoder Funktion
Assert.AreEqual Verifierar att två värden eller objekt är lika med. Kontrollen misslyckas om värdena eller objekten inte är lika med.
Assert.AreSame Verifierar att två objektvariabler refererar till samma objekt. Kontrollen misslyckas om variablerna refererar till olika objekt.
Assert.IsFalse Verifierar att ett villkor är false. Kontrollen misslyckas om villkoret är true.
Assert.IsNotNull Verifierar att ett objekt inte nullär . Kontrollen misslyckas om objektet är null.

Du kan också använda Assert.ThrowsException metoden i en testmetod för att ange vilken typ av undantag den förväntas generera. Testet misslyckas om det angivna undantaget inte utlöses.

När du testar StringLibrary.StartsWithUpper metoden vill du ange ett antal strängar som börjar med ett versalt tecken. Du förväntar dig att metoden ska returneras true i dessa fall, så att du kan anropa Assert.IsTrue metoden. På samma sätt vill du ange ett antal strängar som börjar med något annat än ett versalt tecken. Du förväntar dig att metoden ska returneras false i dessa fall, så att du kan anropa Assert.IsFalse metoden.

Eftersom biblioteksmetoden hanterar strängar vill du också se till att den hanterar en tom sträng (String.Empty), en giltig sträng som inte har några tecken och vars Length är 0 och en null sträng som inte har initierats. Du kan anropa StartsWithUpper direkt som en statisk metod och skicka ett enda String argument. Eller så kan du anropa StartsWithUpper som en tilläggsmetod för en string variabel som tilldelats till null.

Du definierar tre metoder som var och en anropar en Assert metod för varje element i en strängmatris. Du anropar en metodöverlagring som gör att du kan ange ett felmeddelande som ska visas vid testfel. Meddelandet identifierar strängen som orsakade felet.

Så här skapar du testmetoderna:

  1. I kodfönstret UnitTest1.cs eller UnitTest1.vb ersätter du koden med följande kod:

    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
    

    Testet av versaler i TestStartsWithUpper metoden innehåller den grekiska versaler alfa (U+0391) och kyrilliska versaler EM (U+041C). Testet av gemener i metoden innehåller den grekiska alfabeteckningen TestDoesNotStartWithUpper (U+03B1) och den kyrilliska små bokstaven Ghe (U+0433).

  2. På menyraden väljer du Arkiv>Spara enhetTest1.cs Som eller Filspara>enhetTest1.vb Som. I dialogrutan Spara fil som väljer du pilen bredvid knappen Spara och väljer Spara med kodning.

    Visual Studio Save File As dialog

  3. I dialogrutan Bekräfta Spara som väljer du knappen Ja för att spara filen.

  4. I dialogrutan Avancerade spara alternativ väljer du Unicode (UTF-8 med signatur) – Kodsida 65001 i listrutan Kodning och väljer OK.

    Visual Studio Advanced Save Options dialog

    Om du inte sparar källkoden som en UTF8-kodad fil kan Visual Studio spara den som en ASCII-fil. När det händer avkodar körningen inte UTF8-tecknen utanför ASCII-intervallet korrekt och testresultaten blir inte korrekta.

  5. På menyraden väljer du Testa>Kör alla tester. Om testutforskarens fönster inte öppnas öppnar du det genom att välja Test>testutforskaren. De tre testerna visas i avsnittet Godkänd testning och avsnittet Sammanfattning rapporterar resultatet av testkörningen.

    Test Explorer window with passing tests

Hantera testfel

Om du utför testdriven utveckling (TDD) skriver du tester först och de misslyckas första gången du kör dem. Sedan lägger du till kod i appen som gör att testet lyckas. I den här självstudien har du skapat testet när du har skrivit appkoden som den validerar, så du har inte sett testet misslyckas. Om du vill verifiera att ett test misslyckas när du förväntar dig att det ska misslyckas lägger du till ett ogiltigt värde i testindata.

  1. Ändra matrisen wordsTestDoesNotStartWithUpper i metoden så att den innehåller strängen "Error". Du behöver inte spara filen eftersom Visual Studio automatiskt sparar öppna filer när en lösning skapas för att köra tester.

    string[] words = { "alphabet", "Error", "zebra", "abc", "αυτοκινητοβιομηχανία", "государство",
                       "1234", ".", ";", " " };
    
    Dim words() As String = { "alphabet", "Error", "zebra", "abc", "αυτοκινητοβιομηχανία", "государство",
                       "1234", ".", ";", " " }
    
    
  2. Kör testet genom att välja Testa>kör alla tester på menyraden. Fönstret Testutforskaren anger att två tester lyckades och ett misslyckades.

    Test Explorer window with failing tests

  3. Välj det misslyckade testet. TestDoesNotStartWith

    I fönstret Testutforskaren visas meddelandet som skapats av kontrollen: "Assert.IsFalse failed. Förväntas för "Error": false; actual: True". På grund av felet har inga strängar i matrisen efter att "Fel" testats.

    Test Explorer window showing the IsFalse assertion failure

  4. Ta bort strängen "Fel" som du lade till i steg 1. Kör testet igen och testerna godkänns.

Testa versionen av biblioteket

Nu när testerna har godkänts när du kör felsökningsversionen av biblioteket kör du testerna ytterligare en gång mot versionsversionen av biblioteket. Ett antal faktorer, inklusive kompilatoroptimeringar, kan ibland ge olika beteende mellan felsöknings- och versionsversioner.

Så här testar du versionsversionen:

  1. I Visual Studio-verktygsfältet ändrar du byggkonfigurationen från Felsökning till Version.

    Visual Studio toolbar with release build highlighted

  2. Högerklicka Projektet StringLibrary i Solution Explorer och välj Skapa på snabbmenyn för att kompilera om biblioteket.

    StringLibrary context menu with build command

  3. Kör enhetstesterna genom att välja Testa>kör alla tester från menyraden. Testerna godkänns.

Felsöka tester

Om du använder Visual Studio som din IDE kan du använda samma process som visas i Självstudie: Felsöka ett .NET-konsolprogram med Visual Studio för att felsöka kod med hjälp av ditt enhetstestprojekt. I stället för att starta ShowCase-appprojektet högerklickar du på projektet StringLibraryTests och väljer Felsöka tester på snabbmenyn.

Visual Studio startar testprojektet med felsökningsprogrammet kopplat. Körningen stoppas vid alla brytpunkter som du har lagt till i testprojektet eller den underliggande bibliotekskoden.

Ytterligare resurser

Nästa steg

I den här självstudien testade du ett klassbibliotek. Du kan göra biblioteket tillgängligt för andra genom att publicera det till NuGet som ett paket. Om du vill veta hur du följer en NuGet-självstudie:

Om du publicerar ett bibliotek som ett NuGet-paket kan andra installera och använda det. Om du vill veta hur du följer en NuGet-självstudie:

Ett bibliotek behöver inte distribueras som ett paket. Den kan paketeras med en konsolapp som använder den. Mer information om hur du publicerar en konsolapp finns i den tidigare självstudien i den här serien:

Den här självstudien visar hur du automatiserar enhetstestning genom att lägga till ett testprojekt i en lösning.

Förutsättningar

Skapa ett enhetstestprojekt

Enhetstester ger automatiserad programvarutestning under din utveckling och publicering. MSTest är ett av tre testramverk som du kan välja mellan. De andra är xUnit och nUnit.

  1. Starta Visual Studio.

  2. Öppna lösningen ClassLibraryProjects som du skapade i Skapa ett .NET-klassbibliotek med Visual Studio.

  3. Lägg till ett nytt enhetstestprojekt med namnet "StringLibraryTest" i lösningen.

    1. Högerklicka på lösningen i Solution Explorer och välj Lägg till>nytt projekt.

    2. På sidan Lägg till ett nytt projekt anger du mstest i sökrutan. Välj C# eller Visual Basic i listan Språk och välj sedan Alla plattformar i listan Plattform.

    3. Välj mallen MSTest Test Project och välj sedan Nästa.

    4. På sidan Konfigurera det nya projektet anger du StringLibraryTest i rutan Projektnamn . Välj sedan Nästa.

    5. På sidan Ytterligare information väljer du .NET 6 (långsiktigt stöd) i rutan Framework . Välj sedan Skapa.

  4. Visual Studio skapar projektet och öppnar klassfilen i kodfönstret med följande kod. Om det språk du vill använda inte visas ändrar du språkväljaren överst på sidan.

    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
    

    Källkoden som skapas av enhetstestmallen gör följande:

    Varje metod som taggas med [TestMethod] i en testklass taggad med [TestClass] körs automatiskt när enhetstestet körs.

Lägga till en projektreferens

För att testprojektet ska fungera med StringLibrary klassen lägger du till en referens i StringLibraryTest-projektet i StringLibrary projektet.

  1. Högerklicka noden Beroenden i Projektet StringLibraryTest i Solution Explorer och välj Lägg till projektreferens på snabbmenyn.

  2. I dialogrutan Referenshanteraren expanderar du noden Projekt och markerar rutan bredvid StringLibrary. Genom att lägga till en referens till StringLibrary sammansättningen kan kompilatorn hitta StringLibrary-metoder när stringlibraryTest-projektet kompileras.

  3. Välj OK.

Lägga till och köra enhetstestmetoder

När Visual Studio kör ett enhetstest körs varje metod som är markerad med TestMethodAttribute attributet i en klass som är markerad med TestClassAttribute attributet. En testmetod slutar när det första felet hittas eller när alla tester i metoden har lyckats.

De vanligaste testerna anropar klassens Assert medlemmar. Många kontrollmetoder innehåller minst två parametrar, varav en är det förväntade testresultatet och det andra är det faktiska testresultatet. Några av Assert klassens vanligaste metoder visas i följande tabell:

Assert-metoder Funktion
Assert.AreEqual Verifierar att två värden eller objekt är lika med. Kontrollen misslyckas om värdena eller objekten inte är lika med.
Assert.AreSame Verifierar att två objektvariabler refererar till samma objekt. Kontrollen misslyckas om variablerna refererar till olika objekt.
Assert.IsFalse Verifierar att ett villkor är false. Kontrollen misslyckas om villkoret är true.
Assert.IsNotNull Verifierar att ett objekt inte nullär . Kontrollen misslyckas om objektet är null.

Du kan också använda Assert.ThrowsException metoden i en testmetod för att ange vilken typ av undantag den förväntas generera. Testet misslyckas om det angivna undantaget inte utlöses.

När du testar StringLibrary.StartsWithUpper metoden vill du ange ett antal strängar som börjar med ett versalt tecken. Du förväntar dig att metoden ska returneras true i dessa fall, så att du kan anropa Assert.IsTrue metoden. På samma sätt vill du ange ett antal strängar som börjar med något annat än ett versalt tecken. Du förväntar dig att metoden ska returneras false i dessa fall, så att du kan anropa Assert.IsFalse metoden.

Eftersom biblioteksmetoden hanterar strängar vill du också se till att den hanterar en tom sträng (String.Empty), en giltig sträng som inte har några tecken och vars Length är 0 och en null sträng som inte har initierats. Du kan anropa StartsWithUpper direkt som en statisk metod och skicka ett enda String argument. Eller så kan du anropa StartsWithUpper som en tilläggsmetod för en string variabel som tilldelats till null.

Du definierar tre metoder som var och en anropar en Assert metod för varje element i en strängmatris. Du anropar en metodöverlagring som gör att du kan ange ett felmeddelande som ska visas vid testfel. Meddelandet identifierar strängen som orsakade felet.

Så här skapar du testmetoderna:

  1. I kodfönstret UnitTest1.cs eller UnitTest1.vb ersätter du koden med följande kod:

    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
    

    Testet av versaler i TestStartsWithUpper metoden innehåller den grekiska versaler alfa (U+0391) och kyrilliska versaler EM (U+041C). Testet av gemener i metoden innehåller den grekiska alfabeteckningen TestDoesNotStartWithUpper (U+03B1) och den kyrilliska små bokstaven Ghe (U+0433).

  2. På menyraden väljer du Arkiv>Spara enhetTest1.cs Som eller Filspara>enhetTest1.vb Som. I dialogrutan Spara fil som väljer du pilen bredvid knappen Spara och väljer Spara med kodning.

    Visual Studio Save File As dialog

  3. I dialogrutan Bekräfta Spara som väljer du knappen Ja för att spara filen.

  4. I dialogrutan Avancerade spara alternativ väljer du Unicode (UTF-8 med signatur) – Kodsida 65001 i listrutan Kodning och väljer OK.

    Visual Studio Advanced Save Options dialog

    Om du inte sparar källkoden som en UTF8-kodad fil kan Visual Studio spara den som en ASCII-fil. När det händer avkodar körningen inte UTF8-tecknen utanför ASCII-intervallet korrekt och testresultaten blir inte korrekta.

  5. På menyraden väljer du Testa>Kör alla tester. Om testutforskarens fönster inte öppnas öppnar du det genom att välja Test>testutforskaren. De tre testerna visas i avsnittet Godkänd testning och avsnittet Sammanfattning rapporterar resultatet av testkörningen.

    Test Explorer window with passing tests

Hantera testfel

Om du utför testdriven utveckling (TDD) skriver du tester först och de misslyckas första gången du kör dem. Sedan lägger du till kod i appen som gör att testet lyckas. I den här självstudien har du skapat testet när du har skrivit appkoden som den validerar, så du har inte sett testet misslyckas. Om du vill verifiera att ett test misslyckas när du förväntar dig att det ska misslyckas lägger du till ett ogiltigt värde i testindata.

  1. Ändra matrisen wordsTestDoesNotStartWithUpper i metoden så att den innehåller strängen "Error". Du behöver inte spara filen eftersom Visual Studio automatiskt sparar öppna filer när en lösning skapas för att köra tester.

    string[] words = { "alphabet", "Error", "zebra", "abc", "αυτοκινητοβιομηχανία", "государство",
                       "1234", ".", ";", " " };
    
    Dim words() As String = { "alphabet", "Error", "zebra", "abc", "αυτοκινητοβιομηχανία", "государство",
                       "1234", ".", ";", " " }
    
    
  2. Kör testet genom att välja Testa>kör alla tester på menyraden. Fönstret Testutforskaren anger att två tester lyckades och ett misslyckades.

    Test Explorer window with failing tests

  3. Välj det misslyckade testet. TestDoesNotStartWith

    I fönstret Testutforskaren visas meddelandet som skapats av kontrollen: "Assert.IsFalse failed. Förväntas för "Error": false; actual: True". På grund av felet har inga strängar i matrisen efter att "Fel" testats.

    Test Explorer window showing the IsFalse assertion failure

  4. Ta bort strängen "Fel" som du lade till i steg 1. Kör testet igen och testerna godkänns.

Testa versionen av biblioteket

Nu när testerna har godkänts när du kör felsökningsversionen av biblioteket kör du testerna ytterligare en gång mot versionsversionen av biblioteket. Ett antal faktorer, inklusive kompilatoroptimeringar, kan ibland ge olika beteende mellan felsöknings- och versionsversioner.

Så här testar du versionsversionen:

  1. I Visual Studio-verktygsfältet ändrar du byggkonfigurationen från Felsökning till Version.

    Visual Studio toolbar with release build highlighted

  2. Högerklicka Projektet StringLibrary i Solution Explorer och välj Skapa på snabbmenyn för att kompilera om biblioteket.

    StringLibrary context menu with build command

  3. Kör enhetstesterna genom att välja Testa>kör alla tester från menyraden. Testerna godkänns.

Felsöka tester

Om du använder Visual Studio som din IDE kan du använda samma process som visas i Självstudie: Felsöka ett .NET-konsolprogram med Visual Studio för att felsöka kod med hjälp av ditt enhetstestprojekt. I stället för att starta ShowCase-appprojektet högerklickar du på projektet StringLibraryTests och väljer Felsöka tester på snabbmenyn.

Visual Studio startar testprojektet med felsökningsprogrammet kopplat. Körningen stoppas vid alla brytpunkter som du har lagt till i testprojektet eller den underliggande bibliotekskoden.

Ytterligare resurser

Nästa steg

I den här självstudien testade du ett klassbibliotek. Du kan göra biblioteket tillgängligt för andra genom att publicera det till NuGet som ett paket. Om du vill veta hur du följer en NuGet-självstudie:

Om du publicerar ett bibliotek som ett NuGet-paket kan andra installera och använda det. Om du vill veta hur du följer en NuGet-självstudie:

Ett bibliotek behöver inte distribueras som ett paket. Den kan paketeras med en konsolapp som använder den. Mer information om hur du publicerar en konsolapp finns i den tidigare självstudien i den här serien: