Určení rozsahu testovaného kódu pomocí pokrytí kódu

Pokud chcete zjistit, jaký podíl kódu projektu testuje kódované testy, jako jsou testy jednotek, můžete použít funkci pokrytí kódu v sadě Visual Studio. Abyste mohli efektivně chránit před chybami, testy by měly provádět nebo "pokrýt" velkou část kódu.

Analýza pokrytí kódu je možná pro spravovaný (CLR) i nespravovaný (nativní) kód. Podporují se statické i dynamické instrumentace. Pokud chcete použít pokrytí kódu ve scénářích příkazového řádku, použijte buď vstest.console.exe , nebo nástroj Microsoft.CodeCoverage.Console, což je rozšíření pro pokrytí dotnet, které také podporuje nativní kód.

Možnost pokrytí kódu je k dispozici v nabídce Test při spuštění testovacích metod pomocí Průzkumníka testů. Tabulka výsledků zobrazuje procento kódu spuštěného v jednotlivých sestaveních, třídách a procedurách. Zdrojový editor zvýrazní testovaný kód. Výsledky můžete exportovat v oblíbených formátech, jako je Cobertura.

Požadavky

Funkce pokrytí kódu je k dispozici pouze v edici Visual Studio Enterprise.

Poznámka:

Pro pokrytí kódu .NET můžete alternativně použít nástroj příkazového řádku dotnet-coverage.

Analýza pokrytí kódu

  1. V nabídce Test vyberte Analyzovat pokrytí kódu pro všechny testy.

    Snímek obrazovky s nabídkou Test a zvýrazněnou možností Analyzovat pokrytí kódu

    Snímek obrazovky s nabídkou Test a zvýrazněnou možností Analyzovat pokrytí kódu

    Tip

    Pokrytí kódu můžete spustit také z okna nástroje Průzkumníka testů.

  2. Po spuštění testů chcete zjistit, které řádky byly spuštěny, zvolte Snímek obrazovky s nabídkou Analyzovat pokrytí kódu v sadě Visual StudioZobrazit barvy pokrytí kódu v okně Výsledky pokrytí kódu. Ve výchozím nastavení je kód pokrytý testy zvýrazněn světle modrým.

    Snímek obrazovky se zvýrazněným pokrytím kódu

    Snímek obrazovky se zvýrazněným pokrytím kódu

    V rozevíracím seznamu pro možnost Zobrazit barvu pokrytí kódu můžete vybrat, jestli se barva vztahuje na řádky kódu, glyfy na levém okraji nebo obojí.

  3. Pokud chcete změnit barvy nebo použít tučný obličej, zvolte Nástroje>Možnosti>písma>prostředí a barvy>Zobrazit nastavení pro: Textový editor. V části Položky zobrazení upravte nastavení pro položky Pokrytí, například oblast Pokrytí nedotknutá.

    Snímek obrazovky zobrazující písma a barvy pokrytí kódu

    Snímek obrazovky zobrazující písma a barvy pokrytí kódu

  4. Pokud výsledky ukazují nízké pokrytí, prozkoumejte, které části kódu se nevyužívají, a napište další testy, které je pokryly. Vývojové týmy obvykle usilují o 80% pokrytí kódu. V některých situacích je přijatelné i nižší pokrytí. Nižší pokrytí je například přijatelné tehdy, pokud je část kódu generována ze standardní šablony.

Tip

Optimalizace pokrytí kódu:

  • Vypněte optimalizaci kompilátoru.
  • Pokud pracujete s nespravovaným (nativním) kódem, použijte sestavení ladění.
  • Vygenerujte soubory .pdb (symbol) pro každé sestavení.

Pokud se vám nezobrazí očekávané výsledky, přečtěte si téma Řešení potíží s pokrytím kódu.

Po aktualizaci kódu nezapomeňte znovu spustit pokrytí kódu. Výsledky pokrytí a barvení kódu se po úpravě kódu nebo při spuštění testů automaticky neaktualizují.

Tip

Počínaje verzí Visual Studio 2022 Update 2 můžete povolit rychlejší výsledky testů pokrytí kódu tak, že vyberete > možnosti možností > prostředí > preview funkcí, pak vyberete vylepšení prostředí kódu a pak restartujete Visual Studio.

Sestava v blocích nebo řádcích

Pokrytí kódu se počítá v blocích. Blok je součástí kódu s přesně jedním vstupním a výstupním bodem. Pokud tok řízení programu prochází blokem během testovacího běhu, počítá se tento blok jako zahrnutý. Počet použití bloku nemá vliv na výsledek.

Výsledky můžete zobrazit i pro řádky tak, že v záhlaví tabulky zvolíte Přidat nebo odebrat sloupce . Někteří uživatelé dávají přednost určování pokrytí podle počtu řádků, protože jeho procenta lépe odpovídají velikosti fragmentů, které jsou vidět ve zdrojovém kódu. Dlouhý blok výpočtu by byl započítán jako jeden blok i v případě, že zabírá mnoho řádků.

Tip

Řádek kódu může obsahovat více než jeden blok kódu. Pokud se jedná o tento případ, test spustí cvičení všech bloků kódu na řádku, počítá se jako jeden řádek. Pokud jsou některé, ale ne všechny bloky kódu na řádku cvičení, počítá se jako částečný řádek.

Filtrování výsledků pokrytí kódu

Okno Výsledky pokrytí kódu obvykle zobrazuje výsledek pro celé řešení. Výsledky lze filtrovat tak, aby zobrazovaly výsledky pouze pro soubory aktualizované v aktuální větvi.

  • Pokud chcete zobrazit sestavu sady změn, vyberte v okně Výsledky pokrytí kódu ikonu Konfigurovat zobrazení pokrytí kódu. Potom v rozevíracím seznamu Obsah sestavy vyberte Sestavasady změn. Aktualizujte aktivní úložiště a základní větev tak, aby se porovnávala, aby poskytovala sestavu porovnání.

Z vyhledávacího pole v okně Výsledky pokrytí kódu existuje několik způsobů filtrování sestavy.

  • Pokud chcete hledat podle názvu (Zobrazit jenom ty, které odpovídají vyhledávacímu řetězci v okně), zadejte do vyhledávacího pole hledaný řetězec.
  • Chcete-li filtrovat podle typu , zadejte název typu do vyhledávacího pole.
  • Pokud chcete zobrazit všechna pole hledání, zrušte zaškrtnutí políčka.
  • Pokud chcete zobrazit 100 % plně pokryté, do vyhledávacího pole zadejte "Pokryté řádky":"100".
  • Pokud chcete zobrazit (>0 % && < 100 %) částečně pokryté, zadejte "Částečně pokryté (%řádky)":"<##" nahraďte ## procentem pokrytým.
  • Pokud chcete zobrazit 0 % pokrytých položek, zadejte do vyhledávacího pole text "Not Covered (%Lines)":"0".

Správa výsledků pokrytí kódu

Okno Výsledky pokrytí kódu obvykle zobrazuje výsledek posledního spuštění. Výsledky se budou lišit, pokud dojde ke změně zkušebních dat nebo jsou pokaždé spuštěny jen některé testy.

Okno Výsledky pokrytí kódu lze použít také k zobrazení předchozích výsledků nebo výsledků získaných na jiných počítačích.

Je také možné sloučit výsledky několika běhů, pokud například používají jiná testovací data.

  • Pokud chcete zobrazit předchozí sadu výsledků, vyberte ji z rozevírací nabídky. Nabídka obsahuje dočasný seznam, který je po otevření nového řešení vyprázdněn.

  • Pokud chcete zobrazit výsledky z předchozí relace, zvolte Importovat výsledky pokrytí kódu, přejděte do složky TestResults ve vašem řešení a naimportujte soubor .coverage .

    Barvy pokrytí můžou být nesprávné, pokud se zdrojový kód od vygenerování souboru .coverage změnil.

  • Pokud chcete, aby výsledky byly čitelné jako text, zvolte Exportovat výsledky pokrytí kódu. Tím se vygeneruje čitelný soubor .coveragexml , který můžete zpracovat pomocí jiných nástrojů nebo snadno odeslat e-mailem. Můžete také vybrat formáty exportu, jako je Cobertura.

  • Pokud chcete odeslat výsledky někomu jinému, odešlete soubor .coverage nebo exportovaný soubor .coveragexml. Tento soubor je pak možné importovat. Pokud se navíc shodují verze zdrojového kódu, je možné zobrazit i vybarvení pokrytí.

Sloučení výsledků z různých spuštění

V některých situacích se na základě testovacích dat použijí různé bloky kódu. Může být tedy nutné sloučit výsledky různých testovacích běhů.

Například při spuštění testu se vstupem „2“ je zjištěno 50% pokrytí určité funkce. Když test spustíte podruhé se vstupem "-2", uvidíte v zobrazení barev pokrytí, že ostatní 50 % funkce je pokryto. Teď sloučíte výsledky ze dvou testovacích běhů a zobrazení barevného pokrytí sestavy a pokrytí ukazuje, že 100 % funkce bylo pokryto.

K tomu použijte Ikona tlačítka Sloučit v okně Pokrytí kóduvýsledky slučování pokrytí kódu. Ke sloučení je možné použít libovolnou kombinaci předešlých běhů nebo importovaných výsledků. Pokud je potřeba sloučit exportované výsledky, je nejprve nutné je importovat.

Výsledky exportu pokrytí kódu slouží k uložení výsledků operace sloučení.

Omezení při slučování

  • Pokud sloučíte data pokrytí z různých verzí kódu, výsledky se zobrazí samostatně, ale nezkombinují se. Pro kompletní sloučení výsledků je potřeba použít stejné sestavení kódu pouze s odlišnými testovacími daty.

  • Pokud dojde ke sloučení souboru výsledků, který byl exportován a poté importován, je možné zobrazit výsledky jen podle řádků, nikoli podle bloků. K zobrazení dat řádků použijte příkaz Přidat nebo odebrat sloupce.

  • Při sloučení výsledků testů projektu aplikace ASP.NET dojde k zobrazení výsledků samostatných testů, ale ne k jejich sloučení. Toto chování se vztahuje pouze na samotné artefakty ASP.NET: výsledky pro všechna ostatní sestavení budou zkombinovány.

Vyloučení prvků z výsledků pokrytí kódu

Je možné vyloučit určité prvky v kódu z výpočtů pokrytí, například proto, že je kód generován z textové šablony. System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverageAttribute Přidejte atribut do libovolného z následujících prvků kódu: třída, struktura, metoda, vlastnost, setter vlastnosti nebo getter, event.

Tip

Vyloučení třídy nevyloučí odvozené třídy.

Příklad:

using System.Diagnostics.CodeAnalysis;
...
public class ExampleClass1
{
    [ExcludeFromCodeCoverage]
    void ExampleMethod() {...}

    [ExcludeFromCodeCoverage] // exclude property
    int ExampleProperty1
    { get {...} set{...}}

    int ExampleProperty2
    {
        get
        {
            ...
        }
        [ExcludeFromCodeCoverage] // exclude setter
        set
        {
            ...
        }
    }

}
[ExcludeFromCodeCoverage]
class ExampleClass2 { ... }

Použijte následující makra:

ExcludeFromCodeCoverage(ExclusionName FunctionName, L"");

ExcludeSourceFromCodeCoverage(ExclusionName, L"SourceFilePath");

  • ExclusionName je jakýkoli jedinečný název.

  • FunctionName je plně kvalifikovaný název funkce. Může obsahovat zástupné znaky. Pokud chcete například vyloučit všechny funkce třídy, napište MyNamespace::MyClass::*

  • SourceFilePath je místní cesta NEBO CESTA UNC souboru .cpp . Může obsahovat zástupné znaky. Následující příklad vylučuje všechny soubory v určitém adresáři: \\MyComputer\Source\UnitTests\*.cpp

  • #include <CodeCoverage\CodeCoverage.h>

  • Umístěte volání maker vyloučení do globálního oboru názvů a nikoli v rámci libovolného oboru názvů nebo třídy.

  • Vyloučení se umisťuje buď do souboru kódu jednotkového testu, nebo do souboru kódu aplikace.

  • Vyloučení musí být zkompilována jako nespravovaný (nativní) kód, a to buď nastavením možnosti kompilátoru, nebo pomocí #pragma managed(off).

Poznámka:

Pokud chcete vyloučit funkce v kódu C++/CLI, použijte u funkce atribut [System::Diagnostics::CodeAnalysis::ExcludeFromCodeCoverage] . Toto je stejné použití jako v jazyce C#.

Zahrnutí nebo vyloučení dalších prvků

Analýza pokrytí kódu se provádí pouze u sestavení, která jsou načtena a pro která je soubor .pdb k dispozici ve stejném adresáři jako .dll nebo .exe soubor. Proto v některých případech můžete rozšířit sadu sestavení, která jsou zahrnuta získáním kopií příslušných souborů .pdb .

Můžete si vyzkoušet větší kontrolu nad tím, která sestavení a prvky jsou vybrány pro analýzu pokrytí kódu napsáním souboru .runsettings . Je tak například možné vyloučit určitá sestavení bez nutnosti přidávání atributů jejich třídám. Další informace naleznete v tématu Přizpůsobení analýzy pokrytí kódu.

Analýza pokrytí kódu v Azure Pipelines

Když kód zkontrolujete, testy se spustí na buildovém serveru spolu s testy od ostatních členů týmu. Je užitečné analyzovat pokrytí kódu v Azure Pipelines, abyste získali nejaktuálnější a komplexní přehled pokrytí v celém projektu. Pokrytí kódu ve službě Azure Pipelines zahrnuje také automatizované systémové testy a další kódované testy, které obvykle neběží na vývojových počítačích.

Analýza pokrytí kódu z příkazového řádku

Ke spuštění testů z příkazového řádku použijte nástroj vstest.console.exe . Pokrytí kódu je možnost vstest.console.exe utility vyvolané /EnableCodeCoverage možností.

  1. Spusťte příkazový řádek pro vývojáře pro Visual Studio:

    V nabídce Start systému Windows vyhledejte Developer Command Prompt for VS a vyberte výsledek aplikace, který je přidružený k hledaným textu.

  2. Na příkazovém řádku spusťte následující příkaz:

    vstest.console.exe MyTestAssembly.dll /EnableCodeCoverage
    

    Tip

    Pro vývojáře PowerShell je počátečním adresářem prostředí umístění projektu sady Visual Studio. Nahraďte MyTestAssembly.dll cestou a názvem testovacího souboru. Další informace najdete v VSTest.Console.exe možnostech příkazového řádku.

Odstraňování potíží

Pokud nevidíte výsledky pokrytí kódu, může vám pomoct článek Řešení potíží s pokrytím kódu.