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.
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-with-fsharp , um die Lösung zu speichern.
Führen Sie in diesem neuen Verzeichnis dotnet new sln
aus, um eine neue Lösung zu erstellen. Dadurch ist es einfacher, sowohl die Klassenbibliothek als auch das Komponententestprojekt zu verwalten.
Erstellen Sie im Lösungsverzeichnis ein MathService-Verzeichnis . Die Verzeichnis- und Dateistruktur ist bisher nachfolgend dargestellt.
/unit-testing-with-fsharp
unit-testing-with-fsharp.sln
/MathService
Erstellen Sie MathService als aktuelles Verzeichnis, und führen Sie die Ausführung aus dotnet new classlib -lang "F#"
, um das Quellprojekt zu erstellen. Sie erstellen eine fehlerhafte Implementierung des mathematischen Diensts:
module MyMath =
let squaresOfOdds xs = raise (System.NotImplementedException("You haven't written a test yet!"))
Ändern Sie das Verzeichnis wieder in das Verzeichnis unit-testing-with-fsharp. Führen Sie dotnet sln add .\MathService\MathService.fsproj
aus, um der Projektmappe das Klassenbibliotheksprojekt hinzuzufügen.
Erstellen des Testprojekts
Erstellen Sie als Nächstes das Verzeichnis MathService.Tests . Die folgende Gliederung zeigt die Verzeichnisstruktur:
/unit-testing-with-fsharp
unit-testing-with-fsharp.sln
/MathService
Source Files
MathService.fsproj
/MathService.Tests
Erstellen Sie das Verzeichnis MathService.Tests als aktuelles Verzeichnis, und erstellen Sie ein neues Projekt mithilfe von dotnet new mstest -lang "F#"
. Dadurch wird ein Testprojekt erstellt, das MSTest als Testframework verwendet. Die generierte Vorlage konfiguriert den Testläufer in mathServiceTests.fsproj:
<ItemGroup>
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="15.3.0-preview-20170628-02" />
<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 hinzugefügt. Fügen Sie nun die MathService
Klassenbibliothek als weitere Abhängigkeit zum Projekt hinzu. Verwenden Sie den Befehl dotnet reference add
:
dotnet reference add ../MathService/MathService.fsproj
Die ganze Datei finden Sie im Beispielerepository auf GitHub.
Sie haben das folgende endgültige Lösungslayout:
/unit-testing-with-fsharp
unit-testing-with-fsharp.sln
/MathService
Source Files
MathService.fsproj
/MathService.Tests
Test Source Files
MathServiceTests.fsproj
Führen Sie die Ausführung dotnet sln add .\MathService.Tests\MathService.Tests.fsproj
im Verzeichnis "Unit-testing-with-fsharp" aus .
Erstellen des ersten Tests
Du schreibst einen fehlgeschlagenen Test, machst ihn erfolgreich und wiederholst dann den Vorgang. Öffnen Sie Tests.fs , und fügen Sie den folgenden Code hinzu:
namespace MathService.Tests
open System
open Microsoft.VisualStudio.TestTools.UnitTesting
open MathService
[<TestClass>]
type TestClass () =
[<TestMethod>]
member this.TestMethodPassing() =
Assert.IsTrue(true)
[<TestMethod>]
member this.FailEveryTime() = Assert.IsTrue(false)
Das [<TestClass>]
Attribut gibt eine Klasse an, die Tests enthält. Das [<TestMethod>]
Attribut zeigt eine Testmethode an, die vom Testläufer ausgeführt wird. Wechseln Sie in das Verzeichnis "unit-testing-with-fsharp", führen Sie dotnet test
aus, um die Tests und die Klassenbibliothek zu erstellen, und führen Sie dann die Tests aus. 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.
Diese zwei Tests geben jeweils den grundlegendsten bestandenen und fehlerhaften Test an. My test
bestanden und Fail every time
nicht bestanden. Erstellen Sie nun einen Test für die squaresOfOdds
Methode. Die squaresOfOdds
Methode gibt eine Liste der Quadrate aller ungeraden ganzzahligen Werte zurück, die Teil der Eingabesequenz sind. Anstatt alle diese Funktionen gleichzeitig zu schreiben, können Sie iterativ Tests erstellen, die die Funktionalität überprüfen. Jeder Testdurchlauf bedeutet, dass die erforderliche Funktionalität für die Methode erstellt wird.
Der einfachste Test, den wir schreiben können, besteht darin, mit allen geraden Zahlen aufzurufen squaresOfOdds
, wobei das Ergebnis eine leere Folge ganzzahliger Zahlen sein sollte. Hier ist dieser Test:
[<TestMethod>]
member this.TestEvenSequence() =
let expected = Seq.empty<int> |> Seq.toList
let actual = MyMath.squaresOfOdds [2; 4; 6; 8; 10]
Assert.AreEqual(expected, actual)
Beachten Sie, dass die expected
Sequenz in eine Liste konvertiert wurde. Die MSTest-Bibliothek basiert auf vielen standardmäßigen .NET-Typen. Diese Abhängigkeit bedeutet, dass Ihre öffentliche Schnittstelle und die erwarteten Ergebnisse ICollection anstelle von IEnumerable unterstützen.
Wenn Sie den Test ausführen, sehen Sie, dass der Test fehlschlägt. Sie haben die Implementierung noch nicht erstellt. Bringen Sie diesen Test zum Bestehen, indem Sie den einfachsten funktionierenden Code in der Klasse Mathservice
schreiben.
let squaresOfOdds xs =
Seq.empty<int> |> Seq.toList
Führen Sie im Verzeichnis unit-testing-with-fsharp erneut dotnet test
aus. Der Befehl dotnet test
führt einen Build für das MathService
Projekt und dann für das MathService.Tests
Projekt aus. Nachdem beide Projekte erstellt wurden, führt es diesen einzelnen Test aus. Er ist erfolgreich.
Erfüllen der Anforderungen
Nachdem Sie nun einen Test bestanden haben, ist es an der Zeit, mehr zu schreiben. Der nächste einfache Fall funktioniert mit einer Sequenz, deren einzige ungerade Zahl ist 1
. Die Zahl 1 ist einfacher, da das Quadrat von 1 1 ist. Dies ist der nächste Test:
[<TestMethod>]
member public this.TestOnesAndEvens() =
let expected = [1; 1; 1; 1]
let actual = MyMath.squaresOfOdds [2; 1; 4; 1; 6; 1; 8; 1; 10]
Assert.AreEqual(expected, actual)
Die dotnet test
Ausführung schlägt den neuen Test fehl. Sie müssen die squaresOfOdds
Methode aktualisieren, um diesen neuen Test zu behandeln. Sie müssen alle geraden Zahlen aus der Sequenz filtern, um diesen Testdurchlauf durchzuführen. Dazu können Sie eine kleine Filterfunktion schreiben und folgendes verwenden Seq.filter
:
let private isOdd x = x % 2 <> 0
let squaresOfOdds xs =
xs
|> Seq.filter isOdd |> Seq.toList
Beachten Sie den Aufruf von Seq.toList
. Dadurch wird eine Liste erstellt, die die ICollection Schnittstelle implementiert.
Es gibt einen weiteren Schritt: Quadratieren Sie jede der ungeraden Zahlen. Beginnen Sie mit dem Schreiben eines neuen Tests:
[<TestMethod>]
member public this.TestSquaresOfOdds() =
let expected = [1; 9; 25; 49; 81]
let actual = MyMath.squaresOfOdds [1; 2; 3; 4; 5; 6; 7; 8; 9; 10]
Assert.AreEqual(expected, actual)
Sie können den Test beheben, indem Sie für die gefilterte Sequenz einen Zuordnungsvorgang durchführen, um das Quadrat von jeder ungerade Zahl zu berechnen:
let private square x = x * x
let private isOdd x = x % 2 <> 0
let squaresOfOdds xs =
xs
|> Seq.filter isOdd
|> Seq.map square
|> Seq.toList
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.