Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
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 test
aus, 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.