Freigeben über


Komponententests C# mit NUnit und .NET Core

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-nunit ", um die Lösung zu speichern. Führen Sie in diesem neuen Verzeichnis den folgenden Befehl aus, um eine neue Lösungsdatei für die Klassenbibliothek und das Testprojekt zu erstellen:

dotnet new sln

Erstellen Sie als Nächstes ein PrimeService-Verzeichnis . Die folgende Gliederung zeigt bisher die Verzeichnis- und Dateistruktur:

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

Stellen Sie PrimeService zum aktuellen Verzeichnis, und führen Sie den folgenden Befehl aus, um das Quellprojekt zu erstellen:

dotnet new classlib

Benennen Sie Class1.cs in PrimeService.cs um. Sie erstellen eine fehlerhafte Implementierung der Klasse PrimeService.

using System;

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

Ändern Sie das Verzeichnis wieder in das Verzeichnis unit-testing-using-nunit. Führen Sie den folgenden Befehl aus, um das Klassenbibliotheksprojekt zur Projektmappe hinzuzufügen:

dotnet sln add PrimeService/PrimeService.csproj

Erstellen des Testprojekts

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

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

Erstellen Sie das Verzeichnis "PrimeService.Tests " als aktuelles Verzeichnis, und erstellen Sie ein neues Projekt mit dem folgenden Befehl:

dotnet new nunit

Der neue Befehl dotnet erstellt ein Testprojekt, das NUnit als Testbibliothek verwendet. Die generierte Vorlage konfiguriert den Testläufer in der Datei "PrimeService.Tests.csproj ":

<ItemGroup>
  <PackageReference Include="nunit" Version="4.3.2" />
  <PackageReference Include="NUnit3TestAdapter" Version="5.0.0" />
  <PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.14.1" />
  <PackageReference Include="NUnit.Analyzers" Version="4.9.2">
      <PrivateAssets>all</PrivateAssets>
      <IncludeAssets>runtime; build; native; contentfiles; analyzers</IncludeAssets>
  </PackageReference>
</ItemGroup>

Hinweis

Vor .NET 9 kann der generierte Code auf ältere Versionen des NUnit-Testframeworks verweisen. Sie können dotnet CLI verwenden, um die Pakete zu aktualisieren. Öffnen Sie alternativ die Datei PrimeService.Tests.csproj, und ersetzen Sie den Inhalt der Elementgruppe mit Paketverweisen durch den obigen Code.

Das Testprojekt erfordert andere Pakete zum Erstellen und Ausführen von Komponententests. Der dotnet new Befehl im vorherigen Schritt hat das Microsoft Test SDK, das NUnit-Testframework und den NUnit-Testadapter hinzugefügt. Fügen Sie nun 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-nunit
    unit-testing-using-nunit.sln
    /PrimeService
        Source Files
        PrimeService.csproj
    /PrimeService.Tests
        Test Source Files
        PrimeService.Tests.csproj

Führen Sie den folgenden Befehl im Verzeichnis "unit-testing-using-nunit " aus:

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

Erstellen des ersten Tests

Sie schreiben einen fehlerhaften Test, lassen ihn als bestanden gelten und wiederholen dann den Prozess. Benennen Sie im Verzeichnis "PrimeService.Tests " die datei "UnitTest1.cs " in PrimeService_IsPrimeShould.cs um, und ersetzen Sie den gesamten Inhalt durch den folgenden Code:

using NUnit.Framework;
using Prime.Services;

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

        [SetUp]
        public void SetUp()
        {
            _primeService = new PrimeService();
        }

        [Test]
        public void IsPrime_InputIs1_ReturnFalse()
        {
            var result = _primeService.IsPrime(1);

            Assert.That(result, Is.False, "1 should not be prime");
        }
    }
}

Das [TestFixture] Attribut gibt eine Klasse an, die Komponententests enthält. Das [Test] Attribut gibt an, dass es sich bei einer Methode um eine Testmethode handelt.

Speichern Sie diese Datei, und führen Sie den dotnet test Befehl aus, um die Tests und die Klassenbibliothek zu erstellen und die Tests auszuführen. Der NUnit-Testläufer enthält den Programmeinstiegspunkt, um Ihre Tests auszuführen. dotnet test startet Test Runner mithilfe des von Ihnen erstellten Komponententestprojekts.

Ihr Test schlägt fehl. Sie haben die Implementierung noch nicht erstellt. Damit dieser Test erfolgreich verläuft, schreiben Sie einen ganz einfachen, funktionierenden Code in die PrimeService-Klasse:

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-nunit 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 Sie beide Projekte erstellt haben, wird dieser einzelne Test ausgeführt. 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önnten neue Tests mit dem [Test] Attribut hinzufügen, aber das wird schnell mühsam. Es gibt weitere NUnit-Attribute, mit denen Sie eine Reihe ähnlicher Tests schreiben können. Ein [TestCase] Attribut wird verwendet, um eine Reihe von Tests zu erstellen, die denselben Code ausführen, aber unterschiedliche Eingabeargumente haben. Sie können das [TestCase] Attribut verwenden, um Werte für diese Eingaben anzugeben.

Anstatt neue Tests zu erstellen, wenden Sie dieses Attribut an, um einen einzelnen datengesteuerten Test zu erstellen. Der datengesteuerte Test ist eine Methode, die mehrere Werte weniger als zwei testet, was die niedrigste Primzahl ist:

[TestCase(-1)]
[TestCase(0)]
[TestCase(1)]
public void IsPrime_ValuesLessThan2_ReturnFalse(int value)
{
    var result = _primeService?.IsPrime(value);

    Assert.That(result, Is.False, $"{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 Main Methode in der datei PrimeService.cs :

if (candidate < 2)

Fahren Sie fort, indem Sie weitere Tests, Theorien und 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 auch so strukturiert, dass das Hinzufügen neuer Pakete und Tests Teil des Standardworkflows ist. Sie haben die meiste Zeit und Mühe auf die Erreichung der Ziele der Anwendung konzentriert.