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="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á 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.