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 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

A forrásprojekt létrehozása

Nyisson meg egy felületablakot. 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 dotnet new sln az osztálytár és a tesztprojekt új megoldásfájljának létrehozásához. Hozzon létre egy PrimeService-címtá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 a PrimeService-t az aktuális könyvtárra, és futtassa dotnet new classlib a forrásprojekt létrehozásához. Nevezze át Class1.cs PrimeService.cs. Cserélje le a fájlban lévő kódot a következő kódra az osztály sikertelen implementációjának PrimeService 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.");
        }
    }
}

Módosítsa a könyvtárat a unit-testing-using-mstest könyvtárra. Futtassa dotnet sln add az osztálytár-projekt megoldáshoz való hozzáadását:

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

<ItemGroup>
  <PackageReference Include="Microsoft.NET.Test.Sdk" Version="16.7.1" />
  <PackageReference Include="MSTest.TestAdapter" Version="2.1.1" />
  <PackageReference Include="MSTest.TestFramework" Version="2.1.1" />
  <PackageReference Include="coverlet.collector" Version="1.3.0" />
</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 az MSTest SDK-t, az MSTest tesztelési keretrendszert, az MSTest futót és a kódlefedettségi jelentés fedőlapját.

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

Váltson a unit-testing-using-mstest könyvtárra, és futtassa a következőt 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 egy osztályt jelöl, amely egységteszteket tartalmaz. A TestMethod attribútum azt jelzi, hogy a metódus egy tesztmetódus.

Mentse ezt a fájlt, és hajtsa végre dotnet test a teszteket és az osztálytárat, 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 az 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 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 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 megadhatja ezeknek a bemeneteknek az értékeit.

Ú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 ezek közül kettő sikertelen. Ahhoz, hogy az összes teszt sikeres legyen, 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. 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 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