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 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, tekintse meg a ASP.NET Core integrációs tesztjeit.
A forrásprojekt létrehozása
Nyisson meg egy felületablakot. 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 dotnet new sln
az ú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árban hozzon létre egy MathService-címtá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-t az aktuális könyvtárba, és futtassa dotnet new classlib -lang "F#"
a forrásprojekt létrehozásához. A matematikai szolgáltatás sikertelen implementációját fogja létrehozni:
module MyMath =
let squaresOfOdds xs = raise (System.NotImplementedException("You haven't written a test yet!"))
Módosítsa a könyvtárat a unit-testing-with-fsharp könyvtárra. Futtassa dotnet sln add .\MathService\MathService.fsproj
az osztálytár projektjének a 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árra, és hozzon létre egy új projektet a használatával dotnet new mstest -lang "F#"
. 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 fájlban:
<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 és az MSTest futót. Most adja hozzá az MathService
osztálytárat egy másik függőségként a projekthez. Használja a dotnet add reference
következő parancsot:
dotnet add reference ../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
Végrehajtás dotnet sln add .\MathService.Tests\MathService.Tests.fsproj
a unit-testing-with-fsharp könyvtárban.
Az első teszt létrehozása
Írjon egy sikertelen tesztet, adja át, majd ismételje meg a folyamatot. Nyissa meg a Tests.fs elemet , é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)
Az [<TestClass>]
attribútum egy teszteket tartalmazó osztályt jelöl. Az [<TestMethod>]
attribútum egy tesztmetódust jelöl, amelyet a tesztfuttató futtat. A unit-testing-with-fsharp könyvtárban hajtsa végre dotnet test
a teszteket és az osztálytárat, 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
átmegy, é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 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, hogy minden páros számmal hívunk squaresOfOdds
, 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 nem támogatják ICollectionIEnumerablea .
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 az Mathservice
osztályba, amely működik:
let squaresOfOdds xs =
Seq.empty<int> |> Seq.toList
A unit-testing-with-fsharp könyvtárban futtassa dotnet test
újra. A dotnet test
parancs futtat egy buildet 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 olyan sorozattal működik, amelynek csak páratlan száma van 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 végrehajtás dotnet test
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. Ehhez írjon egy kis szűrőfüggvényt, és használja a következőt Seq.filter
:
let private isOdd x = x % 2 <> 0
let squaresOfOdds xs =
xs
|> Seq.filter isOdd |> Seq.toList
Figyelje meg a hívás.Seq.toList
Ez létrehoz egy listát, amely megvalósítja az interfészt ICollection .
Van még egy lépés: négyzet minden páratlan szám. 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 térképműveleten keresztül futtatja az egyes páratlan számok négyzetének kiszámításához:
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ódtárat és egy készletnyi egységtesztet a tá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
Visszajelzés
https://aka.ms/ContentUserFeedback.
Hamarosan elérhető: 2024-ben fokozatosan kivezetjük a GitHub-problémákat a tartalom visszajelzési mechanizmusaként, és lecseréljük egy új visszajelzési rendszerre. További információ:Visszajelzés küldése és megtekintése a következőhöz: