Anteckning
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
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 handledningen använder lösningen som du skapar i Skapa ett .NET-klassbibliotek med Visual Studio.
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.
Starta Visual Studio.
Öppna den
ClassLibraryProjectslösning 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 ditt nya projekt anger du StringLibraryTest i rutan Projektnamn. Välj sedan Nästa.
På sidan Ytterligare information väljer du .NET 8 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 NamespaceKällkoden som skapas av enhetstestmallen gör följande:
-
Microsoft.VisualStudio.TestTools.UnitTesting Importerar 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. - Tillämpar det TestClassAttribute-attributet på
UnitTest1-klassen. - Använder attributet TestMethodAttribute för att definiera
TestMethod1i C# ellerTestSubi Visual Basic.
Varje metod som taggas med [TestMethod] i en testklass taggad med [TestClass] körs automatiskt när enhetstestet körs.
-
Microsoft.VisualStudio.TestTools.UnitTesting Importerar 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 klassen StringLibrary lägger du till en referens i projektet StringLibraryTest i StringLibrary-projektet.
I Solution Explorerhögerklickar du på noden Beroenden i projektet StringLibraryTest och väljer Lägg till projektreferens på snabbmenyn.
I dialogrutan Reference Manager expanderar du noden Projects och markerar kryssrutan bredvid StringLibrary. Genom att lägga till en referens till
StringLibrarysammansä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 har markerats TestClassAttribute med attributet. 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 | 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 StringLibrary.StartsWithUpper metoden vill du ange många 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 många 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. Anropa StartsWithUpper direkt som en statisk metod och skicka ett enda String argument. Eller anropa StartsWithUpper som en tilläggsmetod för en string variabel som tilldelats till null.
Definiera tre metoder som var och en anropar en Assert metod för varje element i en strängmatris. Anropa 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, $"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 NamespaceTestet av versaler i metoden
TestStartsWithUpperinnehåller den grekiska versalen alfa (U+0391) och den kyrilliska versalen EM (U+041C). Testet av gemener i metodenTestDoesNotStartWithUpperinnehåller den grekiska alfabeteckningen (U+03B1) och den kyrilliska små bokstaven Ghe (U+0433).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.
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 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.
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.
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
words-matrisen i metodenTestDoesNotStartWithUpperså 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", ".", ";", " " }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.
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".
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, kör testerna en gång till mot Release-versionen av biblioteket. Vissa faktorer, inklusive kompilatoroptimeringar, kan ibland ge olika beteende mellan felsökningsversioner och versionsversioner.
Så här testar du releaseversionen:
I Visual Studio-verktygsfältet ändrar du versionskonfigurationen från Felsöka till Release.
I Solution Explorerhögerklickar du på projektet StringLibrary och väljer Skapa på snabbmenyn för att kompilera om biblioteket.
kontextmenyn
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 valfri brytpunkt som du har lagt till i testprojektet eller den underliggande bibliotekskoden.
Ytterligare resurser
- Grunderna för enhetstester i - Visual Studio
- Enhetstestning i .NET
Nästa steg
I den här handledningen enhetstestade du ett klassbibliotek. Gör 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: