Testowanie jednostkowe bibliotek języka F# przy użyciu bibliotek dotnet test i NUnit
Ten samouczek przeprowadzi Cię przez interaktywne środowisko tworzenia przykładowego rozwiązania krok po kroku, aby poznać pojęcia dotyczące testowania jednostkowego. Jeśli wolisz skorzystać z samouczka przy użyciu wstępnie utworzonego rozwiązania, przed rozpoczęciem wyświetl lub pobierz przykładowy kod . Aby uzyskać instrukcje dotyczące pobierania, zobacz Przykłady i samouczki.
Ten artykuł dotyczy testowania projektu platformy .NET Core. Jeśli testujesz projekt ASP.NET Core, zobacz Testy integracji w programie ASP.NET Core.
Wymagania wstępne
- Zestaw .NET 8 SDK lub nowsze wersje.
- Wybrany edytor tekstu lub edytor kodu.
Tworzenie projektu źródłowego
Otwórz okno powłoki. Utwórz katalog o nazwie unit-testing-with-fsharp w celu przechowywania rozwiązania. W tym nowym katalogu uruchom następujące polecenie, aby utworzyć nowy plik rozwiązania dla biblioteki klas i projektu testowego:
dotnet new sln
Następnie utwórz katalog MathService . Poniższy konspekt przedstawia strukturę katalogów i plików do tej pory:
/unit-testing-with-fsharp
unit-testing-with-fsharp.sln
/MathService
Utwórz aplikację MathService w bieżącym katalogu i uruchom następujące polecenie, aby utworzyć projekt źródłowy:
dotnet new classlib -lang "F#"
Tworzenie nieudanej implementacji usługi matematycznej:
module MyMath =
let squaresOfOdds xs = raise (System.NotImplementedException("You haven't written a test yet!"))
Zmień katalog z powrotem na katalog unit-testing-with-fsharp . Uruchom następujące polecenie, aby dodać projekt biblioteki klas do rozwiązania:
dotnet sln add .\MathService\MathService.fsproj
Tworzenie projektu testowego
Następnie utwórz katalog MathService.Tests . W poniższym konspekcie przedstawiono strukturę katalogów:
/unit-testing-with-fsharp
unit-testing-with-fsharp.sln
/MathService
Source Files
MathService.fsproj
/MathService.Tests
Utwórz katalog MathService.Tests jako bieżący katalog i utwórz nowy projekt przy użyciu następującego polecenia:
dotnet new nunit -lang "F#"
To polecenie tworzy projekt testowy, który używa narzędzia NUnit jako struktury testowej. Wygenerowany szablon konfiguruje moduł uruchamiający testy w pliku MathServiceTests.fsproj:
<ItemGroup>
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.9.0" />
<PackageReference Include="NUnit" Version="4.1.0" />
<PackageReference Include="NUnit3TestAdapter" Version="4.5.0" />
</ItemGroup>
Projekt testowy wymaga innych pakietów do tworzenia i uruchamiania testów jednostkowych. dotnet new
w poprzednim kroku dodano element NUnit i kartę testową NUnit. Teraz dodaj bibliotekę MathService
klas jako inną zależność do projektu. dotnet add reference
Użyj polecenia :
dotnet add reference ../MathService/MathService.fsproj
Cały plik można zobaczyć w repozytorium przykładów w witrynie GitHub.
Masz następujący końcowy układ rozwiązania:
/unit-testing-with-fsharp
unit-testing-with-fsharp.sln
/MathService
Source Files
MathService.fsproj
/MathService.Tests
Test Source Files
MathService.Tests.fsproj
Wykonaj następujące polecenie w katalogu unit-testing-with-fsharp :
dotnet sln add .\MathService.Tests\MathService.Tests.fsproj
Tworzenie pierwszego testu
Napisz jeden test zakończony niepowodzeniem, wykonaj go pomyślnie, a następnie powtórz ten proces. Otwórz plik UnitTest1.fs i dodaj następujący kod:
namespace MathService.Tests
open System
open NUnit.Framework
open MathService
[<TestFixture>]
type TestClass () =
[<Test>]
member this.TestMethodPassing() =
Assert.That(true, Is.True)
[<Test>]
member this.FailEveryTime() = Assert.That(false, Is.True)
Atrybut [<TestFixture>]
określa klasę zawierającą testy. Atrybut [<Test>]
określa metodę testową uruchamianą przez moduł uruchamiający testy. W katalogu unit-testing-with-fsharp wykonaj polecenie dotnet test
, aby skompilować testy i bibliotekę klas, a następnie uruchomić testy. Moduł uruchamiający testy NUnit zawiera punkt wejścia programu do uruchamiania testów. dotnet test
uruchamia moduł uruchamiający testy przy użyciu utworzonego projektu testów jednostkowych.
Te dwa testy pokazują najbardziej podstawowe testy z przekazywaniem i niepowodzeniem. My test
przechodzi i Fail every time
kończy się niepowodzeniem. Teraz utwórz test dla squaresOfOdds
metody . Metoda squaresOfOdds
zwraca sekwencję kwadratów wszystkich nieparzystnych wartości całkowitych, które są częścią sekwencji danych wejściowych. Zamiast próbować napisać wszystkie te funkcje jednocześnie, można iteracyjne tworzyć testy sprawdzające funkcjonalność. Aby każdy test przeszedł, należy utworzyć niezbędne funkcje dla metody .
Najprostszym testem, który można napisać, jest wywołanie squaresOfOdds
ze wszystkimi liczbami parzystymi, gdzie wynikiem powinna być pusta sekwencja liczb całkowitych. Oto ten test:
[<Test>]
member this.TestEvenSequence() =
let expected = Seq.empty<int>
let actual = MyMath.squaresOfOdds [2; 4; 6; 8; 10]
Assert.That(actual, Is.EqualTo(expected))
Zwróć uwagę, że expected
sekwencja jest konwertowana na listę. Struktura NUnit opiera się na wielu standardowych typach platformy .NET. Ta zależność oznacza, że interfejs publiczny i oczekiwane wyniki obsługują ICollection , a nie IEnumerable.
Po uruchomieniu testu zobaczysz, że test zakończy się niepowodzeniem. Wynika to z faktu, że jeszcze nie utworzono implementacji. Wykonaj ten test, pisząc najprostszy kod w klasie Library.fs w projekcie MathService, który działa:
let squaresOfOdds xs =
Seq.empty<int>
W katalogu unit-testing-with-fsharp ponownie uruchom polecenie dotnet test
. Polecenie dotnet test
uruchamia kompilację dla MathService
projektu, a następnie dla MathService.Tests
projektu. Po utworzeniu obu projektów uruchamia testy. Teraz przeszły dwa testy.
Spełnianie wymagań
Teraz, gdy wykonano jeden test, nadszedł czas, aby napisać więcej. Następny prosty przypadek działa z sekwencją, której jedyną nieparzystą liczbą jest 1
. Liczba 1 jest łatwiejsza, ponieważ kwadrat 1 wynosi 1. Oto następny test:
[<Test>]
member public this.TestOnesAndEvens() =
let expected = [1; 1; 1; 1]
let actual = MyMath.squaresOfOdds [2; 1; 4; 1; 6; 1; 8; 1; 10]
Assert.That(actual, Is.EqualTo(expected))
Wykonanie testu kończy się niepowodzeniem dotnet test
. Aby obsłużyć ten nowy test, należy zaktualizować metodę squaresOfOdds
. Aby wykonać ten test, należy przefiltrować wszystkie liczby parzyse z sekwencji. Można to zrobić, pisząc małą funkcję filtru i używając polecenia Seq.filter
:
let private isOdd x = x % 2 <> 0
let squaresOfOdds xs =
xs
|> Seq.filter isOdd
Jest jeszcze jeden krok, aby przejść: kwadrat każdej z nieparzystnych liczb. Zacznij od napisania nowego testu:
[<Test>]
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.That(actual, Is.EqualTo(expected))
Test można naprawić, potokując filtrowaną sekwencję za pomocą operacji mapy w celu obliczenia kwadratu każdej liczby nieparzysta:
let private square x = x * x
let private isOdd x = x % 2 <> 0
let squaresOfOdds xs =
xs
|> Seq.filter isOdd
|> Seq.map square
Utworzono małą bibliotekę i zestaw testów jednostkowych dla tej biblioteki. Rozwiązanie zostało ustrukturyzowane tak, aby dodawanie nowych pakietów i testów było częścią normalnego przepływu pracy. Większość czasu i nakładu pracy na rozwiązywaniu celów aplikacji koncentrujesz się na wysiłkach.