Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
In deze tutorial wordt u stapsgewijs begeleid bij het bouwen van een voorbeeldoplossing om concepten van unit testing te leren. Als u liever de zelfstudie volgt met behulp van een vooraf samengestelde oplossing, bekijkt of downloadt u de voorbeeldcode voordat u begint. Zie Voorbeelden en zelfstudies voor downloadinstructies.
Dit artikel gaat over het testen van een .NET Core-project. Als u een ASP.NET Core-project aan het testen bent, zie Integratietests in ASP.NET Core.
Vereiste voorwaarden
- .NET 8 SDK of latere versies.
- Een teksteditor of code-editor naar keuze.
Het bronproject maken
Open een shellvenster. Maak een map met de naam unit-testing-with-fsharp om de oplossing te bewaren. Voer in deze nieuwe map de volgende opdracht uit om een nieuw oplossingsbestand voor de klassebibliotheek en het testproject te maken:
dotnet new sln
Maak vervolgens een map MathService. In het volgende overzicht ziet u de map- en bestandsstructuur tot nu toe:
/unit-testing-with-fsharp
unit-testing-with-fsharp.sln
/MathService
Maak MathService de huidige map en voer de volgende opdracht uit om het bronproject te maken:
dotnet new classlib -lang "F#"
U maakt een mislukte implementatie van de wiskundige service:
module MyMath =
let squaresOfOdds xs = raise (System.NotImplementedException("You haven't written a test yet!"))
Verander de directory terug naar de eenheidstest-met-fsharp directory. Voer de volgende opdracht uit om het klassebibliotheekproject toe te voegen aan de oplossing:
dotnet sln add .\MathService\MathService.fsproj
Het testproject maken
Maak vervolgens de map MathService.Tests. Het volgende schema toont de directorystructuur:
/unit-testing-with-fsharp
unit-testing-with-fsharp.sln
/MathService
Source Files
MathService.fsproj
/MathService.Tests
Maak de map MathService.Tests de huidige map en maak een nieuw project met behulp van de volgende opdracht:
dotnet new nunit -lang "F#"
Met deze opdracht maakt u een testproject dat NUnit als testframework gebruikt. De gegenereerde sjabloon configureert de testrunner in de MathServiceTests.fsproj:
<ItemGroup>
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.9.0" />
<PackageReference Include="NUnit" Version="4.1.0" />
<PackageReference Include="NUnit3TestAdapter" Version="4.5.0" />
</ItemGroup>
Voor het testproject zijn andere pakketten vereist om eenheidstests te maken en uit te voeren.
dotnet new in de vorige stap zijn NUnit en de NUnit-testadapter toegevoegd. Voeg nu de MathService klassebibliotheek toe als een andere afhankelijkheid van het project. Gebruik de opdracht dotnet reference add:
dotnet reference add ../MathService/MathService.fsproj
U kunt het hele bestand zien in de opslagplaats met voorbeelden op GitHub.
U hebt de volgende indeling voor de uiteindelijke oplossing:
/unit-testing-with-fsharp
unit-testing-with-fsharp.sln
/MathService
Source Files
MathService.fsproj
/MathService.Tests
Test Source Files
MathService.Tests.fsproj
Voer de volgende opdracht uit in de directory unit-testing-with-fsharp :
dotnet sln add .\MathService.Tests\MathService.Tests.fsproj
De eerste test maken
U schrijft één mislukte test, laat deze slagen en herhaal het proces. Open UnitTest1.fs en voeg de volgende code toe:
namespace MathService.Tests
open System
open NUnit.Framework
open MathService
[<TestFixture>]
type TestClass () =
[<Test>]
member this.TestMethodPassing() =
Assert.That(true, Is.True)
[<Test>]
member this.FailEveryTime() = Assert.That(false, Is.True)
Het kenmerk [<TestFixture>] geeft een klasse aan die tests bevat. Het kenmerk [<Test>] geeft een testmethode aan die wordt uitgevoerd door de testloper. Voer in de map eenheidstests-met-fsharp-dotnet test uit om de tests en de klassenbibliotheek te bouwen en vervolgens de tests uit te voeren. De NUnit-testloper bevat het ingangspunt van het programma om uw tests uit te voeren.
dotnet test start de test runner met het unittestproject dat u hebt gemaakt.
Deze twee tests tonen de meest eenvoudige geslaagde en mislukte tests.
My test slaagt en Fail every time mislukt. Maak nu een test voor de methode squaresOfOdds. De squaresOfOdds methode retourneert een reeks van de kwadraten van alle oneven gehele getallen die deel uitmaken van de invoerreeks. In plaats van al deze functies tegelijk te schrijven, kunt u iteratief tests maken waarmee de functionaliteit wordt gevalideerd. Om elke test te laten slagen, ontwikkelt u de benodigde functionaliteit voor de methode.
De eenvoudigste test die u kunt schrijven, is het aanroepen squaresOfOdds met alle even nummers, waarbij het resultaat een lege reeks gehele getallen moet zijn. Dit is de test:
[<Test>]
member this.TestEvenSequence() =
let expected = Seq.empty<int>
let actual = MyMath.squaresOfOdds [2; 4; 6; 8; 10]
Assert.That(actual, Is.EqualTo(expected))
U ziet dat de expected reeks wordt geconverteerd naar een lijst. Het NUnit-framework is afhankelijk van veel standaard .NET-typen. Deze afhankelijkheid betekent dat uw openbare interface en verwachte resultaten ondersteuning bieden voor ICollection in plaats van IEnumerable.
Wanneer u de test uitvoert, ziet u dat de test mislukt. Dat komt omdat u de implementatie nog niet hebt gemaakt. Voer deze test door de eenvoudigste code te schrijven in de klasse Library.fs in uw MathService-project dat werkt:
let squaresOfOdds xs =
Seq.empty<int>
Voer opnieuw uit in de map dotnet test. Met de opdracht dotnet test wordt een build uitgevoerd voor het MathService project en vervolgens voor het MathService.Tests project. Nadat u beide projecten hebt gebouwd, worden uw tests uitgevoerd. Nu zijn er twee tests geslaagd.
De vereisten voltooien
Nu je één testronde hebt voltooid, is het tijd om er meer te schrijven. De volgende eenvoudige case werkt met een reeks waarvan alleen oneven getal is 1. Het getal 1 is gemakkelijker omdat het vierkant van 1 1 is. Dit is de volgende test:
[<Test>]
member public this.TestOnesAndEvens() =
let expected = [1; 1; 1; 1]
let actual = MyMath.squaresOfOdds [2; 1; 4; 1; 6; 1; 8; 1; 10]
Assert.That(actual, Is.EqualTo(expected))
Het uitvoeren van dotnet test zorgt ervoor dat de nieuwe test faalt. U moet de squaresOfOdds methode bijwerken om deze nieuwe test af te handelen. U moet alle even getallen uit de reeks filteren om deze test te laten slagen. U kunt dit doen door een kleine filterfunctie te schrijven en Seq.filterte gebruiken:
let private isOdd x = x % 2 <> 0
let squaresOfOdds xs =
xs
|> Seq.filter isOdd
Er is nog een stap: elk van de oneven getallen kwadrateren. Begin met het schrijven van een nieuwe test:
[<Test>]
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.That(actual, Is.EqualTo(expected))
U kunt de test oplossen door de gefilterde reeks door te spitsen via een kaartbewerking om het kwadraat van elk oneven getal te berekenen:
let private square x = x * x
let private isOdd x = x % 2 <> 0
let squaresOfOdds xs =
xs
|> Seq.filter isOdd
|> Seq.map square
U hebt een kleine bibliotheek en een set eenheidstests voor die bibliotheek gemaakt. U hebt de oplossing gestructureerd zodat het toevoegen van nieuwe pakketten en tests deel uitmaakt van de normale werkstroom. U hebt zich het grootste deel van uw tijd en moeite geconcentreerd op het oplossen van de doelstellingen van de toepassing.