Testování částí knihoven .NET Core v jazyce Visual Basic pomocí testu dotnet a xUnit

V tomto kurzu se dozvíte, jak sestavit řešení obsahující projekt testování jednotek a projekt knihovny. Pokud chcete postupovat podle kurzu pomocí předem připraveného řešení, zobrazte nebo stáhněte ukázkový kód. Pokyny ke stažení najdete v tématu Ukázky a kurzy.

Vytvoření řešení

V této části se vytvoří řešení, které obsahuje zdrojové a testovací projekty. Dokončené řešení má následující adresářovou strukturu:

/unit-testing-using-dotnet-test
    unit-testing-using-dotnet-test.sln
    /PrimeService
        PrimeService.vb
        PrimeService.vbproj
    /PrimeService.Tests
        PrimeService_IsPrimeShould.vb
        PrimeServiceTests.vbproj

Následující pokyny obsahují postup vytvoření testovacího řešení. Pokyny k vytvoření testovacího řešení najdete v tématu Příkazy pro vytvoření testovacího řešení v jednom kroku.

  • Otevřete okno prostředí.

  • Spusťte následující příkaz:

    dotnet new sln -o unit-testing-using-dotnet-test
    

    Příkaz dotnet new sln vytvoří nové řešení v adresáři unit-testing-using-dotnet-test .

  • Změňte adresář na složku unit-testing-using-dotnet-test .

  • Spusťte následující příkaz:

    dotnet new classlib -o PrimeService --lang VB
    

    Příkaz dotnet new classlib vytvoří nový projekt knihovny tříd ve složce PrimeService . Nová knihovna tříd bude obsahovat kód, který se má testovat.

  • Přejmenujte Class1.vb na PrimeService.vb.

  • Nahraďte kód v PrimeService.vb následujícím kódem:

    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
    
  • Předchozí kód:

    • NotImplementedException Vyvolá zprávu s oznámením, že není implementována.
    • Aktualizuje se později v tomto kurzu.
  • V adresáři unit-testing-using-dotnet-test spusťte následující příkaz, který do řešení přidá projekt knihovny tříd:

    dotnet sln add ./PrimeService/PrimeService.vbproj
    
  • Spuštěním následujícího příkazu vytvořte projekt PrimeService.Tests :

    dotnet new xunit -o PrimeService.Tests
    
  • Předchozí příkaz:

    • Vytvoří projekt PrimeService.Tests v adresáři PrimeService.Tests. Testovací projekt používá jako testovací knihovnu xUnit .
    • Nakonfiguruje spouštěč testů přidáním následujících <PackageReference />prvků do souboru projektu:
      • Microsoft.NET.Test.Sdk
      • "xunit"
      • "xunit.runner.visualstudio"
  • Spuštěním následujícího příkazu přidejte testovací projekt do souboru řešení:

    dotnet sln add ./PrimeService.Tests/PrimeService.Tests.vbproj
    
  • Přidejte knihovnu PrimeService tříd jako závislost do projektu PrimeService.Tests :

    dotnet add ./PrimeService.Tests/PrimeService.Tests.vbproj reference ./PrimeService/PrimeService.vbproj  
    

Příkazy pro vytvoření řešení

Tato část shrnuje všechny příkazy v předchozí části. Pokud jste dokončili kroky v předchozí části, přeskočte tuto část.

Následující příkazy vytvoří testovací řešení na počítači s Windows. Pro macOS a Unix aktualizujte ren příkaz na verzi operačního ren systému, aby se soubor přejmenoval:

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
dotnet add ./PrimeService.Tests/PrimeService.Tests.vbproj reference ./PrimeService/PrimeService.vbproj
dotnet sln add ./PrimeService.Tests/PrimeService.Tests.vbproj

Postupujte podle pokynů k nahrazení kódu v PrimeService.vb následujícím kódem v předchozí části.

Vytvoření testu

Oblíbeným přístupem při vývoji řízeném testy (TDD) je napsat test před implementací cílového kódu. V tomto kurzu se používá přístup TDD. Metoda IsPrime je volán, ale není implementována. Testovací volání selže IsPrime . S TDD je napsán test, který je známý jako selhání. Cílový kód se aktualizuje, aby byl test úspěšný. Tento přístup opakujete, napíšete neúspěšný test a pak aktualizujete cílový kód tak, aby prošel.

Aktualizujte projekt PrimeService.Tests:

  • Odstraňte PrimeService.Tests/UnitTest1.vb.
  • Vytvořte soubor PrimeService.Tests/PrimeService_IsPrimeShould.vb .
  • Nahraďte kód v PrimeService_IsPrimeShould.vb následujícím kódem:
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

Atribut [Fact] deklaruje testovací metodu, kterou spouští spouštěč testů. Ve složce PrimeService.Tests spusťte dotnet testpříkaz . Příkaz dotnet test sestaví projekty i spustí testy. Spouštěč testů xUnit obsahuje vstupní bod programu pro spuštění testů. dotnet test spustí spouštěč testů pomocí projektu testu jednotek.

Test selže, protože IsPrime nebyl implementován. Pomocí přístupu TDD napište pouze dostatečný kód, aby tento test projde. Aktualizujte IsPrime následujícím kódem:

Public Function IsPrime(candidate As Integer) As Boolean
    If candidate = 1 Then
        Return False
    End If
    Throw New NotImplementedException("Not implemented.")
End Function

Spusťte dotnet test. Test projde.

Přidání dalších testů

Přidejte první číselné testy pro 0 a -1. Předchozí test můžete zkopírovat a změnit následující kód tak, aby používal 0 a -1:

Dim result As Boolean = _primeService.IsPrime(1)

Assert.False(result, "1 should not be prime")

Kopírování testovacího kódu, když se změní jenom parametr, způsobí duplikaci kódu a testovací bloudí. Následující atributy xUnit umožňují psát sadu podobných testů:

  • [Theory] představuje sadu testů, které provádějí stejný kód, ale mají různé vstupní argumenty.
  • [InlineData] atribut určuje hodnoty pro tyto vstupy.

Místo vytváření nových testů použijte předchozí atributy xUnit k vytvoření jediné teorie. Nahraďte následující kód:

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

    Assert.False(result, "1 should not be prime")
End Sub

s následujícím kódem:

<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

V předchozím kódu [Theory] a [InlineData] povolte testování několika hodnot menší než dvě. Dvě jsou nejmenším primárním číslem.

Spusťte dotnet test, dva testy selžou. Pokud chcete, aby všechny testy prošly, aktualizujte metodu IsPrime následujícím kódem:

Public Function IsPrime(candidate As Integer) As Boolean
    If candidate < 2 Then
        Return False
    End If
    Throw New NotImplementedException("Not fully implemented.")
End Function

Podle přístupu TDD přidejte další neúspěšné testy a pak aktualizujte cílový kód. Podívejte se na dokončenou verzi testů a kompletní implementaci knihovny.

Dokončená IsPrime metoda není efektivní algoritmus pro testování primality.

Další materiály