Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz 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-testPolecenie
dotnet new slntworzy 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 VBPolecenie
dotnet new classlibtworzy 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 NamespacePoprzedni 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.vbprojUtwórz projekt PrimeService.Tests , uruchamiając następujące polecenie:
dotnet new xunit -o PrimeService.Tests -lang VBPoprzednie 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.vbprojDodaj bibliotekę
PrimeServiceklas 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.