Share via


F#-bibliotheken testen met behulp van dotnet-test en NUnit

In deze zelfstudie wordt u stapsgewijs begeleid bij het bouwen van een voorbeeldoplossing voor het leren van concepten voor het testen van eenheden. 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 test, raadpleegt u Integratietests in ASP.NET Core.

Vereisten

  • .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 MathService-map . 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!"))

Wijzig de map weer in de map unit-testing-with-fsharp . 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 . In het volgende overzicht ziet u de mapstructuur:

/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 aan het project. Gebruik de dotnet add reference opdracht:

dotnet add reference ../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 map 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 [<TestFixture>] kenmerk geeft een klasse aan die tests bevat. Het [<Test>] kenmerk geeft een testmethode aan die wordt uitgevoerd door de testloper. Voer vanuit de map dotnet test unit-testing-with-fsharp uit om de tests en de klassebibliotheek 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 testrunner met behulp van het eenheidstestproject dat u hebt gemaakt.

Deze twee tests tonen de meest eenvoudige geslaagde en mislukte tests. My test passeert en Fail every time mislukt. Maak nu een test voor de squaresOfOdds methode. 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. Als u elke testpas wilt maken, maakt 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 ICollection in plaats IEnumerablevan .

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 dotnet test opnieuw uit in de map unit-testing-with-fsharp. Met de dotnet test opdracht wordt een build voor het MathService project uitgevoerd en vervolgens voor het MathService.Tests project. Nadat u beide projecten hebt gebouwd, worden uw tests uitgevoerd. Er zijn nu twee tests.

De vereisten voltooien

Nu u één testpas hebt gemaakt, is het tijd om meer te schrijven. De volgende eenvoudige zaak 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))

dotnet test De nieuwe test kan niet worden uitgevoerd. 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 het volgende te gebruiken Seq.filter:

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.

Zie ook