Kódlefedettség használata egységteszteléshez
Fontos
Ez a cikk a példaprojekt létrehozását ismerteti. Ha már rendelkezik projektel, ugorjon a Kódlefedettségi eszköz szakaszra .
Az egységtesztek segítenek biztosítani a működést, és ellenőrzési módot biztosítanak az újrabontási erőfeszítésekhez. A kódlefedettség az egységtesztek által futtatott kód mennyiségének mérése – sorok, ágak vagy metódusok alapján. Ha például egy egyszerű alkalmazás csak két feltételes kódággal (az a ág és a b ág) rendelkezik, a feltételes ág ellenőrzésére szolgáló egységteszt 50%-os fiókkód-lefedettséget jelent.
Ez a cikk a kódlefedettség használatát ismerteti az egységteszteléshez a Coverlettel és a jelentéskészítéssel a ReportGenerator használatával. Bár ez a cikk a C# és az xUnit tesztelési keretrendszerre összpontosít, az MSTest és az NUnit is működni fog. A Coverlet egy nyílt forráskód projekt a GitHubon, amely platformfüggetlen kódlefedettségi keretrendszert biztosít a C# számára. A coverlet a .NET Foundation része. A Coverlet a Jelentéskészítéshez használt Cobertura lefedettségi teszt futási adatait gyűjti össze.
Ez a cikk azt is ismerteti, hogyan használhatja a coverlet-tesztfuttatásokból gyűjtött kódlefedettségi információkat jelentés létrehozásához. A jelentéskészítés egy másik nyílt forráskód projekt használatával lehetséges a GitHub - ReportGenerator webhelyen. A ReportGenerator számos más mellett a Cobertura által létrehozott lefedettségi jelentéseket különböző formátumú, emberi olvasásra alkalmas jelentésekké alakítja át.
Ez a cikk a minta-forráskód projekten alapul, amely a mintaböngészőben érhető el.
Tesztelt rendszer
A "tesztelt rendszer" arra a kódra utal, amellyel egységteszteket ír. Ez lehet objektum, szolgáltatás vagy bármi más, amely tesztelhető funkciókat tesz elérhetővé. Ebben a cikkben egy osztálytárat fog létrehozni, amely a tesztelt rendszer lesz, és két kapcsolódó egységtesztelési projektet.
Osztálytár létrehozása
Egy új könyvtár UnitTestingCodeCoverage
parancssorából hozzon létre egy új .NET standard osztálytárat a dotnet new classlib
következő paranccsal:
dotnet new classlib -n Numbers
Az alábbi kódrészlet egy egyszerű PrimeService
osztályt határoz meg, amely funkcióval ellenőrzi, hogy egy szám prímérték-e. Másolja ki az alábbi kódrészletet, és cserélje le a Számok könyvtárban automatikusan létrehozott Class1.cs fájl tartalmát. Nevezze át a Class1.cs fájlt PrimeService.cs.
namespace System.Numbers
{
public class PrimeService
{
public bool IsPrime(int candidate)
{
if (candidate < 2)
{
return false;
}
for (int divisor = 2; divisor <= Math.Sqrt(candidate); ++divisor)
{
if (candidate % divisor == 0)
{
return false;
}
}
return true;
}
}
}
Tipp.
Érdemes megemlíteni, hogy az Numbers
osztálykódtár szándékosan lett hozzáadva a System
névtérhez. Ez lehetővé teszi, System.Math hogy névtér-deklaráció nélkül using System;
is elérhető legyen. További információ: névtér (C# referencia).
Tesztprojektek létrehozása
Hozzon létre két új xUnit Test Project-(.NET Core-) sablont ugyanabból a parancssorból a dotnet new xunit
következő paranccsal:
dotnet new xunit -n XUnit.Coverlet.Collector
dotnet new xunit -n XUnit.Coverlet.MSBuild
Mindkét újonnan létrehozott xUnit-tesztprojektnek hozzá kell adnia a Numbers osztálytár projekthivatkozását. Ez azért van, hogy a tesztprojektek hozzáférhessenek a PrimeService-hez tesztelés céljából. A parancssorban használja a dotnet add
következő parancsot:
dotnet add XUnit.Coverlet.Collector\XUnit.Coverlet.Collector.csproj reference Numbers\Numbers.csproj
dotnet add XUnit.Coverlet.MSBuild\XUnit.Coverlet.MSBuild.csproj reference Numbers\Numbers.csproj
Az MSBuild projekt neve megfelelő, mivel a coverlet.msbuild NuGet-csomagtól függ. Adja hozzá ezt a csomagfüggőséget a dotnet add package
parancs futtatásával:
cd XUnit.Coverlet.MSBuild && dotnet add package coverlet.msbuild && cd ..
Az előző parancs hatékonyan módosította a könyvtárakat az MSBuild tesztprojektre, majd hozzáadta a NuGet-csomagot. Amikor ez megtörtént, akkor módosította a könyvtárakat, egy szinttel feljebb lépve.
Nyissa meg mindkét UnitTest1.cs fájlt, és cserélje le a tartalmát az alábbi kódrészletre. Nevezze át a UnitTest1.cs fájlokat PrimeServiceTests.cs.
using System.Numbers;
using Xunit;
namespace XUnit.Coverlet
{
public class PrimeServiceTests
{
readonly PrimeService _primeService;
public PrimeServiceTests() => _primeService = new PrimeService();
[Theory]
[InlineData(-1), InlineData(0), InlineData(1)]
public void IsPrime_ValuesLessThan2_ReturnFalse(int value) =>
Assert.False(_primeService.IsPrime(value), $"{value} should not be prime");
[Theory]
[InlineData(2), InlineData(3), InlineData(5), InlineData(7)]
public void IsPrime_PrimesLessThan10_ReturnTrue(int value) =>
Assert.True(_primeService.IsPrime(value), $"{value} should be prime");
[Theory]
[InlineData(4), InlineData(6), InlineData(8), InlineData(9)]
public void IsPrime_NonPrimesLessThan10_ReturnFalse(int value) =>
Assert.False(_primeService.IsPrime(value), $"{value} should not be prime");
}
}
Megoldás létrehozása
A parancssorból hozzon létre egy új megoldást az osztálytár és a két tesztprojekt beágyazásához. dotnet sln
A parancs használata:
dotnet new sln -n XUnit.Coverage
Ezzel létrehoz egy új megoldásfájlnevet XUnit.Coverage
a UnitTestingCodeCoverage könyvtárban. Adja hozzá a projekteket a megoldás gyökeréhez.
Hozza létre a megoldást a dotnet build
következő paranccsal:
dotnet build
Ha a build sikeres, létrehozta a három projektet, megfelelően hivatkozott projektekre és csomagokra, és helyesen frissítette a forráskódot. Szép munka!
Kódlefedettségi eszközök
A kódlefedettségi eszközöknek két típusa van:
- DataCollectors: A DataCollectors monitorozza a teszt végrehajtását, és adatokat gyűjt a tesztfuttatásokról. Az összegyűjtött adatokat különböző kimeneti formátumokban, például XML- és JSON-formátumban jelentik. További információ: az első DataCollector.
- Jelentésgenerátorok: A tesztfuttatásokból gyűjtött adatok használatával jelentéseket hozhat létre, gyakran stílusban formázott HTML-fájlként.
Ebben a szakaszban az adatgyűjtő eszközökre összpontosítunk.
A .NET tartalmaz egy beépített kódlefedettségi adatgyűjtőt, amely a Visual Studióban is elérhető. Ez az adatgyűjtő létrehoz egy bináris .coverage fájlt, amellyel jelentéseket hozhat létre a Visual Studióban. A bináris fájl nem olvasható emberi olvasással, és a Visual Studión kívüli jelentések létrehozásához emberi olvasásra alkalmas formátummá kell alakítani.
Tipp.
Az dotnet-coverage
eszköz platformfüggetlen eszköz, amely a bináris lefedettségi teszt eredményfájljának ember által olvasható formátummá alakításához használható. További információ: dotnet-coverage.
A coverlet egy nyílt forráskódú alternatíva a beépített gyűjtő helyett. A teszteredményeket emberi olvasásra alkalmas Cobertura XML-fájlokként hozza létre, amelyek aztán HTML-jelentések létrehozására használhatók. A Coverlet kódlefedettséghez való használatához egy meglévő egységtesztelő projektnek rendelkeznie kell a megfelelő csomagfüggőségekkel, vagy a .NET globális eszközkezelésére és a megfelelő coverlet.console NuGet-csomagra kell támaszkodnia.
Integrálás a .NET-teszttel
Az xUnit tesztprojekt-sablon alapértelmezés szerint integrálva van a coverlet.collector szolgáltatással.
A parancssorból módosítsa a könyvtárakat az XUnit.Coverlet.Collector projektre, és futtassa a dotnet test
következő parancsot:
cd XUnit.Coverlet.Collector && dotnet test --collect:"XPlat Code Coverage"
Feljegyzés
Az "XPlat Code Coverage"
argumentum egy rövid név, amely megfelel a Coverlet adatgyűjtőinek. Ez a név kötelező, de a kis- és nagybetűk érzéketlenek. A használata. A NET beépített Kódlefedettségi adatgyűjtője."Code Coverage"
A futtatás részeként az dotnet test
eredményként kapott coverage.cobertura.xml fájl a TestResults könyvtárba kerül. Az XML-fájl tartalmazza az eredményeket. Ez egy platformfüggetlen lehetőség, amely a .NET CLI-re támaszkodik, és nagyszerűen használható olyan buildrendszerekhez, ahol az MSBuild nem érhető el.
Az alábbiakban coverage.cobertura.xml példafájl látható.
<?xml version="1.0" encoding="utf-8"?>
<coverage line-rate="1" branch-rate="1" version="1.9" timestamp="1592248008"
lines-covered="12" lines-valid="12" branches-covered="6" branches-valid="6">
<sources>
<source>C:\</source>
</sources>
<packages>
<package name="Numbers" line-rate="1" branch-rate="1" complexity="6">
<classes>
<class name="Numbers.PrimeService" line-rate="1" branch-rate="1" complexity="6"
filename="Numbers\PrimeService.cs">
<methods>
<method name="IsPrime" signature="(System.Int32)" line-rate="1"
branch-rate="1" complexity="6">
<lines>
<line number="8" hits="11" branch="False" />
<line number="9" hits="11" branch="True" condition-coverage="100% (2/2)">
<conditions>
<condition number="7" type="jump" coverage="100%" />
</conditions>
</line>
<line number="10" hits="3" branch="False" />
<line number="11" hits="3" branch="False" />
<line number="14" hits="22" branch="True" condition-coverage="100% (2/2)">
<conditions>
<condition number="57" type="jump" coverage="100%" />
</conditions>
</line>
<line number="15" hits="7" branch="False" />
<line number="16" hits="7" branch="True" condition-coverage="100% (2/2)">
<conditions>
<condition number="27" type="jump" coverage="100%" />
</conditions>
</line>
<line number="17" hits="4" branch="False" />
<line number="18" hits="4" branch="False" />
<line number="20" hits="3" branch="False" />
<line number="21" hits="4" branch="False" />
<line number="23" hits="11" branch="False" />
</lines>
</method>
</methods>
<lines>
<line number="8" hits="11" branch="False" />
<line number="9" hits="11" branch="True" condition-coverage="100% (2/2)">
<conditions>
<condition number="7" type="jump" coverage="100%" />
</conditions>
</line>
<line number="10" hits="3" branch="False" />
<line number="11" hits="3" branch="False" />
<line number="14" hits="22" branch="True" condition-coverage="100% (2/2)">
<conditions>
<condition number="57" type="jump" coverage="100%" />
</conditions>
</line>
<line number="15" hits="7" branch="False" />
<line number="16" hits="7" branch="True" condition-coverage="100% (2/2)">
<conditions>
<condition number="27" type="jump" coverage="100%" />
</conditions>
</line>
<line number="17" hits="4" branch="False" />
<line number="18" hits="4" branch="False" />
<line number="20" hits="3" branch="False" />
<line number="21" hits="4" branch="False" />
<line number="23" hits="11" branch="False" />
</lines>
</class>
</classes>
</package>
</packages>
</coverage>
Tipp.
Alternatív megoldásként használhatja az MSBuild csomagot, ha a buildelési rendszer már használja az MSBuildet. A parancssorból módosítsa a könyvtárakat az XUnit.Coverlet.MSBuild projektre, és futtassa a dotnet test
következő parancsot:
dotnet test /p:CollectCoverage=true /p:CoverletOutputFormat=cobertura
Az eredményként kapott coverage.cobertura.xml fájl kimenet. Itt követheti az MSBuild integrációs útmutatót
Jelentések létrehozása
Most, hogy adatokat gyűjthet az egységteszt-futtatásokból, jelentéseket hozhat létre a ReportGenerator használatával. A ReportGenerator NuGet-csomag .NET globális eszközként való telepítéséhez használja a dotnet tool install
következő parancsot:
dotnet tool install -g dotnet-reportgenerator-globaltool
Futtassa az eszközt, és adja meg a kívánt beállításokat az előző tesztfuttatás kimeneti coverage.cobertura.xml fájlja alapján.
reportgenerator
-reports:"Path\To\TestProject\TestResults\{guid}\coverage.cobertura.xml"
-targetdir:"coveragereport"
-reporttypes:Html
A parancs futtatása után egy HTML-fájl jelöli a létrehozott jelentést.
Lásd még
- A Visual Studio egységtesztelési kódlefedettsége
- GitHub – Coverlet-adattár
- GitHub – ReportGenerator-adattár
- ReportGenerator projektwebhely
- Azure: Kódlefedettségi eredmények közzététele
- Azure: Kódlefedettségi eredmények áttekintése
- .NET CLI-tesztparancs
- dotnet-lefedettség
- Minta forráskód
Következő lépések
Visszajelzés
https://aka.ms/ContentUserFeedback.
Hamarosan elérhető: 2024-ben fokozatosan kivezetjük a GitHub-problémákat a tartalom visszajelzési mechanizmusaként, és lecseréljük egy új visszajelzési rendszerre. További információ:Visszajelzés küldése és megtekintése a következőhöz: