Udostępnij za pośrednictwem


Testowanie jednostkowe bibliotek platformy .NET Core w języku Visual Basic przy użyciu testów dotnet 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 korzystać z samouczka z gotowym rozwiązaniem, wyświetl lub pobierz przykładowy kod przed rozpoczęciem. 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 integracyjne w ASP.NET Core.

Wymagania wstępne

  • .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-vb-nunit do 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 PrimeService. Na poniższym konspekcie przedstawiono strukturę plików do tej pory:

/unit-testing-vb-nunit
    unit-testing-vb-nunit.sln
    /PrimeService

Ustaw PrimeService jako bieżący katalog i uruchom następujące polecenie, aby utworzyć projekt źródłowy:

dotnet new classlib -lang VB

Zmień nazwę Class1.VB na PrimeService.VB. Utwórz nieudaną implementację klasy PrimeService:

Namespace Prime.Services
    Public Class PrimeService
        Public Function IsPrime(candidate As Integer) As Boolean
            Throw New NotImplementedException("Please create a test first.")
        End Function
    End Class
End Namespace

Zmień katalog z powrotem na unit-testing-vb-using-mstest. Uruchom następujące polecenie, aby dodać projekt biblioteki klas do rozwiązania:

dotnet sln add .\PrimeService\PrimeService.vbproj

Tworzenie projektu testowego

Następnie utwórz katalog PrimeService.Tests. W poniższym zarysie przedstawiono strukturę katalogu:

/unit-testing-vb-nunit
    unit-testing-vb-nunit.sln
    /PrimeService
        Source Files
        PrimeService.vbproj
    /PrimeService.Tests

Ustaw katalog PrimeService.Tests jako bieżący katalog i utwórz nowy projekt przy użyciu następującego polecenia:

dotnet new nunit -lang VB

Polecenie dotnet new tworzy projekt testowy, który używa narzędzia NUnit jako biblioteki testowej. Wygenerowany szablon konfiguruje moduł uruchamiający testy w pliku PrimeServiceTests.vbproj :

<ItemGroup>
  <PackageReference Include="nunit" Version="4.3.2" />
  <PackageReference Include="NUnit3TestAdapter" Version="5.0.0" />
  <PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.14.1" />
</ItemGroup>

Uwaga

Przed platformą .NET 9 wygenerowany kod może odwoływać się do starszych wersji platformy testowej NUnit. Aby zaktualizować pakiety, można użyć dotnet CLI. Alternatywnie otwórz plik PrimeService.Tests.vbproj i zastąp zawartość grupy elementów odwołania do pakietu kodem powyżej.

Projekt testowy wymaga innych pakietów do tworzenia i uruchamiania testów jednostkowych. dotnet new w poprzednim kroku dodano element NUnit i adapter testowy NUnit. Teraz dodaj bibliotekę klas PrimeService jako inną zależność do projektu. Użyj polecenia dotnet reference add:

dotnet reference add ../PrimeService/PrimeService.vbproj

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-vb-nunit
    unit-testing-vb-nunit.sln
    /PrimeService
        Source Files
        PrimeService.vbproj
    /PrimeService.Tests
        Test Source Files
        PrimeService.Tests.vbproj

Wykonaj następujące polecenie w katalogu unit-testing-vb-nunit :

dotnet sln add .\PrimeService.Tests\PrimeService.Tests.vbproj

Tworzenie pierwszego testu

Napisz jeden test zakończony niepowodzeniem, wykonaj go pomyślnie, a następnie powtórz ten proces. W katalogu PrimeService.Tests zmień nazwę pliku UnitTest1.vb na PrimeService_IsPrimeShould.VB i zastąp całą jego zawartość następującym kodem:

Imports NUnit.Framework

Namespace PrimeService.Tests
    <TestFixture>
    Public Class PrimeService_IsPrimeShould
        Private _primeService As Prime.Services.PrimeService = New Prime.Services.PrimeService()

        <Test>
        Sub IsPrime_InputIs1_ReturnFalse()
            Dim result As Boolean = _primeService.IsPrime(1)

            Assert.That(result, [Is].False, $"1 should not be prime")
        End Sub

    End Class
End Namespace

Atrybut <TestFixture> wskazuje klasę zawierającą testy. Atrybut <Test> określa metodę uruchamianą przez moduł uruchamiający testy. W pliku unit-testing-vb-nunit wykonaj polecenie dotnet test , aby skompilować testy i bibliotekę klas, a następnie uruchomić testy. Narzędzie do uruchamiania testów NUnit zawiera punkt startowy programu do wykonywania testów. dotnet test uruchamia uruchamiacz testów przy użyciu utworzonego przez Ciebie projektu testów jednostkowych.

Test kończy się niepowodzeniem. Nie utworzyłeś jeszcze implementacji. Wykonaj ten test, pisząc najprostszy kod w klasie PrimeService, która działa:

Public Function IsPrime(candidate As Integer) As Boolean
    If candidate = 1 Then
        Return False
    End If
    Throw New NotImplementedException("Please create a test first.")
End Function

W katalogu unit-testing-vb-nunit uruchom ponownie dotnet test. Polecenie dotnet test uruchamia kompilację dla projektu PrimeService, a następnie dla projektu PrimeService.Tests. Po utworzeniu obu projektów, wykonuje się ten pojedynczy test. Przechodzi.

Dodawanie większej liczby funkcji

Teraz, gdy zrealizowałeś jeden test, nadszedł czas, aby napisać więcej. Istnieje kilka innych prostych przypadków dla liczb pierwszych: 0, -1. Można dodać te przypadki jako nowe testy z atrybutem <Test> , ale to szybko staje się żmudne. Istnieją inne atrybuty xUnit, które umożliwiają pisanie zestawu podobnych testów. Atrybut <TestCase> reprezentuje zestaw testów, które wykonują ten sam kod, ale mają różne argumenty wejściowe. Możesz użyć atrybutu <TestCase>, aby określić wartości dla tych danych wejściowych.

Zamiast tworzyć nowe testy, zastosuj te dwa atrybuty, aby utworzyć serię testów, które testuje kilka wartości mniejszych niż dwa, co jest najmniejszą liczbą pierwszą:

<TestFixture>
Public Class PrimeService_IsPrimeShould
    Private _primeService As Prime.Services.PrimeService = New Prime.Services.PrimeService()

    <TestCase(-1)>
    <TestCase(0)>
    <TestCase(1)>
    Sub IsPrime_ValuesLessThan2_ReturnFalse(value As Integer)
        Dim result As Boolean = _primeService.IsPrime(value)

        Assert.That(result, [Is].False, $"{value} should not be prime")
    End Sub

    <TestCase(2)>
    <TestCase(3)>
    <TestCase(5)>
    <TestCase(7)>
    Public Sub IsPrime_PrimesLessThan10_ReturnTrue(value As Integer)
        Dim result As Boolean = _primeService.IsPrime(value)

        Assert.That(result, [Is].True, $"{value} should be prime")
    End Sub

    <TestCase(4)>
    <TestCase(6)>
    <TestCase(8)>
    <TestCase(9)>
    Public Sub IsPrime_NonPrimesLessThan10_ReturnFalse(value As Integer)
        Dim result As Boolean = _primeService.IsPrime(value)

        Assert.That(result, [Is].False, $"{value} should not be prime")
    End Sub
End Class

Uruchom dotnet test, a dwa z tych testów kończą się niepowodzeniem. Aby wszystkie testy przeszły, zmień klauzulę if na początku Main metody w pliku PrimeServices.cs :

if candidate < 2

Kontynuuj iterowanie, dodając więcej testów, więcej teorii i więcej kodu w bibliotece głównej. Masz ukończoną wersję testów i kompletną wersję implementacji biblioteki.

Ty zbudowałeś 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. Skoncentrowałeś większość swojego czasu i wysiłku na osiągnięciu celów aplikacji.