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


C# egységtesztelés MSTesttel és .NET-tel

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-mstest nevű könyvtárat a megoldás tárolásához. Ebben az új könyvtárban futtassa a dotnet new sln, hogy létrehozhasson egy új megoldásfájlt az osztálytárhoz és a tesztprojekthez. Hozzon létre egy PrimeService könyvtárat. Az alábbi vázlat az eddigi könyvtárat és fájlstruktúrát mutatja be:

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

Állítsa az aktuális könyvtárba a PrimeService-t, és futtassa dotnet new classlib a forrásprojekt létrehozására. Nevezze át a(z) Class1.cs fájlt a következőképpen: PrimeService.cs. Cserélje le a fájlban lévő kódot a következő kódra a PrimeService osztály sikertelen implementációjának létrehozásához:

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 könyvtárat a unit-testing-using-mstest könyvtárra. A dotnet sln add futtatása az osztálykönyvtár-projekt megoldáshoz való hozzáadásához:

dotnet sln add PrimeService/PrimeService.csproj

A tesztprojekt létrehozása

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

/unit-testing-using-mstest
    unit-testing-using-mstest.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 a dotnet new mstesthasználatával. A dotnet új parancsa létrehoz egy tesztprojektet, amely az MSTestet használja teszttárként. A sablon konfigurálja a tesztfuttatót a PrimeServiceTests.csproj fájlban:

<ItemGroup>
  <PackageReference Include="MSTest" Version="3.2.0" />
  <PackageReference Include="Microsoft.Testing.Extensions.CodeCoverage" Version="17.10.1" />
</ItemGroup>

A tesztprojekthez más csomagokra van szükség az egységtesztek létrehozásához és futtatásához. dotnet new az előző lépésben hozzáadta a kódlefedettségi jelentéskészítéshez szükséges MSTest-csomagokat és eszközöket.

Adja hozzá a PrimeService osztálytárat egy másik függőségként a projekthez. Használja a dotnet reference add parancsot:

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-mstest
    unit-testing-using-mstest.sln
    /PrimeService
        Source Files
        PrimeService.csproj
    /PrimeService.Tests
        Test Source Files
        PrimeServiceTests.csproj

Navigáljon át a unit-testing-using-mstest könyvtárba, és futtassa a dotnet sln add:

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

Az első teszt létrehozása

Írjon egy sikertelen tesztet, végezze el, majd ismételje meg a folyamatot. Távolítsa el UnitTest1.cs a PrimeService.Tests könyvtárból, és hozzon létre egy új, PrimeService_IsPrimeShould.cs nevű C#-fájlt a következő tartalommal:

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 should not be prime");
        }
    }
}

A TestClass attribútum egységteszteket tartalmazó osztályt jelöl. A TestMethod attribútum azt jelzi, hogy a metódus egy tesztmetódus.

Mentse ezt a fájlt, és hajtsa végre a dotnet test a tesztek és az osztálytár létrehozásához, majd futtassa a teszteket. Az MSTest tesztfuttatója 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. Ezt a tesztet úgy teheti meg, hogy a legegyszerűbb kódot írja be a PrimeService osztályba, amely 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-mstest könyvtárban futtassa újra az dotnet test utasítást. A dotnet test parancs egy buildet futtat a PrimeService projekthez, majd a PrimeService.Tests projekthez. Mindkét projekt létrehozása után ezt 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 a TestMethod attribútummal, de ez gyorsan unalmassá válik. Vannak más MSTest-attribútumok, amelyek lehetővé teszik, hogy hasonló tesztcsomagot írjon. Egy tesztmetódus végrehajthatja ugyanazt a kódot, de különböző bemeneti argumentumokkal rendelkezik. A DataRow attribútummal adhat meg értékeket ezekhez a bemenetekhez.

Új tesztek létrehozása helyett alkalmazza ezt a két 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. Adjon hozzá egy új vizsgálati módszert a PrimeService_IsPrimeShould.cs:

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

    Assert.IsFalse(result, $"{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, több elméletet és további kódot ad hozzá a fő kódtárhoz. Önnek van a tesztek befejezett verziója és a könyvtárteljes implementálása .

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

Lásd még