Megosztás a következőn keresztül:


C# egységtesztelése az NUnit és a .NET Core használatával

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 megtekintheti vagy letöltheti a mintakódot. A letöltési utasításokért tekintse meg példákat és oktatóanyagokat.

Ez a cikk egy .NET Core-projekt teszteléséről szól. Ha egy ASP.NET Core-projektet tesztel, olvassa el az ASP.NET Core Integrációs tesztekfejezetet.

Előfeltételek

A forrásprojekt létrehozása

Nyisson meg egy parancssor ablakot. Hozzon létre egy unit-testing-using-nunit nevű könyvtárat a megoldás számára. 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 könyvtá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-et aktuális könyvtárként, és futtassa a következő parancsot a forrásprojekt létrehozásához:

dotnet new classlib

Nevezze át a(z) Class1.cs fájlt a következőképpen: PrimeService.cs. A PrimeService osztály sikertelen implementációját hozza létre:

using System;

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

Váltson vissza 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

Módosítsa a címtárat a PrimeService.Tests könyvtárra, és hozzon létre egy új projektet az alábbi paranccsal:

dotnet new nunit

A dotnet new parancs egy tesztprojektet hoz létre, amely az NUnitot használja tesztelési könyvtárként. A létrehozott sablon konfigurálja a tesztfuttatót a PrimeService.Tests.csproj fájlban.

<ItemGroup>
  <PackageReference Include="nunit" Version="4.4.0" />
  <PackageReference Include="NUnit3TestAdapter" Version="5.2.0" />
  <PackageReference Include="Microsoft.NET.Test.Sdk" Version="18.0.0" />
  <PackageReference Include="NUnit.Analyzers" Version="4.11.2">
      <PrivateAssets>all</PrivateAssets>
      <IncludeAssets>runtime; build; native; contentfiles; analyzers</IncludeAssets>
  </PackageReference>
</ItemGroup>

Megjegyzés

A .NET 9 előtt a létrehozott kód hivatkozhat az NUnit tesztelési keretrendszer régebbi verzióira. A dotnet CLI használatával frissítheti a csomagokat. 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 korábban látható kódra.

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

dotnet add reference ../PrimeService/PrimeService.csproj

Megjegyzés

Ha .NET 10 SDK-t vagy újabb verziót használ, használhatja a "főnév első" űrlapot: dotnet reference add ../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

Írj egy hibás tesztet, tedd sikeressé, majd ismételd meg a folyamatot. A PrimeService.Tests könyvtárban nevezze át a UnitTest1.cs fájlt PrimeService_IsPrimeShould.cs névre, és cserélje le a teljes tartalmát az alábbi 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 shouldn't 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. Tedd sikeressé a tesztet azzal, hogy írj egy olyan legegyszerűbb kódot a PrimeService osztályban, ami működik:

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 újra a dotnet test. A dotnet test parancs egy buildet futtat 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 lefuttattál egy tesztet, ideje többet írni. A prímszámoknak van még néhány egyszerű esete: 0, -1. Hozzáadhat új teszteket a [Test] attribútummal, de ez gyorsan válhat unalmassá. 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 a tesztek közül kettő elbukik. Az összes teszt sikeres elvégzéséhez módosítsa a if záradékot a IsPrime 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. Önnek van a tesztek befejezett verziója és a könyvtárteljes implementálása .

Ön épített egy kis könyvtárat és egy egységtesztkészletet a könyvtá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.