Dela via


Enhetstestning av C# med NUnit och .NET Core

I den här självstudien får du en interaktiv upplevelse när du skapar en exempellösning steg för steg för att lära dig enhetstestningskoncept. Om du föredrar att följa självstudien med hjälp av en färdig lösning kan du visa eller ladda ned exempelkoden innan du börjar. Instruktioner för nedladdning finns i Exempel och självstudier.

Den här artikeln handlar om att testa ett .NET Core-projekt. Om du testar ett ASP.NET Core-projekt kan du läsa Integreringstester i ASP.NET Core.

Förutsättningar

  • .NET 8.0 eller senare versioner.
  • Valfri textredigerare eller kodredigerare.

Skapa källprojektet

Öppna ett gränssnittsfönster. Skapa en katalog med namnet unit-testing-using-nunit för att lagra lösningen. I den här nya katalogen kör du följande kommando för att skapa en ny lösningsfil för klassbiblioteket och testprojektet:

dotnet new sln

Skapa sedan en PrimeService-katalog . Följande disposition visar katalogen och filstrukturen hittills:

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

Gör PrimeService till den aktuella katalogen och kör följande kommando för att skapa källprojektet:

dotnet new classlib

Byt namn på Class1.cs till PrimeService.cs. Du skapar en misslyckad implementering av PrimeService klassen:

using System;

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

Ändra tillbaka katalogen till katalogen unit-testing-using-nunit . Kör följande kommando för att lägga till klassbiblioteksprojektet i lösningen:

dotnet sln add PrimeService/PrimeService.csproj

Skapa testprojektet

Skapa sedan katalogen PrimeService.Tests . Följande disposition visar katalogstrukturen:

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

Gör katalogen PrimeService.Tests till den aktuella katalogen och skapa ett nytt projekt med följande kommando:

dotnet new nunit

Det nya dotnet-kommandot skapar ett testprojekt som använder NUnit som testbibliotek. Den genererade mallen konfigurerar testlöparen i filen PrimeService.Tests.csproj :

<ItemGroup>
  <PackageReference Include="nunit" Version="4.1.0" />
  <PackageReference Include="NUnit3TestAdapter" Version="4.5.0" />
  <PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.10.0" />
  <PackageReference Include="NUnit.Analyzers" Version="4.2.0">
      <PrivateAssets>all</PrivateAssets>
      <IncludeAssets>runtime; build; native; contentfiles; analyzers</IncludeAssets>
  </PackageReference>
</ItemGroup>

Kommentar

Före .NET 9 kan den genererade koden referera till äldre versioner av NUnit-testramverket. Du kan använda dotnet CLI för att uppdatera paketen. Du kan också öppna filen PrimeService.Tests.csproj och ersätta innehållet i paketreferensobjektgruppen med koden ovan.

Testprojektet kräver andra paket för att skapa och köra enhetstester. Kommandot dotnet new i föregående steg lade till Microsofts test-SDK, NUnit-testramverket och NUnit-testkortet. Lägg nu till PrimeService klassbiblioteket som ett annat beroende till projektet. dotnet add reference Använd kommandot:

dotnet add reference ../PrimeService/PrimeService.csproj

Du kan se hela filen i exempellagringsplatsen på GitHub.

Följande disposition visar den slutliga lösningslayouten:

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

Kör följande kommando i katalogen unit-testing-using-nunit :

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

Skapa det första testet

Du skriver ett misslyckat test, gör det godkänt och upprepar sedan processen. I katalogen PrimeService.Tests byter du namn på filen UnitTest1.cs till PrimeService_IsPrimeShould.cs och ersätter hela innehållet med följande kod:

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");
        }
    }
}

Attributet [TestFixture] anger en klass som innehåller enhetstester. Attributet [Test] anger att en metod är en testmetod.

Spara den här filen och kör dotnet test kommandot för att skapa testerna och klassbiblioteket och köra testerna. NUnit-testlöparen innehåller programmets startpunkt för att köra dina tester. dotnet test startar testkören med det enhetstestprojekt som du har skapat.

Testet misslyckas. Du har inte skapat implementeringen än. Gör testet genom att skriva den enklaste koden i klassen PrimeService som fungerar:

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

Kör igen i katalogen dotnet test unit-testing-using-nunit. Kommandot dotnet test kör en version för PrimeService projektet och sedan för PrimeService.Tests projektet. När du har skapat båda projekten körs det här enskilda testet. Den passerar.

Lägga till fler funktioner

Nu när du har gjort ett testpass är det dags att skriva mer. Det finns några andra enkla fall för primtal: 0, -1. Du kan lägga till nya tester med [Test] attributet, men det blir snabbt omständligt. Det finns andra NUnit-attribut som gör att du kan skriva en uppsättning liknande tester. Ett [TestCase] attribut används för att skapa en uppsättning tester som kör samma kod men som har olika indataargument. Du kan använda attributet [TestCase] för att ange värden för dessa indata.

I stället för att skapa nya tester använder du det här attributet för att skapa ett enda datadrivet test. Det datadrivna testet är en metod som testar flera värden som är mindre än två, vilket är det lägsta primtal:

[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");
}

Kör dotnet testoch två av dessa tester misslyckas. Om du vill att alla tester ska godkännas ändrar if du -satsen i början av Main metoden i filen PrimeService.cs :

if (candidate < 2)

Fortsätt att iterera genom att lägga till fler tester, teorier och kod i huvudbiblioteket. Du har den färdiga versionen av testerna och den fullständiga implementeringen av biblioteket.

Du har skapat ett litet bibliotek och en uppsättning enhetstester för biblioteket. Du har också strukturerat lösningen så att tillägg av nya paket och tester är en del av standardarbetsflödet. Du har koncentrerat dig mest på att lösa programmets mål.