Freigeben über


Komponententests für Visual Basic .NET Core-Bibliotheken mit dotnet-Test und xUnit

In diesem Lernprogramm wird gezeigt, wie Sie eine Lösung erstellen, die ein Komponententestprojekt und ein Bibliotheksprojekt enthält. Um dem Lernprogramm mithilfe einer vorgefertigten Lösung zu folgen, zeigen Sie den Beispielcode an oder laden Sie ihn herunter. Anweisungen zum Herunterladen finden Sie unter Beispiele und Lernprogramme.

Erstellen der Lösung

In diesem Abschnitt wird eine Lösung erstellt, die die Quell- und Testprojekte enthält. Die fertige Lösung hat die folgende Verzeichnisstruktur:

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

Die folgenden Anweisungen enthalten die Schritte zum Erstellen der Testlösung. Anweisungen zum Erstellen der Testlösung finden Sie unter "Befehle ", um die Testlösung in einem Schritt zu erstellen.

  • Öffnen eines Shell-Fensters.

  • Führen Sie den folgenden Befehl aus:

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

    Der dotnet new sln Befehl erstellt eine neue Lösung im Verzeichnis "Unit-testing-using-dotnet-test" .

  • Ändern Sie das Verzeichnis in unit-testing-using-dotnet-test.

  • Führen Sie den folgenden Befehl aus:

    dotnet new classlib -o PrimeService -lang VB
    

    Der dotnet new classlib Befehl erstellt ein neues Klassenbibliotheksprojekt im Ordner "PrimeService ". Die neue Klassenbibliothek enthält den zu testenden Code.

  • Benennen Sie Class1.vb in PrimeService.vb um.

  • Ersetzen Sie den Code in PrimeService.vb durch den folgenden Code:

    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
    
  • Der vorherige Code:

    • Löst eine NotImplementedException mit der Meldung aus, dass die Implementierung fehlt.
    • Wird später im Tutorial aktualisiert.
  • Führen Sie im Verzeichnis " Unit-testing-using-dotnet-test" den folgenden Befehl aus, um der Lösung das Klassenbibliotheksprojekt hinzuzufügen:

    dotnet sln add ./PrimeService/PrimeService.vbproj
    
  • Erstellen Sie das Projekt "PrimeService.Tests ", indem Sie den folgenden Befehl ausführen:

    dotnet new xunit -o PrimeService.Tests -lang VB
    
  • Der vorherige Befehl:

    • Erstellt das Projekt "PrimeService.Tests " im Verzeichnis "PrimeService.Tests ". Das Testprojekt verwendet xUnit als Testbibliothek.
    • Konfiguriert den Testläufer durch Hinzufügen der folgenden <PackageReference />Elemente zur Projektdatei:
      • "Microsoft.NET.Test.Sdk"
      • xunit
      • xunit.runner.visualstudio
  • Fügen Sie das Testprojekt der Projektmappendatei hinzu, indem Sie den folgenden Befehl ausführen:

    dotnet sln add ./PrimeService.Tests/PrimeService.Tests.vbproj
    
  • Fügen Sie die PrimeService Klassenbibliothek als Abhängigkeit zum Projekt PrimeService.Tests hinzu:

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

Befehle zum Erstellen der Lösung

In diesem Abschnitt werden alle Befehle im vorherigen Abschnitt zusammengefasst. Überspringen Sie diesen Abschnitt, wenn Sie die Schritte im vorherigen Abschnitt abgeschlossen haben.

Mit den folgenden Befehlen wird die Testlösung auf einem Windows-Computer erstellt. Aktualisieren Sie für macOS und Unix den ren Befehl auf die Betriebssystemversion, ren um eine Datei umzubenennen:

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

Folgen Sie den Anweisungen für "Ersetzen des Codes in PrimeService.vb durch den folgenden Code" im vorherigen Abschnitt.

Einen Test erstellen

Ein beliebter Ansatz bei der testgesteuerten Entwicklung (TDD) besteht darin, einen Test zu schreiben, bevor der Zielcode implementiert wird. In diesem Lernprogramm wird der TDD-Ansatz verwendet. Die IsPrime Methode kann aufgerufen, aber nicht implementiert werden. Ein Testaufruf von IsPrime schlägt fehl. Bei TDD wird ein Test geschrieben, der bekanntermaßen fehlschlägt. Der Zielcode wird aktualisiert, um den Test zu bestehen. Sie wiederholen diesen Ansatz, schreiben einen fehlerhaften Test und aktualisieren dann den Zielcode, um den Test zu bestehen.

Aktualisieren Sie das Projekt PrimeService.Tests :

  • Löschen Sie PrimeService.Tests/UnitTest1.vb.
  • Erstellen Sie eine Datei PrimeService.Tests/PrimeService_IsPrimeShould.vb.
  • Ersetzen Sie den Code in PrimeService_IsPrimeShould.vb durch den folgenden Code:
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

Das [Fact] Attribut deklariert eine Testmethode, die vom Testläufer ausgeführt wird. Führen Sie im Ordner PrimeService.Tests den Befehl dotnet test aus. Der Dotnet-Testbefehl erstellt beide Projekte und führt die Tests aus. Der xUnit-Testläufer enthält den Programmeinstiegspunkt zum Ausführen der Tests. dotnet test startet den Test Runner mithilfe des Komponententestprojekts.

Der Test schlägt fehl, weil IsPrime nicht implementiert wurde. Schreiben Sie mit dem TDD-Ansatz nur genügend Code, damit dieser Test erfolgreich ist. Aktualisieren Sie IsPrime mit folgendem Code:

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

Führen Sie dotnet test aus. Der Test verläuft erfolgreich.

Hinzufügen weiterer Tests

Fügen Sie Primzahlentests für 0 und -1 hinzu. Sie können den vorherigen Test kopieren und den folgenden Code so ändern, dass 0 und -1 verwendet werden:

Dim result As Boolean = _primeService.IsPrime(1)

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

Das Kopieren von Testcode, wenn sich nur ein Parameter ändert, führt zu Codeduplizierung und Testblähung. Die folgenden xUnit-Attribute ermöglichen das Schreiben einer Reihe ähnlicher Tests:

  • [Theory] stellt eine Reihe von Tests dar, die denselben Code ausführen, aber unterschiedliche Eingabeargumente haben.
  • [InlineData] Attribut gibt Werte für diese Eingaben an.

Anstatt neue Tests zu erstellen, wenden Sie die vorherigen xUnit-Attribute an, um eine einzelne Theorie zu erstellen. Ersetzen Sie den folgenden Code:

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

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

durch den folgenden Code:

<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

Im vorangehenden Code ermöglichen [Theory] und [InlineData] das Testen mehrerer Werte, die kleiner als 2 sind. Zwei ist die kleinste Primzahl.

Führen Sie dotnet testaus, zwei der Tests schlagen fehl. Um alle Tests erfolgreich zu machen, aktualisieren Sie die IsPrime Methode mit dem folgenden Code:

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

Fügen Sie nach dem TDD-Ansatz weitere fehlerhafte Tests hinzu, und aktualisieren Sie dann den Zielcode. Sehen Sie sich die fertige Version der Tests und die vollständige Implementierung der Bibliothek an.

Die abgeschlossene IsPrime Methode ist kein effizienter Algorithmus zum Testen der Primalität.

Weitere Ressourcen