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.
I den här självstudien får du en interaktiv upplevelse när du skapar en exempellösning steg för steg för att lära dig enhetstestningskoncept. Om du föredrar att följa självstudien med hjälp av en färdig lösning visa eller ladda ned exempelkoden innan du börjar. Instruktioner för nedladdning finns i Exempelfiler och Handledningar.
Den här artikeln handlar om att testa ett .NET Core-projekt. Om du testar ett ASP.NET Core-projekt, se Integrationstester i ASP.NET Core.
Skapa källprojektet
Öppna ett gränssnittsfönster. Skapa en katalog med namnet unit-testing-with-fsharp för att lagra lösningen.
I den här nya katalogen kör du dotnet new sln för att skapa en ny lösning. Det gör det enklare att hantera både klassbiblioteket och enhetstestprojektet.
I lösningskatalogen skapar du en katalog för MathService. Katalogen och filstrukturen hittills visas nedan:
/unit-testing-with-fsharp
unit-testing-with-fsharp.sln
/MathService
Gör MathService den aktuella katalogen och kör dotnet new classlib -lang "F#" för att skapa källprojektet. Du skapar en misslyckad implementering av matematiktjänsten:
module MyMath =
let squaresOfOdds xs = raise (System.NotImplementedException("You haven't written a test yet!"))
Ändra tillbaka katalogen till katalogen unit-testing-with-fsharp. Kör dotnet sln add .\MathService\MathService.fsproj för att lägga till klassbiblioteksprojektet i lösningen.
Skapa testprojektet
Skapa sedan katalogen MathService.Tests. Följande disposition visar katalogstrukturen:
/unit-testing-with-fsharp
unit-testing-with-fsharp.sln
/MathService
Source Files
MathService.fsproj
/MathService.Tests
Gör MathService.Tests katalogen till den aktuella katalogen och skapa ett nytt projekt med hjälp av dotnet new mstest -lang "F#". Detta skapar ett testprojekt som använder MSTest som testramverk. Den genererade mallen konfigurerar testköraren i MathServiceTests.fsproj:
<ItemGroup>
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="15.3.0-preview-20170628-02" />
<PackageReference Include="MSTest.TestAdapter" Version="1.1.18" />
<PackageReference Include="MSTest.TestFramework" Version="1.1.18" />
</ItemGroup>
Testprojektet kräver andra paket för att skapa och köra enhetstester.
dotnet new i föregående steg lade till MSTest. Lägg nu till MathService-klassbiblioteket som ett annat beroende till projektet. Använd kommandot dotnet reference add:
dotnet reference add ../MathService/MathService.fsproj
Du kan se hela filen i -exempelarkivet på GitHub.
Du har följande slutgiltiga lösningslayout:
/unit-testing-with-fsharp
unit-testing-with-fsharp.sln
/MathService
Source Files
MathService.fsproj
/MathService.Tests
Test Source Files
MathServiceTests.fsproj
Kör dotnet sln add .\MathService.Tests\MathService.Tests.fsproj i katalogen unit-testing-with-fsharp.
Skapa det första testet
Du skriver ett misslyckat test, gör det godkänt och upprepar sedan processen. Öppna Tests.fs och lägg till följande kod:
namespace MathService.Tests
open System
open Microsoft.VisualStudio.TestTools.UnitTesting
open MathService
[<TestClass>]
type TestClass () =
[<TestMethod>]
member this.TestMethodPassing() =
Assert.IsTrue(true)
[<TestMethod>]
member this.FailEveryTime() = Assert.IsTrue(false)
Attributet [<TestClass>] anger en klass som innehåller tester. Attributet [<TestMethod>] anger en testmetod som körs av testlöparen. Från katalogen unit-testing-with-fsharp kör du dotnet test för att skapa testerna och klassbiblioteket och sedan köra testerna. MSTest-testlöparen innehåller programmets startpunkt för att köra dina tester.
dotnet test startar testrunnern med det enhetstestprojekt du har skapat.
De här två testerna visar de mest grundläggande godkända och underkända testerna.
My test passerar och Fail every time misslyckas. Skapa nu ett test för metoden squaresOfOdds. Metoden squaresOfOdds returnerar en lista över kvadraterna för alla udda heltalsvärden som ingår i indatasekvensen. I stället för att försöka skriva alla dessa funktioner samtidigt kan du iterativt skapa tester som validerar funktionerna. Att göra varje testpass innebär att skapa nödvändiga funktioner för metoden.
Det enklaste testet vi kan skriva är att anropa squaresOfOdds med alla jämna tal, där resultatet ska vara en tom sekvens med heltal. Här är testet:
[<TestMethod>]
member this.TestEvenSequence() =
let expected = Seq.empty<int> |> Seq.toList
let actual = MyMath.squaresOfOdds [2; 4; 6; 8; 10]
Assert.AreEqual(expected, actual)
Observera att expected-sekvensen har konverterats till en lista. MSTest-biblioteket förlitar sig på många standardtyper av .NET. Beroendet innebär att ditt offentliga gränssnitt och förväntade resultat stöder ICollection i stället för IEnumerable.
När du kör testet ser du att testet misslyckas. Du har inte skapat implementeringen än. Gör det här testet genom att skriva den enklaste koden i klassen Mathservice som fungerar:
let squaresOfOdds xs =
Seq.empty<int> |> Seq.toList
Kör igen i katalogen dotnet test. Kommandot dotnet test kör en version för MathService-projektet och sedan för MathService.Tests-projektet. Efter att båda projekten har byggts körs det enskilda testet. Det går över.
Uppfylla kraven
Nu när du har gjort ett testpass är det dags att skriva mer. Nästa enkla fall fungerar med en sekvens vars enda udda tal är 1. Talet 1 är enklare eftersom kvadraten 1 är 1. Här är nästa test:
[<TestMethod>]
member public this.TestOnesAndEvens() =
let expected = [1; 1; 1; 1]
let actual = MyMath.squaresOfOdds [2; 1; 4; 1; 6; 1; 8; 1; 10]
Assert.AreEqual(expected, actual)
Att köra dotnet test misslyckas i det nya testet. Du måste uppdatera metoden squaresOfOdds för att hantera det nya testet. Du måste filtrera bort alla jämna tal från sekvensen för att det här testet ska gå igenom. Du kan göra det genom att skriva en liten filterfunktion och använda Seq.filter:
let private isOdd x = x % 2 <> 0
let squaresOfOdds xs =
xs
|> Seq.filter isOdd |> Seq.toList
Observera anropet till Seq.toList. Då skapas en lista som implementerar ICollection-gränssnittet.
Det finns ytterligare ett steg att gå: upphöj varje udda tal till kvadrat. Börja med att skriva ett nytt test:
[<TestMethod>]
member public this.TestSquaresOfOdds() =
let expected = [1; 9; 25; 49; 81]
let actual = MyMath.squaresOfOdds [1; 2; 3; 4; 5; 6; 7; 8; 9; 10]
Assert.AreEqual(expected, actual)
Du kan åtgärda testet genom att skicka den filtrerade sekvensen via en mappningsoperation för att beräkna kvadraten för varje udda tal.
let private square x = x * x
let private isOdd x = x % 2 <> 0
let squaresOfOdds xs =
xs
|> Seq.filter isOdd
|> Seq.map square
|> Seq.toList
Du har skapat ett litet bibliotek och en uppsättning enhetstester för biblioteket. Du har strukturerat lösningen så att tillägg av nya paket och tester är en del av det normala arbetsflödet. Du har koncentrerat dig mest på att lösa programmets mål.