Freigeben über


Komponententests von Visual Basic .NET Core-Bibliotheken mit Dotnet-Test und MSTest

Dieses Tutorial führt Sie interaktiv Schritt für Schritt durch das Erstellen einer Beispielprojektmappe, um die Konzepte von Komponententests zu erlernen. Wenn Sie dem Tutorial lieber mit einer vorgefertigten Projektmappe folgen, zeigen Sie den Beispielcode an, oder laden Sie ihn herunter, bevor Sie beginnen. Anweisungen zum Herunterladen finden Sie unter Beispiele und Lernprogramme.

In diesem Artikel wird ein .NET Core-Projekt getestet. Wenn Sie ein ASP.NET Core-Projekt testen, finden Sie weitere Informationen unter Integrationstests in ASP.NET Core.

Erstellen des Quellprojekts

Öffnen eines Shell-Fensters. Erstellen Sie ein Verzeichnis namens unit-testing-vb-mstest-, um die Lösung zu speichern. Führen Sie in diesem neuen Verzeichnis dotnet new sln aus, um eine neue Lösung zu erstellen. Diese Übung erleichtert das Verwalten der Klassenbibliothek und des Komponententestprojekts. Erstellen Sie im Projektmappenverzeichnis ein PrimeService-Verzeichnis. Sie haben bisher die folgende Verzeichnis- und Dateistruktur:

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

Machen Sie PrimeService zum aktuellen Verzeichnis und führen Sie dotnet new classlib -lang VB aus, um das Quellprojekt zu erstellen. Benennen Sie Class1.VB in PrimeService.VBum. Sie erstellen eine fehlerhafte Implementierung der Klasse 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

Ändern Sie das Verzeichnis wieder in das Verzeichnis unit-testing-vb-using-mstest. Führen Sie dotnet sln add .\PrimeService\PrimeService.vbproj aus, um der Projektmappe das Klassenbibliotheksprojekt hinzuzufügen.

Erstellen des Testprojekts

Erstellen Sie als Nächstes das Verzeichnis PrimeService.Tests. Die folgende Gliederung zeigt die Verzeichnisstruktur:

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

Machen Sie das PrimeService.Tests-Verzeichnis zum aktuellen Verzeichnis, und erstellen Sie ein neues Projekt mit dotnet new mstest -lang VB. Dieser Befehl erstellt ein Testprojekt, das MSTest als Testbibliothek verwendet. Die generierte Vorlage konfiguriert Test Runner in PrimeServiceTests.vbproj:

<ItemGroup>
  <PackageReference Include="Microsoft.NET.Test.Sdk" Version="15.5.0" />
  <PackageReference Include="MSTest.TestAdapter" Version="1.1.18" />
  <PackageReference Include="MSTest.TestFramework" Version="1.1.18" />
</ItemGroup>

Das Testprojekt erfordert andere Pakete zum Erstellen und Ausführen von Komponententests. dotnet new hat im vorherigen Schritt MSTest und MSTest Runner hinzugefügt. Fügen Sie nun die PrimeService Klassenbibliothek als weitere Abhängigkeit zum Projekt hinzu. Verwenden Sie den Befehl dotnet add reference:

dotnet add reference ../PrimeService/PrimeService.vbproj

Die ganze Datei finden Sie im Beispielerepository auf GitHub.

Sie haben das folgende endgültige Lösungslayout:

/unit-testing-vb-mstest
    unit-testing-vb-mstest.sln
    /PrimeService
        Source Files
        PrimeService.vbproj
    /PrimeService.Tests
        Test Source Files
        PrimeServiceTests.vbproj

Führen Sie dotnet sln add .\PrimeService.Tests\PrimeService.Tests.vbproj im Verzeichnis unit-testing-vb-mstest aus.

Erstellen des ersten Tests

Du schreibst einen fehlgeschlagenen Test, machst ihn erfolgreich und wiederholst dann den Vorgang. Entfernen Sie UnitTest1.vb aus dem Verzeichnis PrimeService.Tests, und erstellen Sie eine neue Visual Basic-Datei mit dem Namen PrimeService_IsPrimeShould.VB. Fügen Sie den folgenden Code hinzu:

Imports Microsoft.VisualStudio.TestTools.UnitTesting

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

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

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

    End Class
End Namespace

Das attribut <TestClass> gibt eine Klasse an, die Tests enthält. Das attribut <TestMethod> bezeichnet eine Methode, die vom Testläufer ausgeführt wird. Führen Sie im Verzeichnis unit-testing-vb-mstestdotnet test aus, um die Tests und die Klassenbibliothek zu erstellen und anschließend die Tests auszuführen. Der MSTest Test Runner verfügt über den Programmeinstiegspunkt zum Ausführen der Tests. dotnet test startet Test Runner mithilfe des von Ihnen erstellten Komponententestprojekts.

Ihr Test schlägt fehl. Sie haben die Implementierung noch nicht erstellt. Bringen Sie diesen Test zum Bestehen, indem Sie den einfachsten funktionierenden Code in der Klasse PrimeService schreiben.

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

Führen Sie im Verzeichnis unit-testing-vb-mstest erneut dotnet test aus. Der Befehl dotnet test führt einen Build für das PrimeService Projekt und dann für das PrimeService.Tests Projekt aus. Nachdem beide Projekte erstellt wurden, führt es diesen einzelnen Test aus. Er ist erfolgreich.

Hinzufügen weiterer Funktionen

Nachdem Sie nun einen Test bestanden haben, ist es an der Zeit, mehr zu schreiben. Es gibt einige andere einfache Fälle für Primzahlen: 0, -1. Sie können diese Fälle als neue Tests mit dem attribut <TestMethod> hinzufügen, aber das wird schnell mühsam. Es gibt weitere MSTest-Attribute, mit denen Sie eine Reihe ähnlicher Tests schreiben können. Sie können das Attribut <DataRow> zusammen mit dem Attribut <TestMethod> verwenden, um Werte für diese Eingaben anzugeben.

Anstatt neue Tests zu erstellen, wenden Sie diese beiden Attribute an, um eine einzelne Theorie zu erstellen. Die Theorie ist eine Methode, die mehrere Werte unter zwei testet, was die niedrigste Primzahl ist:

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

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

        Assert.IsFalse(result, $"{value} should not be prime")
    End Sub

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

        Assert.IsTrue(result, $"{value} should be prime")
    End Sub

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

        Assert.IsFalse(result, $"{value} should not be prime")
    End Sub
End Class

Führen Sie dotnet test aus und zwei dieser Tests schlagen fehl. Um alle Tests erfolgreich zu machen, ändern Sie die if-Klausel am Anfang der Methode:

if candidate < 2

Fahren Sie fort, indem Sie weitere Tests, mehr Theorien und mehr Code in der Hauptbibliothek hinzufügen. Sie verfügen über die endgültige Version der Tests und die vollständige Implementierung der Bibliothek.

Sie haben eine kleine Bibliothek und eine Reihe von Unittests für diese Bibliothek erstellt. Sie haben die Lösung so strukturiert, dass das Hinzufügen neuer Pakete und Tests Teil des normalen Workflows ist. Sie haben die meiste Zeit und Mühe auf die Erreichung der Ziele der Anwendung konzentriert.