Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
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.
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.
Prerequisites
- .NET 10 SDK-s vagy újabb verziók.
- Az Ön által választott szöveg- vagy kódszerkesztő.
A TUnit teljes egészében a Microsoft.Testing.Platform (MTP) platformra épül, és nem támogatja a VSTestet. Ez az oktatóanyag a(z) dotnet test MTP-módját használja, amelyhez a .NET 10 SDK szükséges.
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.slnx
/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#"
Cserélje le a Library.fs tartalmát a matematikai szolgáltatás egy hibás megvalósításával:
namespace MathService
module MyMath =
let squaresOfOdds (xs: int seq) : int seq = 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.slnx
/MathService
Source Files
MathService.fsproj
/MathService.Tests
A TUnit-projektsablonok nem szerepelnek a .NET SDK-ban. Telepítse őket a következő paranccsal:
dotnet new install TUnit.Templates
Á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 TUnit -lang "F#"
Note
A sablon rövid nevei kis- és nagybetűérzékenyek. Használja TUnit, ne tunit.
Ez a parancs létrehoz egy tesztprojektet, amely a TUnitot használja tesztelési keretrendszerként. A létrehozott MathService.Tests.fsproj fájl egy végrehajtható projekt, amely a TUnit csomagra hivatkozik, amely magában foglalja a tesztelési keretrendszert, az assertion könyvtárat és az MTP-tesztfuttatót, valamint a TUnit.Assertions.FSharp csomagot, amely F#-segítőket ad hozzá az állításokhoz.
A sablon mintateszteket is hozzáad. Ez az oktatóanyag a saját tesztjeivel helyettesíti őket a Tests.fs fájlban. Törölje az Data könyvtárat és a GlobalSetup.fs, Tests2.fs és Tests3.fs fájlokat. Az F#-projektek kifejezetten felsorolják a forrásfájlokat, ezért a MathService.Tests.fsproj fájlban cserélje le a Compile elemeket tartalmazó ItemGroup elemet a következőre:
<ItemGroup>
<Compile Include="Tests.fs" />
</ItemGroup>
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
Az alábbi ábra a végső megoldáselrendezést mutatja be:
/unit-testing-with-fsharp
unit-testing-with-fsharp.slnx
/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
A dotnet-teszt MTP-módjának konfigurálása
Mivel a TUnit nem támogatja a VSTestet, dotnet test-nak MTP módban kell futnia. A unit-testing-with-fsharp könyvtárban hozzon létre egy global.json fájlt a következő tartalommal:
{
"test": {
"runner": "Microsoft.Testing.Platform"
}
}
További információkért lásd: a dotnet test MTP-módja.
Az első teszt létrehozása
Írsz egy sikertelen tesztet, sikerre viszed, majd megismétled a folyamatot. Cserélje le a Tests.fs tartalmát a következő kódra:
namespace MathService.Tests
open TUnit.Core
open TUnit.Assertions
open TUnit.Assertions.Extensions
open TUnit.Assertions.FSharp.TaskAssert
open MathService
type TestClass () =
[<Test>]
member this.TestMethodPassing() = taskAssert {
do! Assert.That(true).IsTrue()
}
[<Test>]
member this.FailEveryTime() = taskAssert {
do! Assert.That(false).IsTrue()
}
A [<Test>] attribútum a tesztfuttató által futtatott vizsgálati módszert jelöli. A TUnit felderíti azokat a tesztelési módszereket, amelyek egy osztály tagjai; nem észleli a modulban let-val deklarált függvényeket. A TUnit-állítások aszinkronok. A taskAssert számítási kifejezés a TUnit.Assertions.FSharp használatával feladatként futtat egy tesztet, és lehetővé teszi, hogy minden aszerciót a do! használatával várjon.
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. A TUnit tesztprojekt tartalmazza a tesztek futtatásához a program belépési pontját.
dotnet test elindítja a tesztalkalmazást a létrehozott egységtesztelési projekt használatával.
Ez a két teszt a legalapvetőbb átmenő és sikertelen teszteket mutatja.
TestMethodPassing áthalad, és FailEveryTime 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 sikeres teljesítéséhez létre kell hoznia a metódushoz szükséges funkciókat.
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. Adja hozzá a következő tesztet a TestClass típushoz:
[<Test>]
member this.TestEvenSequence() = taskAssert {
let expected = Seq.empty<int>
let actual = MyMath.squaresOfOdds [2; 4; 6; 8; 10]
do! Assert.That<int>(actual).IsEquivalentTo(expected)
}
Az F# szigorúbb, mint a C#, amikor feloldja a metódus-túlterhelések közötti választást, ezért a teszt az elemtípust a Assert.That<int> számára adja át, hogy kiválassza az egész számok sorozatára vonatkozó állításokat.
IsEquivalentTo ellenőrzi, hogy mindkét sorozat ugyanazokat az elemeket tartalmazza-e.
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. Érje el, hogy ez a teszt sikeres legyen úgy, hogy a legegyszerűbb, működő kódot írja a MathService-projekt Library.fs fájljába:
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() = taskAssert {
let expected = [1; 1; 1; 1]
let actual = MyMath.squaresOfOdds [2; 1; 4; 1; 6; 1; 8; 1; 10]
do! Assert.That<int>(actual).IsEquivalentTo(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() = taskAssert {
let expected = [1; 9; 25; 49; 81]
let actual = MyMath.squaresOfOdds [1; 2; 3; 4; 5; 6; 7; 8; 9; 10]
do! Assert.That<int>(actual).IsEquivalentTo(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.