Megosztás a következőn keresztül:


F#-kódtárak egységtesztelése dotnet-teszt és NUnit használatával

Ez az oktatóanyag egy interaktív felületen mutatja be, hogyan hozhat létre lépésről lépésre egy mintamegoldást az egységtesztelési fogalmak megismeréséhez. Ha inkább egy előre összeállított megoldással szeretné követni az oktatóanyagot, a kezdés előtt tekintse meg vagy töltse le a mintakódot . A letöltési utasításokért tekintse meg a példákat és az oktatóanyagokat.

Ez a cikk egy .NET Core-projekt teszteléséről szól. Ha egy ASP.NET Core-projektet tesztel, olvassa el az ASP.NET Core Integrációs tesztekfejezetet.

Előfeltételek

  • .NET 8 SDK vagy újabb verziók.
  • Az Ön által választott szöveg- vagy kódszerkesztő.

A forrásprojekt létrehozása

Nyisson meg egy parancssor ablakot. Hozzon létre egy unit-testing-with-fsharp nevű könyvtárat a megoldás tárolásához. Az új könyvtárban futtassa a következő parancsot egy új megoldásfájl létrehozásához az osztálytárhoz és a tesztprojekthez:

dotnet new sln

Ezután hozzon létre egy MathService-címtárat . Az alábbi vázlat a könyvtárat és a fájlstruktúrát mutatja be eddig:

/unit-testing-with-fsharp
    unit-testing-with-fsharp.sln
    /MathService

Állítsa a MathService-t az aktuális könyvtárra, és futtassa a következő parancsot a forrásprojekt létrehozásához:

dotnet new classlib -lang "F#"

A matematikai szolgáltatás sikertelen implementációját hozza létre:

module MyMath =
    let squaresOfOdds xs = raise (System.NotImplementedException("You haven't written a test yet!"))

Változtassa vissza a könyvtárat a unit-testing-with-fsharp könyvtárra. Futtassa a következő parancsot az osztálytárprojekt megoldáshoz való hozzáadásához:

dotnet sln add .\MathService\MathService.fsproj

A tesztprojekt létrehozása

Ezután hozza létre a MathService.Tests könyvtárat. Az alábbi ábra a könyvtárszerkezetet mutatja be:

/unit-testing-with-fsharp
    unit-testing-with-fsharp.sln
    /MathService
        Source Files
        MathService.fsproj
    /MathService.Tests

Állítsa a MathService.Tests könyvtárat az aktuális könyvtárra, és hozzon létre egy új projektet az alábbi paranccsal:

dotnet new nunit -lang "F#"

Ez a parancs létrehoz egy tesztprojektet, amely az NUnitot használja tesztelési keretrendszerként. A létrehozott sablon konfigurálja a tesztfuttatót a 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>

A tesztprojekthez más csomagokra van szükség az egységtesztek létrehozásához és futtatásához. dotnet new az előző lépésben hozzáadta az NUnit és az NUnit tesztadaptert. Most adja hozzá a MathService osztálytárat egy másik függőségként a projekthez. Használja a dotnet reference add parancsot:

dotnet reference add ../MathService/MathService.fsproj

A teljes fájl a GitHub mintaadattárában látható.

A következő végső megoldáselrendezést kell követnie:

/unit-testing-with-fsharp
    unit-testing-with-fsharp.sln
    /MathService
        Source Files
        MathService.fsproj
    /MathService.Tests
        Test Source Files
        MathService.Tests.fsproj

Hajtsa végre a következő parancsot a unit-testing-with-fsharp könyvtárban:

dotnet sln add .\MathService.Tests\MathService.Tests.fsproj

Az első teszt létrehozása

Írsz egy sikertelen tesztet, sikerre viszed, majd megismétled a folyamatot. Nyissa meg a UnitTest1.fs-et , és adja hozzá a következő kódot:

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)

A [<TestFixture>] attribútum egy teszteket tartalmazó osztályt jelöl. A [<Test>] attribútum a tesztfuttató által futtatott vizsgálati módszert jelöli. A unit-testing-with-fsharp könyvtárban hajtsa végre a dotnet test parancsot a tesztek és az osztálykönyvtár létrehozásához, majd futtassa a teszteket. Az NUnit-tesztfuttató tartalmazza a tesztek futtatásához a program belépési pontját. dotnet test elindítja a tesztfuttatót a létrehozott egységteszt-projekt használatával.

Ez a két teszt a legalapvetőbb átmenő és sikertelen teszteket mutatja. My test áthalad, és Fail every time sikertelen lesz. Most hozzon létre egy tesztet a squaresOfOdds metódushoz. A squaresOfOdds metódus a bemeneti sorozat részét képező összes páratlan egész számérték négyzeteinek sorozatát adja vissza. Ahelyett, hogy egyszerre próbálná meg írni az összes függvényt, iteratív módon létrehozhat olyan teszteket, amelyek ellenőrzik a funkciót. Az egyes tesztek teljesítéséhez létre kell hoznia a metódushoz szükséges funkcionalitást.

A legegyszerűbb teszt, amit írhat, az az, hogy hívja meg a squaresOfOdds függvényt az összes páros számmal, ahol az eredménynek egy üres egész szám sorozatnak kell lennie. A következő teszt:

[<Test>]
member this.TestEvenSequence() =
    let expected = Seq.empty<int>
    let actual = MyMath.squaresOfOdds [2; 4; 6; 8; 10]
    Assert.That(actual, Is.EqualTo(expected))

Figyelje meg, hogy a expected sorrend listává alakul. Az NUnit-keretrendszer számos szabványos .NET-típusra támaszkodik. Ez a függőség azt jelenti, hogy a nyilvános felület és a várt eredmények ICollection támogatják IEnumerablehelyett.

A teszt futtatásakor láthatja, hogy a teszt meghiúsul. Ennek az az oka, hogy még nem hozta létre az implementációt. Ezt a tesztet úgy teheti meg, hogy a legegyszerűbb kódot írja a MathService-projekt Library.fs osztályában, amely működik:

let squaresOfOdds xs =
    Seq.empty<int>

A unit-testing-with-fsharp könyvtárban futtassa a dotnet test-t újra. A dotnet test parancs egy buildet futtat a MathService projekthez, majd a MathService.Tests projekthez. Mindkét projekt létrehozása után futtatja a teszteket. Két teszt most átmegy.

A követelmények teljesítése

Most, hogy teljesített egy teszteredményt, ideje többet írni. A következő egyszerű eset egy olyan sorozattal működik, amelynek egyetlen páratlan száma 1. Az 1-es szám egyszerűbb, mert az 1 négyzete 1. A következő teszt:

[<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))

A dotnet test végrehajtása meghiúsul az új teszten. Az új teszt kezeléséhez frissítenie kell a squaresOfOdds metódust. A teszt sikeres végrehajtásához ki kell szűrnie az összes páros számot a sorozatból. Ezt egy kis szűrőfüggvény megírásával és a Seq.filterhasználatával teheti meg:

let private isOdd x = x % 2 <> 0

let squaresOfOdds xs =
    xs
    |> Seq.filter isOdd

Van még egy lépés: négyzetre emelni minden páratlan számot. Először írjon egy új tesztet:

[<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))

A tesztet úgy javíthatja ki, hogy a szűrt sorozatot egy leképezési művelet segítségével átalakítja, és kiszámítja az egyes páratlan számok négyzetét.

let private square x = x * x
let private isOdd x = x % 2 <> 0

let squaresOfOdds xs =
    xs
    |> Seq.filter isOdd
    |> Seq.map square

Létrehozott egy kis könyvtárat és egy készletnyi egységtesztet a könyvtárhoz. A megoldást úgy strukturálta, hogy az új csomagok és tesztek hozzáadása a normál munkafolyamat része legyen. A legtöbb időt és erőfeszítést az alkalmazás céljainak megoldására összpontosított.

Lásd még