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
V nabídce Test vyberte Analyzovat pokrytí kódu pro všechny testy.
Tip
Pokrytí kódu můžete spustit také z okna nástroje Průzkumníka testů.
Po spuštění testů chcete zjistit, které řádky byly spuštěny, zvolte Zobrazit 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.
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í.
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á.
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 Sestava sady 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 vý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 , L"
FunctionName ");
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í.
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.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.