Sdílet prostřednictvím


Testování částí knihoven F# v .NET Core pomocí testu dotnet a MSTest

Tento kurz vás provede interaktivním prostředím a podrobným sestavením ukázkového řešení, kde se seznámíte s koncepty testování jednotek. Pokud chcete postupovat podle kurzu pomocí předem připraveného řešení, před zahájením si prohlédněte nebo stáhněte ukázkový kód . Pokyny ke stažení najdete v tématu Ukázky a kurzy.

Tento článek se týká testování projektu .NET Core. Pokud testujete projekt ASP.NET Core, podívejte se na testy integrace v ASP.NET Core.

Vytvoření zdrojového projektu

Otevřete okno prostředí. Vytvořte adresář s názvem unit-testing-with-fsharp pro uložení řešení. V tomto novém adresáři spusťte příkaz dotnet new sln pro vytvoření nového řešení. To usnadňuje správu knihovny tříd i projektu testování jednotek. V adresáři řešení vytvořte adresář MathService . Zatím je uvedena struktura adresářů a souborů:

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

Nastavte MathService jako aktuální adresář a spusťte dotnet new classlib -lang "F#" ho, abyste vytvořili zdrojový projekt. Vytvoříte neúspěšnou implementaci matematické služby:

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

Změňte adresář zpět na adresář unit-testing-with-fsharp . Spuštěním příkazu dotnet sln add .\MathService\MathService.fsproj přidejte projekt knihovny tříd do řešení.

Vytvoření testovacího projektu

Dále vytvořte adresář MathService.Tests . Následující osnova ukazuje adresářovou strukturu:

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

Vytvořte adresář MathService.Tests jako aktuální adresář a vytvořte nový projekt pomocí dotnet new mstest -lang "F#". Tím se vytvoří testovací projekt, který jako testovací architekturu používá MSTest. Vygenerovaná šablona nakonfiguruje spouštěč testů v 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>

Testovací projekt vyžaduje k vytvoření a spuštění testů jednotek další balíčky. dotnet new v předchozím kroku jsme přidali MSTest a MSTest runner. Teď do projektu přidejte knihovnu MathService tříd jako další závislost. dotnet add reference Použijte příkaz:

dotnet add reference ../MathService/MathService.fsproj

Celý soubor můžete zobrazit v úložišti ukázek na GitHubu.

Máte následující konečné rozložení řešení:

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

Spusťte dotnet sln add .\MathService.Tests\MathService.Tests.fsproj v adresáři unit-testing-with-fsharp .

Vytvoření prvního testu

Napíšete jeden neúspěšný test, nastavíte ho jako úspěšný a pak tento proces zopakujete. Otevřete Tests.fs a přidejte následující kód:

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)

Atribut [<TestClass>] označuje třídu, která obsahuje testy. Atribut [<TestMethod>] označuje testovací metodu, kterou spouští spouštěč testů. Z adresáře unit-testing-with-fsharp spusťte dotnet test testy a knihovnu tříd a pak testy spusťte. Spouštěč testů MSTest obsahuje vstupní bod programu pro spuštění testů. dotnet test spustí spouštěč testů pomocí projektu testování jednotek, který jste vytvořili.

Tyto dva testy ukazují nejzásadnější úspěšné a neúspěšné testy. My test projde a Fail every time selže. Teď vytvořte test pro metodu squaresOfOdds . Metoda squaresOfOdds vrátí seznam čtverců všech lichých celých hodnot, které jsou součástí vstupní sekvence. Místo toho, abyste se pokusili najednou napsat všechny tyto funkce, můžete iterativním způsobem vytvořit testy, které funkci ověřují. Provedení každého testu znamená vytvoření potřebné funkce pro metodu.

Nejjednodušším testem, který můžeme napsat, je volat squaresOfOdds se všemi sudými čísly, kde by výsledek měl být prázdná posloupnost celých čísel. Tady je tento test:

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

Všimněte si, že expected sekvence byla převedena na seznam. Knihovna MSTest spoléhá na mnoho standardních typů .NET. Tato závislost znamená, že vaše veřejné rozhraní a očekávané výsledky podporují ICollection spíše než IEnumerable.

Když test spustíte, uvidíte, že váš test selže. Ještě jste nevytvořili implementaci. Proveďte tento test tak, že napíšete nejjednodušší kód ve Mathservice třídě, která funguje:

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

V adresáři unit-testing-with-fsharp spusťte dotnet test znovu. Příkaz dotnet test spustí sestavení projektu MathService a pak projekt MathService.Tests . Po sestavení obou projektů spustí tento jediný test. Projde.

Dokončení požadavků

Teď, když jste udělali jeden test, je čas napsat více. Další jednoduchý případ funguje se sekvencí, jejíž jediné liché číslo je 1. Číslo 1 je jednodušší, protože čtverec 1 je 1. Tady je další test:

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

Spuštění nového dotnet test testu selže. Chcete-li tento nový test zpracovat, je nutné aktualizovat metodu squaresOfOdds . Pokud chcete, aby byl tento test úspěšný, musíte vyfiltrovat všechna sudá čísla mimo sekvenci. Můžete to udělat tak, že napíšete malou funkci filtru a použijete Seq.filter:

let private isOdd x = x % 2 <> 0

let squaresOfOdds xs =
    xs
    |> Seq.filter isOdd |> Seq.toList

Všimněte si volání Seq.toList. Tím se vytvoří seznam, který implementuje ICollection rozhraní.

Existuje ještě jeden krok: každou lichou čísla se čtvere. Začněte napsáním nového testu:

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

Test můžete opravit propojením filtrované sekvence pomocí operace mapování pro výpočet čtverce každého lichého čísla:

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

Vytvořili jste malou knihovnu a sadu testů jednotek pro tuto knihovnu. Řešení jste strukturovali tak, aby přidání nových balíčků a testů bylo součástí normálního pracovního postupu. Většinu času a úsilí jste se zaměřili na řešení cílů aplikace.

Viz také