Dela via


Självstudie: Testa ett .NET-klassbibliotek

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

Förutsättningar

Den här självstudien fungerar med den lösning som du skapar i Skapa ett .NET-klassbibliotek.

Skapa ett enhetstestprojekt

Enhetstester ger automatiserad programvarutestning under din utveckling och publicering. MSTest är ett av tre testramverk 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.

  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 ditt nya projekt anger du StringLibraryTest i rutan Projektnamn. Välj sedan Nästa.

    5. På sidan Additional information väljer du .NET 10 i rutan Framework välj Microsoft.Testing.Platform för Test runner och välj sedan Create.

    Ange ytterligare information för MSTest Test Project

  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 sealed class Test1
        {
            [TestMethod]
            public void TestMethod1()
            {
            }
        }
    }
    
    Imports Microsoft.VisualStudio.TestTools.UnitTesting
    
    Namespace StringLibraryTest
        <TestClass>
        Public Class Test1
            <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.

  1. Starta Visual Studio Code.

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

  3. Från Solution Explorer väljer du Nytt projekt eller från kommandopaletten väljer du .NET: Nytt projekt.

  4. Välj MSTest Test Project, ge det namnet "StringLibraryTest", välj standardkatalogen och välj Skapa projekt.

    Projektmallen skapar StringLibraryTest/Test1.cs med följande kod:

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

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

  1. Öppna terminalen och gå till mappen tutorials som innehåller projekten StringLibrary och ShowCase.

  2. Skapa ett nytt MSTest-testprojekt:

    dotnet new mstest -n StringLibraryTest
    

    Projektmallen skapar StringLibraryTest/Test1.cs med följande kod:

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

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

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. I Solution Explorer högerklickar du på noden Dependencies i noden StringLibraryTest och väljer Lägg till projektreferens på snabbmenyn.

  2. I dialogrutan Referenshanteraren väljer du rutan bredvid StringLibrary.

    Lägg till StringLibrary som projektreferens för StringLibraryTest.

  3. Välj OK.

  1. Högerklicka på projektet StringLibraryTest i Solution Explorer och välj Lägg till projektreferens.

  2. Välj "StringLibrary".

  1. Gå till mappen StringLibraryTest och lägg till projektreferensen:

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

Lägga till och köra enhetstestmetoder

När ett enhetstest körs körs varje metod som markerats med TestMethodAttribute attributet i en klass som markerats med TestClassAttribute attributet automatiskt. En testmetod slutar när det första felet hittas eller när alla tester som ingår i metoden lyckas.

De vanligaste testerna anropar medlemmar i klassen Assert. 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 Function
Assert.AreEqual Verifierar att två värden eller objekt är lika med. Kontrolluttrycket misslyckas om värdena eller objekten inte är lika.
Assert.AreSame Verifierar att två objektvariabler refererar till samma objekt. Asserten misslyckas om variablerna refererar till olika objekt.
Assert.IsFalse Verifierar att ett villkor är false. Påståendet misslyckas om villkoret är sant true.
Assert.IsNotNull Verifierar att ett objekt inte är null. Satsen misslyckas om objektet är null.

Du kan också använda Assert.Throws 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 returnerar true i dessa fall, så att du kan anropa metoden Assert.IsTrue. 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 returnerar false i dessa fall, så att du kan anropa metoden Assert.IsFalse.

Eftersom biblioteksmetoden hanterar strängar vill du också se till att den hanterar en tom sträng (String.Empty) och en null sträng. En tom sträng är en sträng som inte har några tecken och vars Length är 0. En null sträng är en 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 Test1.cs eller Test1.vb ersätter du koden med följande kod:

    using UtilityLibraries;
    
    namespace StringLibraryTest
    {
        [TestClass]
        public sealed class Test1
        {
            [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, $"Expected for '{word}': true; Actual: {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, $"Expected for '{word}': false; Actual: {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, $"Expected for '{word ?? "<null>"}': false; Actual: {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 metoden TestStartsWithUpper innehåller den grekiska versalen alfa (U+0391) och den kyrilliska versalen EM (U+041C). Testet av gemener i metoden TestDoesNotStartWithUpper innehåller den grekiska alfabeteckningen (U+03B1) och den kyrilliska små bokstaven Ghe (U+0433).

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

  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 från listrutan Kodning och väljer OK.

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

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

    Testutforskare med godkända tester

  1. Öppna StringLibraryTest/Test1.cs och ersätt all kod med följande kod.

    using UtilityLibraries;
    
    namespace StringLibraryTest
    {
        [TestClass]
        public sealed class Test1
        {
            [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, $"Expected for '{word}': true; Actual: {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, $"Expected for '{word}': false; Actual: {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, $"Expected for '{word ?? "<null>"}': false; Actual: {result}");
                }
            }
        }
    }
    

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

  2. Spara dina ändringar.

Skapa och köra dina tester

  1. I Solution Explorer högerklickar du på lösningen och väljer Build eller från kommandopaletten och väljer .NET: Build.

  2. Välj fönstret Testning , välj Kör tester eller från kommandopaletten och välj Test: Kör alla tester.

    Visual Studio Code Test Explorer

  1. Öppna StringLibraryTest/Test1.cs och ersätt all kod med följande kod:

    using UtilityLibraries;
    
    namespace StringLibraryTest
    {
        [TestClass]
        public sealed class Test1
        {
            [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, $"Expected for '{word}': true; Actual: {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, $"Expected for '{word}': false; Actual: {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, $"Expected for '{word ?? "<null>"}': false; Actual: {result}");
                }
            }
        }
    }
    

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

  2. Spara ändringarna och kör testerna:

    dotnet test
    

    Testerna bör klara sig.

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 words-matrisen i metoden TestDoesNotStartWithUpper så att strängen "Error" inkluderas.

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

    Testutforskare-fönstret med misslyckade tester

  2. Välj det misslyckade testet TestDoesNotStartWith.

    Fönstret Test Explorer visar meddelandet som skapades av påståendet: "Assert.IsFalse failed." Förväntas för "Fel": false; faktiskt: true. På grund av felet testades inte strängarna i matrisen efter "Fel".

    Test Explorer-fönstret som visar IsFalse-satsfel

  1. Kör testerna genom att klicka på det gröna felet bredvid testet i redigeraren.

    Utdata visar att testet misslyckas och det innehåller ett felmeddelande för det misslyckade testet: "Assert.IsFalse failed. Förväntas för "Error": false; faktiskt: sant. På grund av felet testades inga strängar i matrisen efter "Fel".

    Visual Studio Code misslyckades

  1. Kör testerna:

    dotnet test
    

    Utdata visar att testet misslyckas och det innehåller ett felmeddelande för det misslyckade testet: "Assert.IsFalse failed. Förväntas för "Error": false; faktiskt: sant. På grund av felet testades inga strängar i matrisen efter "Fel".

  1. Ta bort strängen "Fel" som du lade till.

  2. Kör om testet, och testerna blir godkända.

Testa utgåvan av biblioteket

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

Så här testar du releaseversionen:

  1. I verktygsfältet Visual Studio ändrar du build-konfigurationen från Debug till Release.

  2. I Solution Explorer högerklickar du på projektet StringLibrary och väljer Build på snabbmenyn för att kompilera om biblioteket.

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

Kör testerna med Release-byggkonfigurationen.

dotnet test StringLibraryTest/StringLibraryTest.csproj --configuration Release

Testerna godkänns.

Kör testerna med Release-byggkonfigurationen.

dotnet test --configuration Release

Testerna godkänns.

Felsöka tester

Om du använder Visual Studio som din IDE kan du använda samma process som visas i Tutorial: Felsöka ett .NET konsolprogram 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ökningstester på snabbmenyn.

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

Om du använder Visual Studio Code som din IDE kan du använda samma process som visas i Felsöka ett .NET-konsolprogram för att felsöka kod med hjälp av ditt enhetstestprojekt. I stället för att starta ShowCase-appprojektet öppnar du StringLibraryTest/Test1.cs och väljer Felsöka tester i den aktuella filen mellan raderna 7 och 8. Om du inte hittar den trycker du på Ctrl+Skift+P för att öppna kommandopaletten och anger Läs in fönstret igen.

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

Rensa resurser

GitHub tar automatiskt bort kodområdet efter 30 dagars inaktivitet. Om du planerar att utforska fler guider i denna serie kan du låta ditt Codespace vara aktivt. Om du är redo att besöka webbplatsen .NET för att ladda ned .NET SDK kan du ta bort ditt Codespace. Om du vill ta bort ditt Codespace öppnar du ett webbläsarfönster och navigerar till dina Codespaces. Du ser en lista över dina kodområden i fönstret. Välj de tre punkterna (...) i inlägget för handledningens kodområde. Välj sedan "Ta bort".

Nästa steg

I den här handledningen enhetstestade du ett klassbibliotek. Du kan göra biblioteket tillgängligt för andra genom att publicera det till NuGet som ett paket. För att lära dig hur, följ en NuGet-handledning:

Om du publicerar ett bibliotek som ett NuGet-paket kan andra installera och använda det. För att lära dig hur, följ en NuGet-handledning:

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: