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.
Skapa enhetstester som hjälper dig att hålla koden korrekt genom inkrementella kodändringar. Det finns flera ramverk som du kan använda för att skriva enhetstester, inklusive några som utvecklats av tredje part. Vissa testramverk är specialiserade för testning på olika språk eller plattformar. Test Explorer tillhandahåller ett enda gränssnitt för enhetstester i något av dessa ramverk. Mer information om Test Explorer finns i Kör enhetstester med testutforskaren och Vanliga frågor och svar om Testutforskaren.
Den här artikeln visar hur du utvecklar en testad metod i C# med hjälp av Microsoft Test Framework (MSTest). Du kan enkelt anpassa den för andra språk eller andra testramverk, till exempel NUnit. Mer information finns i Installera testramverk från tredje part.
Skapa ett test och generera kod
Skapa ett C# -klassbiblioteksprojekt för .NET eller .NET Standard. Det här projektet innehåller den kod som vi vill testa. Ge projektet namnet MyMath.
I samma lösning lägger du till ett nytt MSTest-testprojekt för .NET.
I Visual Studio 2019 version 16.9 är namnet på MSTest-projektmallen Unit Test Project.
Ge testprojektet namnet MathTests.
I testprojektet skriver du en enkel testmetod som verifierar resultatet som erhålls för en specifik indata. Lägg till följande kod i
Test1klassen ellerUnitTest1:[TestMethod] public void BasicRooterTest() { // Create an instance to test: Rooter rooter = new Rooter(); // Define a test input and output value: double expectedResult = 2.0; double input = expectedResult * expectedResult; // Run the method under test: double actualResult = rooter.SquareRoot(input); // Verify the result: Assert.AreEqual(expectedResult, actualResult, delta: expectedResult / 100); }Generera en typ från testkoden.
Placera markören på
Rooteroch öppna sedan glödlampans meny.Välj Generera ny typ.
Välj Generera typ Rooter>Generera ny typ.
I dialogrutan Generera typ anger du Projekt till MyMath, klassbiblioteksprojektet, och väljer sedan OK.
Generera en metod från testkoden. Placera markören på
SquareRootoch välj sedan Generera metoden "SquareRoot" eller Generera metoden "Rooter.SquareRoot" från menyn glödlampa.Kör enhetstestet.
Öppna Testutforskaren.
Om du vill öppna TestUtforskaren på testmenyn väljer du Testutforskaren.
Om du vill öppna Test Explorer på testmenyn väljer du Windows>Test Explorer.
I Testutforskaren väljer du knappen Kör alla för att köra testet.
Lösningen byggs och testet körs och misslyckas.
Välj namnet på testet.
Information om testet visas i fönstret Sammanfattning av testinformation .
Välj den översta länken under Stack Trace för att gå till den plats där testet misslyckades.
Nu har du skapat ett test och en stub som du kan ändra så att testet godkänns.
Verifiera en kodändring
I filen Class1.cs förbättrar du koden
SquareRootför :public double SquareRoot(double input) { return input / 2; }I TestUtforskaren väljer du Kör alla.
Lösningen byggs och testet körs och godkänns.
Utöka inmatningsomfång
För att förbättra vårt förtroende för att koden fungerar i alla fall lägger du till tester som provar ett bredare intervall med indatavärden.
Tips/Råd
Undvik att ändra befintliga tester som godkänns. Lägg i stället till nya tester. Ändra endast befintliga tester när användarkraven ändras. Den här principen hjälper dig att se till att du inte förlorar befintliga funktioner när du arbetar med att utöka koden.
I testklassen lägger du till följande test, som provar ett intervall med indatavärden:
[TestMethod] public void RooterValueRange() { // Create an instance to test. Rooter rooter = new Rooter(); // Try a range of values. for (double expected = 1e-8; expected < 1e+8; expected *= 3.2) { RooterOneValue(rooter, expected); } } private void RooterOneValue(Rooter rooter, double expectedResult) { double input = expectedResult * expectedResult; double actualResult = rooter.SquareRoot(input); Assert.AreEqual(expectedResult, actualResult, delta: expectedResult / 1000); }I TestUtforskaren väljer du Kör alla.
Det nya testet misslyckas (även om det första testet fortfarande godkänns). Om du vill hitta felpunkten väljer du det misslyckade testet och tittar sedan på informationen i fönstret Sammanfattning av testinformation .
Granska metoden under test för att se vad som kan vara fel. Ändra
SquareRoot-koden enligt följande:public double SquareRoot(double input) { double result = input; double previousResult = -input; while (Math.Abs(previousResult - result) > result / 1000) { previousResult = result; result = result - (result * result - input) / (2 * result); } return result; }I TestUtforskaren väljer du Kör alla.
Båda testerna godkänns nu.
Lägga till tester för undantagsfall
Lägg till ett nytt test för negativa indata:
[TestMethod] public void RooterTestNegativeInput() { Rooter rooter = new Rooter(); Assert.ThrowsException<ArgumentOutOfRangeException>(() => rooter.SquareRoot(-1)); }I TestUtforskaren väljer du Kör alla.
Det nya testet misslyckas.
Om metoden som testas går i loopar, väljer du Avbryt på verktygsfältet i Test Explorer. Testet slutar att köras och misslyckas.
SquareRootÅtgärda koden genom att lägga till följandeifinstruktion i början av metoden:public double SquareRoot(double input) { if (input <= 0.0) { throw new ArgumentOutOfRangeException(); } ...I TestUtforskaren väljer du Kör alla.
Alla tester godkänns.
Omstrukturera den koden som testas
Omstrukturera koden, men ändra inte testerna.
Tips/Råd
En refaktorisering är en ändring som är avsedd att göra koden bättre eller enklare att förstå. Det är inte avsett att ändra kodens beteende och därför ändras inte testerna.
Vi rekommenderar att du utför refaktoriseringssteg separat från steg som utökar funktionaliteten. Att hålla testerna oförändrade ger dig förtroende för att du inte oavsiktligt har introducerat buggar vid refaktorisering.
Ändra raden enligt följande som beräknar
resultiSquareRootmetoden:public double SquareRoot(double input) { if (input <= 0.0) { throw new ArgumentOutOfRangeException(); } double result = input; double previousResult = -input; while (Math.Abs(previousResult - result) > result / 1000) { previousResult = result; result = (result + input / result) / 2; //was: result = result - (result * result - input) / (2*result); } return result; }Välj Kör alla och kontrollera att alla tester fortfarande godkänns.