Erste Schritte mit C# 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.

Voraussetzungen

Erstellen des Quellprojekts

Öffnen eines Shell-Fensters. Erstellen Sie ein Verzeichnis namens unit-testing-using-mstest , um die Lösung zu speichern. Führen Sie in diesem neuen Verzeichnis den Befehl dotnet new sln aus, um eine neue Lösungsdatei für die Klassenbibliothek und das Testprojekt zu erstellen. Erstellen Sie ein PrimeService-Verzeichnis . Die folgende Gliederung zeigt bisher die Verzeichnis- und Dateistruktur:

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

Machen Sie PrimeService zum aktuellen Verzeichnis und führen Sie dotnet new classlib aus, um das Quellprojekt zu erstellen.

Ändern Sie das Verzeichnis wieder in das Verzeichnis unit-testing-using-mstest. Führen Sie dotnet sln add aus, um das Klassenbibliotheksprojekt zur Projektmappe hinzuzufügen:

dotnet sln add PrimeService/PrimeService.csproj

Benennen Sie Class1.cs im Verzeichnis PrimeService in PrimeService.cs um. Ersetzen Sie den Code in der Datei durch den folgenden Code, um eine fehlerhafte Implementierung der PrimeService Klasse zu erstellen:

using System;

namespace Prime.Services
{
    public class PrimeService
    {
        public bool IsPrime(int candidate)
        {
            throw new NotImplementedException("Please create a test first.");
        }
    }
}

Erstellen des Testprojekts

Erstellen Sie das Verzeichnis "PrimeService.Tests ". Die folgende Gliederung zeigt die Verzeichnisstruktur:

/unit-testing-using-mstest
    unit-testing-using-mstest.sln
    /PrimeService
        Source Files
        PrimeService.csproj
    /PrimeService.Tests

Machen Sie das PrimeService.Tests-Verzeichnis zum aktuellen Verzeichnis, und erstellen Sie ein neues Projekt mit dotnet new mstest. Der neue Befehl dotnet erstellt ein Testprojekt, das MSTest als Testbibliothek verwendet. Die Vorlage konfiguriert den Testläufer in der Datei "PrimeServiceTests.csproj ":

<ItemGroup>
  <PackageReference Include="MSTest" Version="4.1.0" />
</ItemGroup>

Note

Die gezeigten Paketversionen sind Beispiele. Die von dotnet new mstest generierten Versionen hängen von Ihrem .NET SDK ab. Vorlagen und heruntergeladene Beispiele verwenden möglicherweise nicht die neuesten NuGet-Paketversionen.

Führen Sie aus dem Testprojektverzeichnis aus, dotnet package list --outdated um nach dem Erstellen und Ausführen ihrer Tests nach Updates zu suchen. Verwenden Sie dotnet package add <PACKAGE_NAME>, um einen Paketverweis auf die neueste kompatible stabile Version zu aktualisieren. Überprüfen Sie vor der Aktualisierung die Versionshinweise auf grundlegende Änderungen, und führen Sie dotnet test anschließend erneut aus.

Wenn Sie .NET 9 SDK oder eine frühere Version verwenden, verwenden Sie stattdessen dotnet list package --outdated und dotnet add package <PACKAGE_NAME>.

Das Testprojekt erfordert andere Pakete zum Erstellen und Ausführen von Komponententests. dotnet new hat im vorherigen Schritt die erforderlichen MSTest-Pakete und Tools für die Codeabdeckungsberichte hinzugefügt.

Fügen Sie die PrimeService Klassenbibliothek als weitere Abhängigkeit zum Projekt hinzu. Verwenden Sie den Befehl dotnet reference add:

dotnet reference add ../PrimeService/PrimeService.csproj

Die ganze Datei finden Sie im Beispielerepository auf GitHub.

Die folgende Gliederung zeigt das endgültige Lösungslayout:

/unit-testing-using-mstest
    unit-testing-using-mstest.sln
    /PrimeService
        Source Files
        PrimeService.csproj
    /PrimeService.Tests
        Test Source Files
        PrimeServiceTests.csproj

Wechseln Sie zum Verzeichnis "unit-testing-using-mstest", und führen Sie den Befehl dotnet sln add aus.

dotnet sln add ./PrimeService.Tests/PrimeService.Tests.csproj

Erstellen des ersten Tests

Schreiben Sie einen fehlgeschlagenen Test, machen Sie ihn erfolgreich, und wiederholen Sie den Vorgang. Entfernen Sie UnitTest1.cs aus dem Verzeichnis "PrimeService.Tests ", und erstellen Sie eine neue C#-Datei namens PrimeService_IsPrimeShould.cs mit dem folgenden Inhalt:

using Microsoft.VisualStudio.TestTools.UnitTesting;
using Prime.Services;

namespace Prime.UnitTests.Services
{
    [TestClass]
    public class PrimeService_IsPrimeShould
    {
        private readonly PrimeService _primeService;

        public PrimeService_IsPrimeShould()
        {
            _primeService = new PrimeService();
        }

        [TestMethod]
        public void IsPrime_InputIs1_ReturnFalse()
        {
            bool result = _primeService.IsPrime(1);

            Assert.IsFalse(result, "1 shouldn't be prime");
        }
    }
}

Das TestClass-Attribut gibt eine Klasse an, die Komponententests enthält. Das TestMethod-Attribut gibt an, dass es sich bei einer Methode um eine Testmethode handelt.

MSTest erstellt für jeden Test eine neue Instanz der Testklasse, sodass der Konstruktor für jeden Test eine separate PrimeService Instanz erstellt. Der Konstruktor enthält nur Setup, das jeder Test in dieser Klasse benötigt. Wenn Ihre Tests unterschiedliche Setups benötigen, erstellen Sie Objekte in den Testmethoden, oder rufen Sie Hilfsmethoden aus diesen Methoden auf. Weitere Informationen finden Sie unter Verwenden von Hilfsmethoden anstelle von Setup und Teardown.

Speichern Sie diese Datei, und führen Sie sie aus dotnet test , um die Tests und die Klassenbibliothek zu erstellen und dann die Tests auszuführen. Der MSTest Test Runner verfügt über den Programmeinstiegspunkt zum Ausführen der Tests. dotnet test startet den Testläufer mit dem von Ihnen erstellten Komponententestprojekt.

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

public bool IsPrime(int candidate)
{
    if (candidate == 1)
    {
        return false;
    }
    throw new NotImplementedException("Please create a test first.");
}

Führen Sie im Verzeichnis unit-testing-using-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 Features

Nachdem Sie nun einen Testdurchlauf bestanden haben, ist es an der Zeit, mehr zu schreiben. Es gibt einige andere einfache Fälle für Primzahlen: 0, -1. Sie könnten neue Tests mit dem TestMethod-Attribut hinzufügen, aber das wird schnell mühsam. Es gibt weitere MSTest-Attribute, mit denen Sie eine Reihe ähnlicher Tests schreiben können. Eine Testmethode kann denselben Code ausführen, hat jedoch unterschiedliche Eingabeargumente. Sie können das DataRow-Attribut verwenden, um Werte für diese Eingaben anzugeben.

Anstatt neue Tests zu erstellen, wenden Sie diese beiden Attribute an, um einen einzelnen datengesteuerten Test zu erstellen. Bei dem datengesteuerten Test handelt es sich um eine Methode, die mehrere Werte testet, die kleiner als zwei sind, was die niedrigste Primzahl ist. Fügen Sie in PrimeService_IsPrimeShould.cs eine neue Testmethode hinzu:

[TestMethod]
[DataRow(-1)]
[DataRow(0)]
[DataRow(1)]
public void IsPrime_ValuesLessThan2_ReturnFalse(int value)
{
    bool result = _primeService.IsPrime(value);

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

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 IsPrime Methode in der datei PrimeService.cs :

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 Komponententests 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 konzentrierten sich größtenteils auf die Lösung der Ziele der Anwendung.

Ausführen von Tests in Azure Pipelines

Wenn Sie Ihre Tests automatisch ausführen möchten, wenn Sie Änderungen pushen, fügen Sie dem Repository, das Ihre fertige Lösung enthält, eine Azure Pipelines Konfiguration hinzu. Sie benötigen ein Azure DevOps Projekt und Zugriff auf einen Microsoft gehosteten Agent. Voraussetzungen finden Sie unter Erstellen Sie Ihre erste Pipeline.

  1. Erstellen Sie im Stammverzeichnis Ihres Repositorys eine azure-pipelines.yml Datei mit dem folgenden Inhalt. Im Beispiel wird davon ausgegangen, dass sich die Verzeichnisse PrimeService und PrimeService.Tests im Stamm des Repositorys befinden und beide Projekte auf .NET 10 abzielen.

    trigger:
    - main
    
    pool:
      vmImage: ubuntu-latest
    
    steps:
    - task: UseDotNet@2
      displayName: Install .NET SDK
      inputs:
        packageType: sdk
        version: 10.0.x
    
    - task: DotNetCoreCLI@2
      displayName: Run MSTest tests
      inputs:
        command: test
        projects: PrimeService.Tests/PrimeService.Tests.csproj
        arguments: --configuration Release
        publishTestResults: true
    
  2. Passen Sie die Konfiguration an Ihr Repository an:

    • Wenn Ihr Branch einen anderen Namen hat, ersetzen Sie main in trigger durch diesen Branch-Namen.
    • Wenn sich Ihre Lösung in einem Unterverzeichnis befindet, aktualisieren Sie projects auf den Pfad des Testprojekts relativ zum Repositorystamm.
    • Wenn Ihre Projekte auf eine andere .NET-Version abzielen, ändern Sie version in der UseDotNet@2-Aufgabe entsprechend. Verwenden Sie z. B. 8.0.x für Projekte, die net8.0 als Ziel haben. Wenn Ihr Repository eine global.json Datei enthält, stellen Sie sicher, dass das installierte SDK deren Versionsanforderungen erfüllt.
  3. Führen Sie einen Commit durch und pushen Sie Ihre Lösung und die Datei azure-pipelines.yml in Ihr Git-Repository.

  4. Wählen Sie in Ihrem Azure DevOps Projekt Pipelines> oder Pipeline erstellen aus, wenn es sich um Ihre erste Pipeline handelt. Wählen Sie Ihren Repositoryanbieter und Ihr Repository aus.

  5. Wählen Sie auf der Seite "Pipeline konfigurieren" die Option "Vorhandene Azure Pipelines YAML-Datei" aus, wählen Sie die Verzweigung und , und wählen Sie dann /azure-pipelines.yml aus. Überprüfen Sie die Konfiguration und wählen Sie Ausführen aus.

Die UseDotNet@2 Aufgabe installiert das .NET SDK. Die DotNetCoreCLI@2 Aufgabe führt dotnet test aus, wodurch Abhängigkeiten wiederhergestellt, das Testprojekt und die referenzierte Bibliothek erstellt und die Tests in der Releasekonfiguration ausgeführt werden.

Mit publishTestResults: true, generiert der Vorgang eine TRX-Ergebnisdatei und veröffentlicht die Ergebnisse, auch wenn ein Test fehlschlägt. Öffnen Sie nach der Ausführung die Registerkarte "Tests" des Pipelineausführungslaufs, um bestandene und fehlgeschlagene Tests zu überprüfen. Ein fehlgeschlagener Test führt auch dazu, dass der Testvorgang und die Pipeline fehlschlagen.

Note

In diesem Beispiel wird die Standardkonfiguration VSTest aus dotnet new mstest mit dem .NET 10 SDK verwendet. Wenn Sie Microsoft.Testing.Platform (MTP) aktivieren, siehe Ausführen von MTP-Tests in fortlaufender Integration für die erforderliche Runner-Konfiguration.

Siehe auch