Sdílet prostřednictvím


Použijte pokrytí kódu k určení, kolik kódu je testováno

Pokud chcete zjistit, jaký podíl kódu vašeho projektu je testován kódovanými testy, jako jsou jednotkové testy, můžete použít funkci pokrytí kódu ve Visual Studio. Abyste se mohli efektivně chránit před chybami, měly by vaše testy testovat nebo "zahrnovat" velkou část vašeho 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 vstest.console.exe nebo nástroj Microsoft.CodeCoverage.Console, což je rozšíření pro dotnet-coverage, který podporuje také nativní kód.

Možnost pokrytí kódu je k dispozici v nabídce Test při spouštění metod testů 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 z nabídky Test se zvýrazněnou možností Analyzovat pokrytí kódu

    Snímek obrazovky z nabídky Test se zvýrazněnou možností Analyzovat pokrytí kódu

    Spropitné

    Pokrytí kódu můžete spustit také v nástrojovém okně Průzkumníka testů.

  2. Poté, co již testy proběhly, vyberte Snímek obrazovky z nabídky Analyzovat pokrytí kódu ve Visual StudiuZobrazit zabarvení 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>Prostředí>Písma a barvy>Zobrazit nastavení pro: Textový editor. V části Zobrazit položkyupravte nastavení položek Pokrytí, například Oblast nepokrytá.

    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 cílí na přibližně 80% pokrytí kódu. V některých situacích je nižší pokrytí přijatelné. Nižší pokrytí je například přijatelné, když se nějaký kód vygeneruje ze standardní šablony.

Spropitné

Jak optimalizovat pokrytí kódu:

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

Pokud se vám nezobrazí očekávané výsledky, přečtěte si Ř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í.

Spropitné

Počínaje verzí 17.2 sady Visual Studio 2022 můžete povolit nejnovější funkce pokrytí kódu tak, že vyberete Tools > Options > Environment > Preview Features, pak vyberete Vylepšení pokrytí kódua 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 také pro řádky tím, že v záhlaví tabulky zvolíte Přidat/Odebrat sloupce. Někteří uživatelé dávají přednost počtu řádků, protože procenta odpovídají blíže velikosti fragmentů, které vidíte ve zdrojovém kódu. Dlouhý blok výpočtu se počítá jako jeden blok, i když zabírá mnoho řádků.

Spropitné

Řádek kódu může obsahovat více než jeden blok kódu. Pokud tomu tak je a testovací běh provede všechny bloky kódu na řádku, počítá se to jako jeden řádek. Pokud jsou některé, ale ne všechny bloky kódu na řádku provedeny, počítá se to jako částečný řádek.

Zobrazení výsledků pokrytí kódu

Okno výsledků pokrytí kódu obvykle strukturuje sestavu v hierarchii projektu, třídy a metody. Můžete to změnit tak, aby se zobrazilo pokrytí na úrovni adresáře, souboru nebo metody.

  • Pokud chcete zobrazitzdrojové sestavy, vyberte ikonu Konfigurovat zobrazení pokrytí kódu v okně výsledky pokrytí kódu. Potom v rozevíracím seznamu Styl sestavy vyberte zobrazení zdroje.

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

  • Chcete-li zobrazit reportsady změn, vyberte ikonu Konfigurovat zobrazení pokrytí kódu v okně Výsledky pokrytí kódu. Potom v rozevíracím seznamu Obsah sestavy vyberte Sestava sady změn. Aktualizujte aktivní úložiště a základní větev, proti kterým se má porovnávat, aby bylo možné poskytnout sestavu porovnání.

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

  • Pokud chcete Hledat podle názvu (Zobrazit pouze 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.
  • Chcete-li Zobrazit všechny zrušte zaškrtnutí vyhledávacího pole.
  • Pokud chcete Zobrazit 100% plně pokrytých, do vyhledávacího pole zadejte "Pokryto (%Lines)":"100".
  • Chcete-li Zobrazit (>0% && < 100%) částečně pokryté, zadejte "Částečně pokryto (%Lines)":"<##" nahraďte ## procentem pokrytým.
  • Chcete-li zobrazit 0%, které nejsou pokryté, zadejte do vyhledávacího pole "Nenalezeno (%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 změníte testovací data nebo když pokaždé spustíte jenom některé testy.

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

Výsledky několika spuštění můžete sloučit, například ze spuštění, která používají různá testovací data.

  • Chcete-li zobrazit předchozí sadu výsledků, vyberte ji z rozevírací nabídky. V nabídce se zobrazí dočasný seznam, který se vymaže při otevření nového řešení.

  • Pro zobrazení výsledků z předchozí relacezvolte Importovat výsledky, přejděte do složky TestResults ve vašem řešení a importujte soubor .coverage.

    Pokrytí barev může být nesprávné, pokud se zdrojový kód od doby, kdy byl soubor .coverage vygenerován, změnil.

  • Chcete-li, aby výsledky byly čitelné jako textové, zvolte Exportovat výsledky, vyberte .xml jako Uložit jako typ. Tím se vygeneruje čitelný .xml soubor, 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, pošlete soubor .coverage nebo exportovaný soubor .xml. Pak můžou soubor naimportovat. Pokud mají stejnou verzi zdrojového kódu, můžou vidět barvy pokrytí.

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

V některých situacích se v závislosti na testovacích datech použijí různé bloky v kódu. Proto můžete chtít zkombinovat výsledky z různých testovacích běhů.

Předpokládejme například, že když spustíte test se vstupem "2", zjistíte, že je pokryto 50% konkrétní 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 obarvení sestavy a pokrytí ukazuje, že 100% funkce bylo pokryto.

Použijte ikonu jako tlačítko Sloučit v okně Pokrytí kódu. Abyste to provedli, použijtepro sloučení výsledků. Můžete zvolit libovolnou kombinaci nedávných běhů nebo importovaných výsledků. Pokud chcete zkombinovat exportované výsledky, musíte je nejdřív importovat.

K uložení výsledků operace sloučení použijte Export výsledků.

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. Pokud chcete získat plně kombinované výsledky, použijte stejný build kódu a změňte pouze testovací data.

  • Pokud sloučíte soubor výsledků, který byl exportován a importován, můžete výsledky zobrazit pouze podle řádků, nikoli podle bloků. Pomocí příkazu Přidat nebo odebrat sloupce zobrazte řádková data.

  • Pokud sloučíte výsledky z testů ASP.NET projektu, zobrazí se výsledky samostatných testů, ale nebudou sloučeny. 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

Můžete chtít vyloučit konkrétní prvky v kódu ze skóre pokrytí, například pokud je kód vygenerován z textové šablony. Přidejte atribut System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverageAttribute do některého z následujících prvků kódu: třída, struktura, metoda, vlastnost, setter nebo getter, event.

Spropitné

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

Napří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, L"FunctionName");

ExcludeSourceFromCodeCoverage( ExclusionName, L"SourceFilePath");

  • ExclusionName je jakékoli jedinečné jméno.

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

  • SourceFilePath je místní cesta nebo cesta UNC souboru ve formátu .cpp. Může obsahovat zástupné cardy. 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í vylučovacích maker do globálního oboru názvů, a nikoliv do žádného jiného oboru názvů ani třídy.

  • Vyloučení můžete umístit buď do souboru kódu testu jednotek, 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 této funkce atribut [System::Diagnostics::CodeAnalysis::ExcludeFromCodeCoverage]. To je stejné jako u jazyka C#.

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

Analýza pokrytí kódu se provádí pouze na sestaveních, 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 .pdb souborů.

Pomocí souboru .runsettings můžete provést větší kontrolu nad tím, která sestavení a prvky jsou vybrány pro analýzu pokrytí kódu. Například můžete vyloučit soubory konkrétních druhů, aniž byste museli do jejich tříd přidávat atributy. 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 nejvíce up-todata a komplexního přehledu 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 volbou nástroje vstest.console.exe vyvolanou volbou /EnableCodeCoverage.

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

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

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

    vstest.console.exe MyTestAssembly.dll /EnableCodeCoverage
    

    Spropitné

    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 naleznete v možnostech příkazového řádku VSTest.Console.exe.

Řešení potíží

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