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. 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-t az aktuális könyvtárba, és futtassa dotnet new classlib -lang "F#" 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!"))
Változtassa vissza a könyvtárat a unit-testing-with-fsharp könyvtárra. Futtassa a dotnet sln add .\MathService\MathService.fsproj parancsot az osztálykönyvtár projekt hozzáadásához a megoldásba.
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 xunit -lang "F#"használatával. Ez létrehoz egy tesztprojektet, amely az xUnitot használja teszttárké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="xunit" Version="2.2.0" />
<PackageReference Include="xunit.runner.visualstudio" Version="2.2.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 xUnitot és az xUnit futót. 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
Jótanács
Ha .NET 9 SDK-t vagy korábbi verziót használ, használja helyette az "első ige" űrlapot (dotnet add reference). A "főnév első" űrlap a .NET 10-ben lett bevezetve.
A teljes fájl a GitHub
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
Írsz egy sikertelen tesztet, sikerre viszed, majd megismétled a folyamatot. Nyissa meg Tests.fs, és adja hozzá a következő kódot:
[<Fact>]
let ``My test`` () =
Assert.True(true)
[<Fact>]
let ``Fail every time`` () = Assert.True(false)
A [<Fact>] attribútum a tesztfuttató által futtatott vizsgálati módszert jelöli. A unit-testing-with-fsharp projektből hajtsa végre dotnet test, hogy felépítse a teszteket és az osztálykönyvtárat, majd futtassa a teszteket. Az xUnit 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 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:
[<Fact>]
let ``Sequence of Evens returns empty collection`` () =
let expected = Seq.empty<int>
let actual = MyMath.squaresOfOdds [2; 4; 6; 8; 10]
Assert.Equal<Collections.Generic.IEnumerable<int>>(expected, actual)
A teszt sikertelen. Még nem hoztad 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>
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:
[<Fact>]
let ``Sequences of Ones and Evens returns Ones`` () =
let expected = [1; 1; 1; 1]
let actual = MyMath.squaresOfOdds [2; 1; 4; 1; 6; 1; 8; 1; 10]
Assert.Equal<Collections.Generic.IEnumerable<int>>(expected, actual)
A végrehajtás dotnet test lefuttatja a teszteket, és megmutatja, hogy az új teszt nem sikerül. Most frissítse a metódust squaresOfOdds az új teszt kezeléséhez. A teszt sikeres végrehajtásához szűrje ki 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:
[<Fact>]
let ``SquaresOfOdds works`` () =
let expected = [1; 9; 25; 49; 81]
let actual = MyMath.squaresOfOdds [1; 2; 3; 4; 5; 6; 7; 8; 9; 10]
Assert.Equal(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
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ította.