C# egységtesztelés az NUnittal és a .NET Core-ral

Ez az oktatóanyag egy interaktív felületen mutatja be, hogyan hozhat létre lépésről lépésre egy mintamegoldást az egységtesztelési fogalmak megismeréséhez. Ha inkább egy előre elkészített megoldással szeretné követni az oktatóanyagot, a kezdés előtt tekintse meg vagy töltse le a mintakódot . A letöltési utasításokért tekintse meg a példákat és az oktatóanyagokat.

Ez a cikk egy .NET Core-projekt teszteléséről szól. Ha egy ASP.NET Core-projektet tesztel, tekintse meg a ASP.NET Core integrációs tesztjeit.

Előfeltételek

  • .NET 8.0-s vagy újabb verziók.
  • Az Ön által választott szöveg- vagy kódszerkesztő.

A forrásprojekt létrehozása

Nyisson meg egy felületablakot. Hozzon létre egy unit-testing-using-nunit nevű könyvtárat a megoldás tárolásához. Az új könyvtárban futtassa a következő parancsot egy új megoldásfájl létrehozásához az osztálytárhoz és a tesztprojekthez:

dotnet new sln

Ezután hozzon létre egy PrimeService-címtárat . Az alábbi vázlat a könyvtárat és a fájlstruktúrát mutatja be eddig:

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

Állítsa be a PrimeService-t az aktuális könyvtárba, és futtassa a következő parancsot a forrásprojekt létrehozásához:

dotnet new classlib

Nevezze át Class1.cs PrimeService.cs. Az osztály sikertelen implementációját PrimeService hozza létre:

using System;

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

Módosítsa a könyvtárat a unit-testing-using-nunit könyvtárra. Futtassa a következő parancsot az osztálytárprojekt megoldáshoz való hozzáadásához:

dotnet sln add PrimeService/PrimeService.csproj

A tesztprojekt létrehozása

Ezután hozza létre a PrimeService.Tests könyvtárat. Az alábbi ábra a könyvtárszerkezetet mutatja be:

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

Állítsa a PrimeService.Tests könyvtárat az aktuális könyvtárra, és hozzon létre egy új projektet az alábbi paranccsal:

dotnet new nunit

A dotnet új parancsa létrehoz egy tesztprojektet, amely az NUnitot használja teszttárként. A létrehozott sablon a PrimeService.Tests.csproj fájlban konfigurálja a tesztfuttatót:

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

Feljegyzés

A .NET 9 előtt a létrehozott kód hivatkozhat az NUnit-teszt keretrendszer régebbi verzióira. A csomagok frissítéséhez használhatja a dotnet CLI-t . Másik lehetőségként nyissa meg a PrimeService.Tests.csproj fájlt, és cserélje le a csomaghivatkozások elemcsoportjának tartalmát a fenti kódra.

A tesztprojekthez más csomagokra van szükség az egységtesztek létrehozásához és futtatásához. Az dotnet new előző lépésben szereplő parancs hozzáadta a Microsoft test SDK-t, az NUnit tesztelési keretrendszert és az NUnit tesztadaptert. Most adja hozzá az PrimeService osztálytárat egy másik függőségként a projekthez. Használja a dotnet add reference következő parancsot:

dotnet add reference ../PrimeService/PrimeService.csproj

A teljes fájl a GitHub mintaadattárában látható.

Az alábbi ábra a végső megoldáselrendezést mutatja be:

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

Hajtsa végre a következő parancsot a unit-testing-using-nunit könyvtárban:

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

Az első teszt létrehozása

Írjon egy sikertelen tesztet, adja át, majd ismételje meg a folyamatot. A PrimeService.Tests könyvtárban nevezze át a UnitTest1.cs fájlt PrimeService_IsPrimeShould.cs, és cserélje le a teljes tartalmát a következő kódra:

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

Az [TestFixture] attribútum egy osztályt jelöl, amely egységteszteket tartalmaz. Az [Test] attribútum azt jelzi, hogy a metódus egy tesztmetódus.

Mentse ezt a fájlt, és hajtsa végre a dotnet test parancsot a tesztek és az osztálytár létrehozásához és a tesztek futtatásához. Az NUnit-tesztfuttató tartalmazza a tesztek futtatásához a program belépési pontját. dotnet test elindítja a tesztfuttatót a létrehozott egységteszt-projekt használatával.

A teszt sikertelen. Még nem hozta létre az implementációt. A teszt sikeressé tétele a legegyszerűbb kód megírásával a PrimeService működő osztályban:

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

A unit-testing-using-nunit könyvtárban futtassa dotnet test újra. A dotnet test parancs futtat egy buildet a PrimeService projekthez, majd a PrimeService.Tests projekthez. Mindkét projekt létrehozása után az egyetlen tesztet futtatja. Átmegy.

További funkciók hozzáadása

Most, hogy teljesített egy teszteredményt, ideje többet írni. A prímszámoknak van még néhány egyszerű esete: 0, -1. Hozzáadhat új teszteket az [Test] attribútummal, de ez gyorsan unalmassá válik. Vannak más NUnit-attribútumok is, amelyek lehetővé teszik, hogy hasonló tesztcsomagot írjon. Az [TestCase] attribútumok olyan tesztcsomagok létrehozására szolgálnak, amelyek ugyanazt a kódot hajtják végre, de különböző bemeneti argumentumokkal rendelkeznek. Az attribútummal [TestCase] megadhat értékeket ezekhez a bemenetekhez.

Új tesztek létrehozása helyett alkalmazza ezt az attribútumot egyetlen adatvezérelt teszt létrehozásához. Az adatvezérelt teszt egy olyan módszer, amely több, kettőnél kisebb értéket tesztel, ami a legalacsonyabb prímszám:

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

Futtassa dotnet test, és ezek közül kettő sikertelen. Ahhoz, hogy az összes teszt sikeres legyen, módosítsa a if záradékot a Main metódus elején a PrimeService.cs fájlban:

if (candidate < 2)

Folytassa az iterációt úgy, hogy további teszteket, elméleteket és kódot ad hozzá a fő kódtárhoz. Rendelkezik a tesztek kész verziójával és a kódtár teljes implementálásával.

Létrehozott egy kis kódtárat és egy készletnyi egységtesztet a tárhoz. A megoldást úgy is strukturálta, hogy az új csomagok és tesztek hozzáadása a szokásos munkafolyamat része legyen. A legtöbb időt és erőfeszítést az alkalmazás céljainak megoldására összpontosította.