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 du kan välja mellan. De andra är xUnit och nUnit.

  1. Starta Visual Studio.

  2. Öppna den ClassLibraryProjects lösning 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 ditt nya projekt anger du StringLibraryTest i rutan Projektnamn. Välj sedan Nästa.

    5. På sidan Ytterligare information väljer du .NET 8 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 klassen StringLibrary lägger du till en referens i projektet StringLibraryTest i StringLibrary-projektet.

  1. I Solution Explorerhögerklickar du på noden Beroenden i projektet StringLibraryTest och väljer Lägg till projektreferens på snabbmenyn.

  2. I dialogrutan Reference Manager expanderar du noden Projects och markerar kryssrutan 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 attributet TestMethodAttribute i en klass som är markerad med attributet TestClassAttribute. En testmetod slutar när det första felet hittas eller när alla tester i metoden har lyckats.

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 Funktion
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 metoden Assert.ThrowsException (eller Assert.Throws och Assert.ThrowsExactly om du använder MSTest 3.8 och senare) i en testmetod för att ange vilken typ av undantag det förväntas generera. Testet misslyckas om det angivna undantaget inte utlöses.

När du testar metoden StringLibrary.StartsWithUpper 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), 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 på en string variabel som tilldelats null.

Du definierar tre metoder som var och en anropar en Assert-metod för varje element i en strängmatris. Du kallar på en metodöverbelastning så att du kan ange ett felmeddelande som ska visas i händelse av 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 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 UnitTest1.cs som eller Arkiv>Spara UnitTest1.vb som. I dialogrutan Spara fil som väljer du pilen bredvid knappen Spara och väljer Spara med kodning.

    dialogrutan Spara fil som i Visual Studio

  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.

    dialogrutan Avancerade alternativ för att spara i Visual Studio

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

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

  3. Välj det misslyckade testet TestDoesNotStartWith.

    Fönstret Test Explorer visar meddelandet som skapades av påståendet: "Assert.IsFalse failed." Förväntat för 'Error': falskt; faktiskt: sant. På grund av felet testades inga strängar i matrisen efter "Fel".

    Test Explorer-fönstret som visar IsFalse-satsfel

  4. Ta bort strängen "Fel" som du lade till i steg 1. 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-versionen av biblioteket ska du köra testerna en gång till mot Release-versionen 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 Visual Studio-verktygsfältet ändrar du versionskonfigurationen från Felsöka till Release.

    Visual Studio-verktygsfältet med release-builden markerad

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

    kontextmenyn StringLibrary med bygg-kommandot

  3. Kör enhetstesterna genom att välja Test>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ökningstester på snabbmenyn.

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

Ytterligare resurser

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: