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 UnitTestingCodeCoverageparancssorá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.

dotnet sln XUnit.Coverage.sln add **/*.csproj --in-root

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.

Unit test-generated report

Lásd még

Következő lépések