Použití pokrytí kódu k určení rozsahu testovaného kódu
Funkci pokrytí kódu sady Visual Studio lze použít ke zjištění toho, jaký podíl kódu projektu je skutečně testován kódovanými testy, jako jsou například jednotkové testy.Pro efektivní ochranu před chybami je vhodné testovat, neboli „pokrýt“, velkou část kódu projektu.
Analýza pokrytí kódu může být použita jak pro spravovaný (CLI), tak pro nespravovaný (nativní) kód.
Pokrytí kódu je jedna z možností při spouštění testovacích metod pomocí Průzkumníku testů.Tabulka výsledků zobrazuje procentuální podíl kódu, který byl spuštěn v každém sestavení, třídě a metodě.Editor zdrojového kódu navíc ukazuje samotný kód, který byl testován.
Požadavky
- Visual Studio Ultimate, Visual Studio Premium
Analýza pokrytí kódu jednotkovými testy v Průzkumníku testů
V nabídce Test zvolte položku Analyzovat pokrytí kódu.
Pro zobrazení spuštěných řádků zvolte možnost Zobrazit barevné označení pokrytí kódu.
Pro změnu barvy nebo použití tučného písma zvolte možnost Nástroje, Možnosti, Prostředí, Písma a barvy, Zobrazit nastavení pro: Textový editor.V položce Viditelné položky nastavte položky Pokrytí.
Pokud výsledky zobrazují nízké pokrytí, prozkoumejte, které části kódu nejsou testovány, a vytvořte pro ně další testy.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
Získání přesných výsledků:
-
Ujistěte se, že je vypnuta optimalizace kompilátoru.
Pokud pracujete s nespravovaným (nativním) kódem, použijte sestavení pro ladění.
-
Ujistěte se, že jsou generovány soubory s příponou .pdb (soubory symbolů) pro každé sestavení.
Pokud nezískáte očekávané výsledky, naleznete více informací v tématu Poradce při potížích s pokrytím kódu. .Po aktualizaci kódu nezapomeňte znovu spustit pokrytí kódu.Výsledky pokrytí kódu a barevné zvýraznění kódu nejsou po změně kódu nebo při spuštění testů automaticky aktualizovány.
Vykazování v blocích nebo řádcích
Pokrytí kódu je určováno po blocích.Blok je část kódu s právě jedním vstupním a výstupním bodem. Pokud tok řízení programu projde při testovacím běhu blokem, tento blok se započítá jako pokrytý.Počet průchodů blokem nemá na výsledek žádný vliv.
Je také možné výsledky zobrazit podle řádků zvolením položky Přidat/odebrat sloupce v záhlaví tabulky.Pokud testovací běh otestoval všechny bloky na jednom řádku kódu, započítá se tento řádek jako úplný řádek.Když řádek obsahuje jak otestované, tak i neotestované bloky, pak se započítá jako částečný řádek.
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ů.
Správa výsledků pokrytí kódu
Okno Výsledky pokrytí kódu obvykle zobrazuje výsledek posledního běhu.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 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.
Je také možné sloučit výsledky několika běhů, pokud například používají jiná testovací data.
Pro zobrazení předchozí sady výsledků zvolte tuto sadu z rozevírací nabídky.Nabídka obsahuje dočasný seznam, který je po otevření nového řešení vyprázdněn.
Pro zobrazení výsledků z předchozí relace zvolte položku Importovat výsledky pokrytí kódu, přejděte do složky TestResults ve svém řešení a importujte soubor s příponou .coverage.
Vybarvení pokrytí může být nesprávné v případě, že byl zdrojový kód změněn od chvíle vygenerování souboru s příponou .coverage.
Aby byly výsledky čitelné jako text, zvolte položku Exportovat výsledky pokrytí kódu.Tím se vytvoří soubor s příponou .coveragexml, který je možné zpracovat v jiných nástrojích nebo jednoduše odeslat e-mailem.
Pro odeslání výsledků někomu jinému odešlete buď soubor s příponou .coverage, nebo exportovaný soubor s příponou .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ů různých běhů
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.Při druhém spuštění testu se vstupem „-2“ se v okně pokrytí zobrazí pokrytí zbylých 50 % funkce.Po sloučení výsledků těchto dvou testovacích běhů ukáže sestava i vybarvení 100% pokrytí funkce.
Pro docílení takového sloučení použijte položku Sloučit výsledky 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.
K uložení sloučených výsledků použijte položku Exportovat výsledky pokrytí kódu.
Omezení při slučování
Při sloučení dat pokrytí rozdílných verzí kódu jsou výsledky zobrazeny odděleně, ale nejsou sloučeny.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ů.Pro zobrazení dat podle řádků použijte položku Přidat/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í.To platí pouze pro samotné artefakty ASP.NET, výsledky pro jakákoli jiná sestavení budou sloučeny.
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.Přiřaďte atribut System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverage libovolnému z následujících prvků kódu: třída, struktura, metoda, vlastnost, metoda Set nebo Get vlastnosti, událost.Za povšimnutí stojí, že vyloučení třídy nevylučuje její 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 { ... }
Imports System.Diagnostics.CodeAnalysis
Class ExampleClass1
<ExcludeFromCodeCoverage()>
Public Sub ExampleSub1()
...
End Sub
' Exclude property
< ExcludeFromCodeCoverage()>
Property ExampleProperty1 As Integer
...
End Property
' Exclude setter
Property ExampleProperty2 As Integer
Get
...
End Get
<ExcludeFromCodeCoverage()>
Set(ByVal value As Integer)
...
End Set
End Property
End Class
<ExcludeFromCodeCoverage()>
Class ExampleClass2
...
End Class
// A .cpp file compiled as managed (CLI) code.
using namespace System::Diagnostics::CodeAnalysis;
...
public ref class ExampleClass1
{
public:
[ExcludeFromCodeCoverage]
void ExampleFunction1() { ... }
[ExcludeFromCodeCoverage]
property int ExampleProperty2 {...}
property int ExampleProperty2 {
int get() { ... }
[ExcludeFromCodeCoverage]
void set(int value) { ... }
}
}
[ExcludeFromCodeCoverage]
public ref class ExampleClass2
{ ... }
Vyloučení prvků v nativním kódu jazyka C++
Vyloučení nespravovaných (nativních) prvků kódu jazyka C++:
#include <CodeCoverage\CodeCoverage.h>
...
// Exclusions must be compiled as unmanaged (native):
#pragma managed(push, off)
// Exclude a particular function:
ExcludeFromCodeCoverage(Exclusion1, L"MyNamespace::MyClass::MyFunction");
// Exclude all the functions in a particular class:
ExcludeFromCodeCoverage(Exclusion2, L"MyNamespace::MyClass2::*");
// Exclude all the functions generated from a particular template:
ExcludeFromCodeCoverage(Exclusion3, L"*::MyFunction<*>");
// Exclude all the code from a particular .cpp file:
ExcludeSourceFromCodeCoverage(Exclusion4, L"*\\unittest1.cpp");
// After setting exclusions, restore the previous managed/unmanaged state:
#pragma managed(pop)
Použijte následující makra:
-
ExcludeFromCodeCoverage(ExclusionName, L"FunctionName");
ExcludeSourceFromCodeCoverage(ExclusionName, L"SourceFilePath");
ExclusionName je libovolný jedinečný název.
FunctionName je plně kvalifikovaný název funkce.Může obsahovat zástupné znaky.Například pro vyloučení všech funkcí třídy je možné napsat MyNamespace::MyClass::*
SourceFilePath je místní cesta nebo cesta UNC k souboru s příponou .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 kompilována jako nespravovaný (nativní) kód buď nastavením možnosti kompilátoru, nebo pomocí direktivy #pragma managed(off).
[!POZNÁMKA]
Pro vyloučení funkcí v kódu jazyka C++/CLI přiřaďte takové funkci 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 je provedena pouze u sestavení, která jsou načtena a pro něž je k dispozici soubor s příponou .pdb ve stejném adresáři jako soubor s příponou .dll nebo .exe.Proto je v některých případech možné rozšířit sadu zahrnutých sestavení získáním kopie jejich souborů s příponou .pdb.
Je také možné získat větší kontrolu nad sestaveními a prvky vybranými pro analýzu pokrytí kódu vytvoření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 ve službě sestavení
Při vrácení kódu se změnami jsou testy spuštěny na serveru sestavení společně se všemi dalšími testy ostatních členů týmu. (Pokud jste toto nastavení ještě neprovedli, více informací naleznete v tématu Spouštění testů v procesu sestavení.) Je užitečné analyzovat pokrytí kódu na službě sestavení, protože to poskytuje nejaktuálnější a nejsrozumitelnější obraz o pokrytí celého projektu.Takový postup bude také zahrnovat automatizované systémové testy a další kódované testy, které nejsou obvykle spouštěny na počítačích vývojářů.
V Průzkumníku týmových projektů otevřete položku Sestavení a poté přidejte nebo upravte definici sestavení.
Na stránce Proces rozbalte položky Automatizované testy, Zdroj testu, Parametry spuštění.Nastavte položku Typ souboru parametrů běhu na hodnotu Pokrytí kódu povoleno.
Pokud máte více než jednu definici Zdroje testu, opakujte tento krok pro každou z nich.
Pole s názvem Typ souboru parametrů běhu ale není k dispozici.
V části Automatizované testy zvolte položku Testovací sestavení a zvolte tlačítko se třemi tečkami [...] na konci řádku.V dialogovém okně Přidat/upravit testovací běh zvolte v položce Nástroj Test Runner hodnotu Visual Studio Test Runner.
Když sestavení proběhne, jsou výsledků pokrytí kódu připojeny k testovacímu běhu a zobrazí se v přehledu sestavení.
Analýza pokrytí kódu v příkazovém řádku
Pro spuštění testů z příkazového řádku se používá příkaz vstest.console.exe.Pokrytí kódu je jednou z možností tohoto nástroje.Další informace naleznete v tématu VSTest.Console.exe – možnosti příkazového řádku.
Spusťte příkazový řádek pro vývojáře v sadě Visual Studio:
V nabídce Start systému Windows zvolte položky Všechny programy, Microsoft Visual Studio, Visual Studio Tools, Příkazový řádek pro vývojáře.
Spusťte:
vstest.console.exe MyTestAssembly.dll /EnableCodeCoverage
Poradce při potížích
Pokud nejsou zobrazeny výsledky pokrytí kódu, naleznete více informací v tématu Poradce při potížích s pokrytím kódu.
Externí zdroje
Doprovodné materiály
Viz také
Koncepty
Přizpůsobení analýzy pokrytí kódu