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


F#-kódtárak egységtesztelése a .NET Core-ban dotnet-teszt és MSTest 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 elkészített megoldással szeretné követni az oktatóanyagot, a kezdés előtt megtekintheti vagy letöltheti a mintakódot. A letöltési utasításokért tekintse meg példákat és 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.

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. Ebben az új könyvtárban futtassa a dotnet new sln parancsot egy új megoldás létrehozásához. Ez megkönnyíti az osztálytár és az egységtesztelési projekt kezelését. A megoldáskönyvtáron belül hozzon létre egy MathService könyvtárat. Az eddigi könyvtár és fájlstruktúra az alábbiakban látható:

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

Állítsa be a MathService mappát aktuális könyvtárként, és futtassa a dotnet new classlib -lang "F#" parancsot a forrásprojekt létrehozásához. Egy hibás implementációt fog létrehozni a matematikai szolgáltatáshoz.

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

Állítsa vissza a könyvtárat az unit-testing-with-fsharp könyvtárra. Futtassa dotnet sln add .\MathService\MathService.fsproj az osztálytárprojekt megoldáshoz való hozzáadásához.

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árba, és hozzon létre egy új projektet a dotnet new mstest -lang "F#"használatával. Ez létrehoz egy tesztprojektet, amely az MSTestet 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="15.3.0-preview-20170628-02" />
  <PackageReference Include="MSTest.TestAdapter" Version="1.1.18" />
  <PackageReference Include="MSTest.TestFramework" Version="1.1.18" />
</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 MSTestet. 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
        MathServiceTests.fsproj

Hajtsa végre a dotnet sln add .\MathService.Tests\MathService.Tests.fsproj-t a egységtesztelés-fsharp könyvtárban.

Az első teszt létrehozása

Írjon egy sikertelen tesztet, tegye sikeressé, majd ismételje meg a folyamatot. Nyissa meg Tests.fs, és adja hozzá a következő kódot:

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)

A [<TestClass>] attribútum egy teszteket tartalmazó osztályt jelöl. A [<TestMethod>] 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 MSTest tesztfuttatója 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 négyzeteinek listájá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 teszteredmények létrehozása a metódushoz szükséges funkciók létrehozását jelenti.

A legegyszerűbb teszt, amit írhatunk, az squaresOfOdds meghívása az összes páros számmal, ahol az eredménynek egész számok üres sorozatának kell lennie. A következő teszt:

[<TestMethod>]
member this.TestEvenSequence() =
    let expected = Seq.empty<int> |> Seq.toList
    let actual = MyMath.squaresOfOdds [2; 4; 6; 8; 10]
    Assert.AreEqual(expected, actual)

Figyelje meg, hogy a expected sorozat listává lett konvertálva. Az MSTest-kódtár 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. Még nem hozta létre az implementációt. Ezt a tesztet úgy teheti meg, hogy a legegyszerűbb kódot írja be a Mathservice osztályba, amely működik:

let squaresOfOdds xs =
    Seq.empty<int> |> Seq.toList

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 ezt az egyetlen tesztet futtatja. Á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:

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

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 |> Seq.toList

Figyelje meg a Seq.toListhívását. Ez létrehoz egy listát, amely megvalósítja a ICollection felületet.

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

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

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
    |> Seq.toList

Létrehozott egy kis könyvtárat és egységteszteket ehhez 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ította.

Lásd még: