Uwaga
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
W tym samouczku pokazano, jak utworzyć rozwiązanie zawierające projekt testów jednostkowych i projekt biblioteki. Aby wykonać czynności opisane w samouczku przy użyciu wstępnie utworzonego rozwiązania, wyświetl lub pobierz przykładowy kod. Aby uzyskać instrukcje dotyczące pobierania, zobacz Przykłady i samouczki.
Tworzenie rozwiązania
W tej sekcji tworzone jest rozwiązanie zawierające projekty źródłowe i testowe. Ukończone rozwiązanie ma następującą strukturę katalogów:
/unit-testing-using-dotnet-test
unit-testing-using-dotnet-test.sln
/PrimeService
PrimeService.vb
PrimeService.vbproj
/PrimeService.Tests
PrimeService_IsPrimeShould.vb
PrimeServiceTests.vbproj
Poniższe instrukcje zawierają kroki tworzenia rozwiązania testowego. Zobacz Polecenia służące do tworzenia rozwiązania testowego, aby uzyskać instrukcje dotyczące tworzenia rozwiązania testowego w jednym kroku.
Otwórz okno powłoki.
Uruchom następujące polecenie:
dotnet new sln -o unit-testing-using-dotnet-test
Polecenie
dotnet new sln
tworzy nowe rozwiązanie w katalogu unit-testing-using-dotnet-test .Zmień katalog na folder unit-testing-using-dotnet-test .
Uruchom następujące polecenie:
dotnet new classlib -o PrimeService -lang VB
Polecenie
dotnet new classlib
tworzy nowy projekt biblioteki klas w folderze PrimeService . Nowa biblioteka klas będzie zawierać kod do przetestowania.Zmień nazwę Class1.vb na PrimeService.vb.
Zastąp kod w PrimeService.vb następującym kodem:
Imports System Namespace Prime.Services Public Class PrimeService Public Function IsPrime(candidate As Integer) As Boolean Throw New NotImplementedException("Not implemented.") End Function End Class End Namespace
Poprzedni kod:
- Zgłasza wyjątek NotImplementedException z komunikatem wskazującym, że nie został zaimplementowany.
- Zostanie zaktualizowany w dalszej części tego samouczka.
W katalogu unit-testing-using-dotnet-test uruchom następujące polecenie, aby dodać projekt biblioteki klas do rozwiązania:
dotnet sln add ./PrimeService/PrimeService.vbproj
Utwórz projekt PrimeService.Tests , uruchamiając następujące polecenie:
dotnet new xunit -o PrimeService.Tests -lang VB
Poprzednie polecenie:
- Tworzy projekt PrimeService.Tests w katalogu PrimeService.Tests . Projekt testowy używa narzędzia xUnit jako biblioteki testowej.
- Konfiguruje moduł uruchamiający testy przez dodanie następujących
<PackageReference />
elementów do pliku projektu:- "Microsoft.NET.Test.Sdk"
- "xunit"
- xunit.runner.visualstudio
Dodaj projekt testowy do pliku rozwiązania, uruchamiając następujące polecenie:
dotnet sln add ./PrimeService.Tests/PrimeService.Tests.vbproj
Dodaj bibliotekę
PrimeService
klas jako zależność do projektu PrimeService.Tests :dotnet add ./PrimeService.Tests/PrimeService.Tests.vbproj reference ./PrimeService/PrimeService.vbproj
Polecenia umożliwiające utworzenie rozwiązania
Ta sekcja zawiera podsumowanie wszystkich poleceń w poprzedniej sekcji. Pomiń tę sekcję, jeśli wykonano kroki opisane w poprzedniej sekcji.
Następujące polecenia umożliwiają utworzenie rozwiązania testowego na maszynie z systemem Windows. W przypadku systemów macOS i Unix zaktualizuj ren
polecenie do wersji ren
systemu operacyjnego, aby zmienić nazwę pliku:
dotnet new sln -o unit-testing-using-dotnet-test
cd unit-testing-using-dotnet-test
dotnet new classlib -o PrimeService
ren .\PrimeService\Class1.vb PrimeService.vb
dotnet sln add ./PrimeService/PrimeService.vbproj
dotnet new xunit -o PrimeService.Tests -lang VB
dotnet add ./PrimeService.Tests/PrimeService.Tests.vbproj reference ./PrimeService/PrimeService.vbproj
dotnet sln add ./PrimeService.Tests/PrimeService.Tests.vbproj
Postępuj zgodnie z instrukcjami dotyczącymi funkcji "Zastąp kod w PrimeService.vb następującym kodem" w poprzedniej sekcji.
Tworzenie testu
Popularnym podejściem w procesie programowania opartego na testach (TDD) jest napisanie testu przed zaimplementowaniem kodu docelowego. W tym samouczku stosowane jest podejście TDD. Metoda IsPrime
jest wywoływana, ale nie zaimplementowana. Połączenie testowe IsPrime
kończy się niepowodzeniem. W TDD najpierw pisze się test, który wiadomo, że początkowo się nie powiedzie. Kod docelowy jest aktualizowany w celu zaliczenia testu. Powtarzasz tę metodę, pisząc test, który kończy się niepowodzeniem, a następnie modyfikując kod docelowy, aby przeszedł.
Zaktualizuj projekt PrimeService.Tests :
- Usuń plik PrimeService.Tests/UnitTest1.vb.
- Utwórz plik PrimeService.Tests/PrimeService_IsPrimeShould.vb .
- Zastąp kod w PrimeService_IsPrimeShould.vb następującym kodem:
Imports Xunit
Namespace PrimeService.Tests
Public Class PrimeService_IsPrimeShould
Private ReadOnly _primeService As Prime.Services.PrimeService
Public Sub New()
_primeService = New Prime.Services.PrimeService()
End Sub
<Fact>
Sub IsPrime_InputIs1_ReturnFalse()
Dim result As Boolean = _primeService.IsPrime(1)
Assert.False(result, "1 should not be prime")
End Sub
End Class
End Namespace
Atrybut [Fact]
deklaruje metodę testową uruchamianą przez moduł uruchamiający testy. W folderze PrimeService.Tests uruchom dotnet test
. Polecenie dotnet test kompiluje zarówno projekty, jak i uruchamia testy. Moduł xUnit uruchamiający testy zawiera punkt wejścia programu do ich uruchomienia.
dotnet test
uruchamia testy za pomocą projektu testów jednostkowych.
Test kończy się niepowodzeniem, ponieważ IsPrime
nie został zaimplementowany. Korzystając z podejścia TDD, napisz tylko wystarczająco dużo kodu, aby ten test przebiegł pomyślnie. Zaktualizuj IsPrime
za pomocą następującego kodu:
Public Function IsPrime(candidate As Integer) As Boolean
If candidate = 1 Then
Return False
End If
Throw New NotImplementedException("Not implemented.")
End Function
Uruchom program dotnet test
. Test zakończy się pomyślnie.
Dodawanie kolejnych testów
Dodaj testy liczb pierwszych dla 0 i -1. Możesz skopiować poprzedni test i zmienić następujący kod, aby użyć 0 i -1:
Dim result As Boolean = _primeService.IsPrime(1)
Assert.False(result, "1 should not be prime")
Kopiowanie kodu testowego, gdy zmienia się tylko parametr, prowadzi do duplikowania kodu i rozrostu testów. Następujące atrybuty xUnit umożliwiają pisanie zestawu podobnych testów:
-
[Theory]
reprezentuje zestaw testów, które wykonują ten sam kod, ale mają różne argumenty wejściowe. -
[InlineData]
atrybut określa wartości dla tych danych wejściowych.
Zamiast tworzyć nowe testy, zastosuj poprzednie atrybuty xUnit, aby utworzyć jedną teorię. Zastąp następujący kod:
<Fact>
Sub IsPrime_InputIs1_ReturnFalse()
Dim result As Boolean = _primeService.IsPrime(1)
Assert.False(result, "1 should not be prime")
End Sub
z następującym kodem:
<Theory>
<InlineData(-1)>
<InlineData(0)>
<InlineData(1)>
Sub IsPrime_ValuesLessThan2_ReturnFalse(ByVal value As Integer)
Dim result As Boolean = _primeService.IsPrime(value)
Assert.False(result, $"{value} should not be prime")
End Sub
W poprzednim kodzie [Theory]
i [InlineData]
umożliwiają testowanie wartości mniejszych niż dwa. Dwa to najmniejsza liczba główna.
Uruchom polecenie dotnet test
, dwa testy kończą się niepowodzeniem. Aby wszystkie testy przeszły, zaktualizuj metodę IsPrime
przy użyciu następującego kodu:
Public Function IsPrime(candidate As Integer) As Boolean
If candidate < 2 Then
Return False
End If
Throw New NotImplementedException("Not fully implemented.")
End Function
Zgodnie z podejściem TDD dodaj więcej testów zakończonych niepowodzeniem, a następnie zaktualizuj kod docelowy. Zobacz ukończoną wersję testów i pełną implementację biblioteki.
Ukończona IsPrime
metoda nie jest wydajnym algorytmem sprawdzania liczb pierwszych.