Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
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í, zobrazit nebo stáhnout ukázkový kód, než začnete. Pokyny ke stažení najdete ve vzorech a návodech .
Tento článek se týká testování projektu .NET Core. Pokud testujete projekt ASP.NET Core, přečtěte si téma Integrační testy v ASP.NET Core.
Vytvoření zdrojového projektu
Otevřete okno příkazového řádku. Vytvořte adresář s názvem unit-testing-with-fsharp pro uložení řešení.
V tomto novém adresáři spusťte dotnet new sln a vytvořte nové ř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 dotnet sln add .\MathService\MathService.fsproj přidejte do řešení projekt knihovny tříd.
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 xunit -lang "F#". Tím se vytvoří testovací projekt, který jako testovací knihovnu používá xUnit. 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="xunit" Version="2.2.0" />
<PackageReference Include="xunit.runner.visualstudio" Version="2.2.0" />
</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 xUnit a xUnit runner. Teď do projektu přidejte knihovnu tříd MathService jako jinou závislost. Použijte příkaz dotnet reference add:
dotnet reference add ../MathService/MathService.fsproj
Návod
Pokud používáte sadu .NET 9 SDK nebo starší, použijte místo toho "sloveso first" (dotnet add reference). Ve verzi .NET 10 byl zaveden formulář "první podstatné jméno".
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, uděláte ho úspěšným, a pak tento proces zopakujete. Otevřete Tests.fs a přidejte následující kód:
[<Fact>]
let ``My test`` () =
Assert.True(true)
[<Fact>]
let ``Fail every time`` () = Assert.True(false)
Atribut [<Fact>] označuje testovací metodu, kterou spouští spouštěč testů. Z unit-testing-with-fsharp spusťte dotnet test, abyste vytvořili testy a knihovnu tříd, a poté spustili testy. Spouštěč testů xUnit obsahuje vstupní bod programu pro spuštění testů.
dotnet test spustí spouštěč testů pomocí projektu testu jednotek, který jste vytvořili.
Tyto dva testy ukazují ty nejzákladnější testy, které prošly a neprošly.
My test projde a Fail every time selže. Teď vytvořte test pro metodu squaresOfOdds . Metoda squaresOfOdds vrátí sekvenci čtverců všech lichých celočíselný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:
[<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)
Váš test neuspěl. Ještě jste nevytvořili implementaci. Proveďte tento test tak, že napíšete nejjednodušší kód ve třídě MathService, která funguje:
let squaresOfOdds xs =
Seq.empty<int>
V adresáři unit-testing-with-fsharp spusťte dotnet test znovu. Příkaz dotnet test spustí sestavení projektu MathService a poté projektu MathService.Tests. Po sestavení obou projektů spustí tento jediný test. Projde.
Dokončení požadavků
Nyní, když jste úspěšně prošli jedním testem, je čas napsat více testů. 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:
[<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)
Spuštění dotnet test provede vaše testy a ukáže, že nový test selhal. Nyní aktualizujte metodu squaresOfOdds tak, aby zpracovávala tento nový test. Vyfiltrujete všechna sudá čísla ze sekvence, abyste tento test prošli. 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
Existuje ještě jeden krok: umocněte každé z lichých čísel. Začněte napsáním nového testu:
[<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)
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
Vytvořili jste malou knihovnu a sadu jednotkových testů 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é
- dotnet new
- dotnet sln
- dotnet reference add
- dotnet test