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
- Den här självstudien fungerar med lösningen som du skapar i Skapa ett .NET-klassbibliotek med hjälp av Visual Studio.
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.
Starta Visual Studio.
Öppna lösningen
ClassLibraryProjects
som du skapade i Skapa ett .NET-klassbibliotek med Visual Studio.Lägg till ett nytt enhetstestprojekt med namnet "StringLibraryTest" i lösningen.
Högerklicka på lösningen i Solution Explorer och välj Lägg till>nytt projekt.
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.
Välj mallen MSTest Test Project och välj sedan Nästa.
På sidan Konfigurera det nya projektet anger du StringLibraryTest i rutan Projektnamn . Välj sedan Nästa.
På sidan Ytterligare information väljer du .NET 8 (förhandsversion) i rutan Framework . Välj sedan Skapa.
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:
- Den importerar Microsoft.VisualStudio.TestTools.UnitTesting namnområdet, som innehåller de typer som används för enhetstestning. I C#importeras namnområdet via ett
global using
direktiv i GlobalUsings.cs. - Det tillämpar TestClassAttribute attributet på
UnitTest1
klassen. - Det tillämpar attributet TestMethodAttribute för att definiera
TestMethod1
i C# ellerTestSub
i Visual Basic.
Varje metod som taggas med [TestMethod] i en testklass taggad med [TestClass] körs automatiskt när enhetstestet körs.
- Den importerar Microsoft.VisualStudio.TestTools.UnitTesting namnområdet, som innehåller de typer som används för enhetstestning. I C#importeras namnområdet via ett
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.
Högerklicka på noden Beroenden i Projektet StringLibraryTest i Solution Explorer och välj Lägg till projektreferens på snabbmenyn.
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.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:
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 alfabeteckningenTestDoesNotStartWithUpper
(U+03B1) och den kyrilliska små bokstaven Ghe (U+0433).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.
I dialogrutan Bekräfta Spara som väljer du knappen Ja för att spara filen.
I dialogrutan Avancerade spara alternativ väljer du Unicode (UTF-8 med signatur) – Kodsida 65001 i listrutan Kodning och väljer OK.
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.
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.
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.
Ändra matrisen
words
TestDoesNotStartWithUpper
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", ".", ";", " " }
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.
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.
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:
I Visual Studio-verktygsfältet ändrar du byggkonfigurationen från Felsökning till Version.
Högerklicka på Projektet StringLibrary i Solution Explorer och välj Skapa på snabbmenyn för att kompilera om biblioteket.
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
- Den här självstudien fungerar med lösningen som du skapar i Skapa ett .NET-klassbibliotek med hjälp av Visual Studio.
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.
Starta Visual Studio.
Öppna lösningen
ClassLibraryProjects
som du skapade i Skapa ett .NET-klassbibliotek med Visual Studio.Lägg till ett nytt enhetstestprojekt med namnet "StringLibraryTest" i lösningen.
Högerklicka på lösningen i Solution Explorer och välj Lägg till>nytt projekt.
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.
Välj mallen MSTest Test Project och välj sedan Nästa.
På sidan Konfigurera det nya projektet anger du StringLibraryTest i rutan Projektnamn . Välj sedan Nästa.
På sidan Ytterligare information väljer du .NET 7 (Standard-term support) i rutan Framework . Välj sedan Skapa.
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:
- Den importerar Microsoft.VisualStudio.TestTools.UnitTesting namnområdet, som innehåller de typer som används för enhetstestning.
- Det tillämpar TestClassAttribute attributet på
UnitTest1
klassen. - Det tillämpar attributet TestMethodAttribute för att definiera
TestMethod1
i C# ellerTestSub
i Visual Basic.
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.
Högerklicka på noden Beroenden i Projektet StringLibraryTest i Solution Explorer och välj Lägg till projektreferens på snabbmenyn.
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.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:
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 alfabeteckningenTestDoesNotStartWithUpper
(U+03B1) och den kyrilliska små bokstaven Ghe (U+0433).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.
I dialogrutan Bekräfta Spara som väljer du knappen Ja för att spara filen.
I dialogrutan Avancerade spara alternativ väljer du Unicode (UTF-8 med signatur) – Kodsida 65001 i listrutan Kodning och väljer OK.
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.
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.
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.
Ändra matrisen
words
TestDoesNotStartWithUpper
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", ".", ";", " " }
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.
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.
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:
I Visual Studio-verktygsfältet ändrar du byggkonfigurationen från Felsökning till Version.
Högerklicka på Projektet StringLibrary i Solution Explorer och välj Skapa på snabbmenyn för att kompilera om biblioteket.
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
- Den här självstudien fungerar med lösningen som du skapar i Skapa ett .NET-klassbibliotek med hjälp av Visual Studio.
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.
Starta Visual Studio.
Öppna lösningen
ClassLibraryProjects
som du skapade i Skapa ett .NET-klassbibliotek med Visual Studio.Lägg till ett nytt enhetstestprojekt med namnet "StringLibraryTest" i lösningen.
Högerklicka på lösningen i Solution Explorer och välj Lägg till>nytt projekt.
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.
Välj mallen MSTest Test Project och välj sedan Nästa.
På sidan Konfigurera det nya projektet anger du StringLibraryTest i rutan Projektnamn . Välj sedan Nästa.
På sidan Ytterligare information väljer du .NET 6 (långsiktigt stöd) i rutan Framework . Välj sedan Skapa.
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:
- Den importerar Microsoft.VisualStudio.TestTools.UnitTesting namnområdet, som innehåller de typer som används för enhetstestning.
- Det tillämpar TestClassAttribute attributet på
UnitTest1
klassen. - Det tillämpar attributet TestMethodAttribute för att definiera
TestMethod1
i C# ellerTestSub
i Visual Basic.
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.
Högerklicka på noden Beroenden i Projektet StringLibraryTest i Solution Explorer och välj Lägg till projektreferens på snabbmenyn.
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.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:
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 alfabeteckningenTestDoesNotStartWithUpper
(U+03B1) och den kyrilliska små bokstaven Ghe (U+0433).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.
I dialogrutan Bekräfta Spara som väljer du knappen Ja för att spara filen.
I dialogrutan Avancerade spara alternativ väljer du Unicode (UTF-8 med signatur) – Kodsida 65001 i listrutan Kodning och väljer OK.
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.
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.
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.
Ändra matrisen
words
TestDoesNotStartWithUpper
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", ".", ";", " " }
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.
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.
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:
I Visual Studio-verktygsfältet ändrar du byggkonfigurationen från Felsökning till Version.
Högerklicka på Projektet StringLibrary i Solution Explorer och välj Skapa på snabbmenyn för att kompilera om biblioteket.
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: