Dela via


kodtäckningsverktyg för dotnet-täckning

Den här artikeln gäller för: ✔️ .NET Core 3.1 SDK och senare versioner

Sammanfattning

dotnet-coverage [-h, --help] [--version] <command>

beskrivning

Verktyget dotnet-coverage :

  • Möjliggör plattformsoberoende insamling av kodtäckningsdata för en process som körs.
  • Tillhandahåller plattformsoberoende sammanslagning av kodtäckningsrapporter.

Alternativ

  • -h|--help

    Visar kommandoradshjälp.

  • --version

    Visar versionen av verktyget dotnet-coverage.

Installera

Om du vill installera den senaste versionen av dotnet-coverageNuGet-paketet använder du installationskommandot för dotnet-verktyget:

dotnet tool install --global dotnet-coverage

Kommandon

Command
dotnet-täckningssammanslagning
dotnet-täckning samla in
dotnet-coverage connect
ögonblicksbild av dotnet-täckning
dotnet-täckningsavstängning
dotnet-täckningsinstrument

dotnet-täckningssammanslagning

Kommandot merge används för att sammanfoga flera kodtäckningsrapporter till en. Det här kommandot är tillgängligt på alla plattformar. Det här kommandot stöder följande format för kodtäckningsrapport:

  • coverage
  • cobertura
  • xml

Sammanfattning

dotnet-coverage merge
    [--remove-input-files]
    [-o|--output <output>] [-f|--output-format <output-format>]
    [-l|--log-file <log-file>] [-ll|--log-level <log-level>] [-?|-h|--help]
    <files>

Argument

  • <files>

    Rapporter om täckning av indatakod.

Alternativ

  • --remove-input-files

    Tar bort alla indatatäckningsrapporter som har sammanfogats.

  • -r, --recursive

    .NET 7 SDK och tidigare versioner söker endast efter täckningsrapporter i underkataloger.

  • -o|--output <output>

    Anger utdatafilen för kodtäckningsrapporten.

  • -f|--output-format <output-format>

    Utdatafilformatet. Värden som stöds: coverage, xmloch cobertura. Standardvärdet är coverage (binärt format som kan öppnas i Visual Studio).

  • -l|--log-file <log-file>

    Anger loggfilens sökväg. När du anger en katalog (med en sökvägsavgränsare i slutet) genereras en ny loggfil för varje process som analyseras.

  • -ll|--log-level <log-level>

    Anger loggnivån. Värden som stöds: Error, Infooch Verbose.

dotnet-täckning samla in

Kommandot collect används för att samla in kodtäckningsdata för alla .NET-processer och dess underprocesser. Du kan till exempel samla in kodtäckningsdata för ett konsolprogram eller ett Blazor-program. Det här kommandot stöder dynamisk och statisk instrumentering. Statisk instrumentation är tillgänglig på alla plattformar. Du kan ange filer som ska instrumenteras statiskt med hjälp av include-files alternativet . Dynamisk instrumentering är tillgängligt i Windows (x86, x64 och Arm64), Linux (x64) och macOS (x64). Kommandot stöder endast .NET-moduler. Inbyggda moduler stöds inte.

Sammanfattning

Kommandot collect kan köras i två lägen.

Kommandoläge

Kommandot collect samlar in kodtäckning för den angivna processen som körs av command argumentet.

dotnet-coverage collect
    [-s|--settings <settings>] [-id|--session-id <session-id>]
    [-if|--include-files <include-files>] [-o|--output <output>]
    [-f|--output-format <output-format>] [-l|--log-file <log-file>]
    [-ll|--log-level <log-level>] [-?|-h|--help]
    <command> <args>

Serverläge

Kommandot collect är värd för en server för kodtäckningssamling. Klienter kan ansluta till servern via connect kommando.

dotnet-coverage collect
    [-s|--settings <settings>] [-id|--session-id <session-id>]
    [-sv|--server-mode] [-b|--background] [-t|--timeout]
    [-if|--include-files <include-files>] [-o|--output <output>]
    [-f|--output-format <output-format>] [-l|--log-file <log-file>]
    [-ll|--log-level <log-level>] [-?|-h|--help]

Argument

  • <command>

    Kommandot som du vill samla in kodtäckningsdata för.

  • <args>

    Kommandoradsargumenten för kommandot.

Alternativ

  • -s|--settings <settings>

    Anger sökvägen till inställningarna för XML-kodtäckning.

  • -id|--session-id <session-id>

    Anger sessions-ID för kodtäckning. Om det inte anges genererar verktyget ett slumpmässigt GUID.

  • -sv|--server-mode

    Startar insamlaren i serverläge. Klienter kan ansluta till servern med connect kommandot .

  • -b|--background

    Startar insamlingsservern för kodtäckning i en ny bakgrundsprocess. Klienter kan ansluta till servern med connect kommandot .

  • -t|--timeout

    Tidsgräns (i millisekunder) för interprocesskommunikation mellan klienter och servern.

  • -if|--include-files <include-files>

    Anger en lista över filer som ska instrumenteras statiskt.

  • -o|--output <output>

    Anger utdatafilen för kodtäckningsrapporten.

  • -f|--output-format <output-format>

    Utdatafilformatet. Värden som stöds: coverage, xmloch cobertura. Standardvärdet är coverage (binärt format som kan öppnas i Visual Studio).

  • -l|--log-file <log-file>

    Anger loggfilens sökväg. När du anger en katalog (med en sökvägsavgränsare i slutet) genereras en ny loggfil för varje process som analyseras.

  • -ll|--log-level <log-level>

    Anger loggnivån. Värden som stöds: Error, Infooch Verbose.

dotnet-coverage connect

Kommandot connect används för att ansluta till den befintliga servern och samlar in kodtäckningsdata för alla .NET-processer och dess underprocesser. Du kan till exempel samla in kodtäckningsdata för ett konsolprogram eller ett Blazor-program. Kommandot stöder endast .NET-moduler. Inbyggda moduler stöds inte.

Kommentar

Kommandot använder dynamisk instrumentering för alla underprocesser som är tillgängliga i Windows (x86, x64 och Arm64), Linux (x64) och macOS (x64). Om du behöver statiskt instrumentera ett .NET-modulanvändningskommando instrument (med motsvarande sessions-ID-alternativ) innan du connect kör kommandot.

Sammanfattning

dotnet-coverage connect
    [-b|--background] [-t|--timeout]
    [-l|--log-file <log-file>] [-ll|--log-level <log-level>] [-?|-h|--help]
    <session>
    <command> <args>

Argument

  • <session>

    Sessions-ID:t för servern som hanteras av collect kommandot.

  • <command>

    Kommandot som du vill samla in kodtäckningsdata för.

  • <args>

    Kommandoradsargumenten för kommandot.

Alternativ

  • -b|--background

    Startar klienten i en ny bakgrundsprocess.

  • -t|--timeout

    Tidsgräns (i millisekunder) för kommunikation mellan klienten och servern.* -l|--log-file <log-file>

  • -l|--log-file <log-file>

    Anger loggfilens sökväg. När du anger en katalog (med en sökvägsavgränsare i slutet) genereras en ny loggfil för varje process som analyseras.

  • -ll|--log-level <log-level>

    Anger loggnivån. Värden som stöds: Error, Infooch Verbose.

ögonblicksbild av dotnet-täckning

Skapar en täckningsfil för befintlig kodtäckningssamling.

Sammanfattning

dotnet-coverage snapshot
    [-r|--reset]
    [-o|--output <output>]
    [-tn|--tag-name <tag-name>] [-tid|--tag-identifier <tag-identifier>]
    [-t|--timeout]
    [-l|--log-file <log-file>] [-ll|--log-level <log-level>] [-?|-h|--help]
    <session>

Argument

  • <session>

    Sessions-ID för samlingen som en täckningsfil ska genereras för.

Alternativ

  • -r|--reset <reset>

    Rensar befintlig täckningsinformation när en täckningsfil har skapats.

  • -o|--output <output>

    Anger utdatafilen för kodtäckningsrapporten. Om det inte anges genereras det automatiskt med en tidsstämpel.

  • -tn|--tag-name <tag-name>

    Skapar ett namn på en ögonblicksbildtagg i täckningsfilen med aktuell täckningsinformation. Taggnamn och taggidentifierare är ömsesidigt inkluderande.

  • -tid|--tag-identifier <tag-identifier>

    Skapar en taggidentifierare för ögonblicksbilder i täckningsfilen med aktuell täckningsinformation. Taggnamn och taggidentifierare är ömsesidigt inkluderande.

  • -t|--timeout

    Tidsgräns (i millisekunder) för kommunikation mellan klienten och servern.

  • -l|--log-file <log-file>

    Anger loggfilens sökväg. När du anger en katalog (med en sökvägsavgränsare i slutet) genereras en ny loggfil för varje process som analyseras.

  • -ll|--log-level <log-level>

    Anger loggnivån. Värden som stöds: Error, Infooch Verbose.

dotnet-täckningsavstängning

Stänger befintlig kodtäckningssamling.

Sammanfattning

dotnet-coverage shutdown
    [-t|--timeout]
    [-l|--log-file <log-file>] [-ll|--log-level <log-level>] [-?|-h|--help]
    <session>

Argument

  • <session>

    Sessions-ID för samlingen som ska stängas.

Alternativ

  • -t|--timeout

    Tidsgräns (i millisekunder) för kommunikation mellan processer med servern.

  • -l|--log-file <log-file>

    Anger loggfilens sökväg. När du anger en katalog (med en sökvägsavgränsare i slutet) genereras en ny loggfil för varje process som analyseras.

  • -ll|--log-level <log-level>

    Anger loggnivån. Värden som stöds: Error, Infooch Verbose.

dotnet-täckningsinstrument

Instrumentkommandot används för att instrumentera binärt på disk.

Sammanfattning

dotnet-coverage instrument
    [-s|--settings <settings>] [-id|--session-id <session-id>]
    [-o|--output <output>] [-l|--log-file <log-file>]
    [-ll|--log-level <log-level>] [-?|-h|--help]
    <input-file>

Argument

  • <input-file>

    Indatabinär.

Alternativ

  • -s|--settings <settings>

    Anger sökvägen till inställningarna för XML-kodtäckning.

  • -id|--session-id <session-id>

    Anger sessions-ID för kodtäckning. Om det inte anges genererar verktyget ett slumpmässigt GUID.

  • -o|--output <output>

    Anger sökvägen till utdatafilen binär. Om det inte tillhandahålls utförs instrumentationen på plats.

  • -l|--log-file <log-file>

    Anger loggfilens sökväg. När du anger en katalog (med en sökvägsavgränsare i slutet) genereras en ny loggfil för varje process som analyseras.

  • -ll|--log-level <log-level>

    Anger loggnivån. Värden som stöds: Error, Infooch Verbose.

Exempelscenarier

Samla in kodtäckning

Samla in kodtäckningsdata för alla .NET-program (till exempel konsol eller Blazor) med hjälp av följande kommando:

dotnet-coverage collect dotnet run

Om ett program som kräver en signal avslutas kan du använda Ctrl+C, som fortfarande låter dig samla in kodtäckningsdata. För argumentet kan du ange alla kommandon som så småningom startar en .NET-app. Det kan till exempel vara ett PowerShell-skript.

Sessioner

När du kör kodtäckningsanalys på en .NET-server som bara väntar på meddelanden och skickar svar, behöver du ett sätt att stoppa servern för att få slutresultat för kodtäckning. Du kan använda Ctrl+C lokalt, men inte i Azure Pipelines. I dessa scenarier kan du använda sessioner. Du kan ange ett sessions-ID när du startar samlingen och sedan använda shutdown kommandot för att stoppa samlingen och servern.

Anta till exempel att du har en server i katalogen D:\serverexample\server och ett testprojekt i katalogen D:\serverexample\tests . Testerna kommunicerar med servern via nätverket. Du kan starta kodtäckningssamlingen för servern på följande sätt:

D:\serverexample\server> dotnet-coverage collect --session-id serverdemo "dotnet run"

Sessions-ID angavs som serverdemo. Sedan kan du köra tester på följande sätt:

D:\serverexample\tests> dotnet test

En kodtäckningsfil för sessionen serverdemo kan genereras med aktuell täckning enligt följande:

dotnet-coverage snapshot --output after_first_test.coverage serverdemo

Dessutom kan en tagg för ögonblicksbilder läggas till i täckningsfilen med hjälp av taggalternativ på följande sätt:

dotnet-coverage snapshot --tag-name after_first_test --tag-identifier after_first_test serverdemo

Slutligen kan sessionen serverdemo och servern stängas på följande sätt:

dotnet-coverage shutdown serverdemo

Följande är ett exempel på fullständiga utdata på serversidan:

D:\serverexample\server> dotnet-coverage collect --session-id serverdemo "dotnet run"
SessionId: serverdemo
Waiting for a connection... Connected!
Received: Hello!
Sent: HELLO!
Waiting for a connection... Code coverage results: output.coverage.
D:\serverexample\server>

Server- och klientläge

Insamling av kodtäckning kan också göras i server-klientläge. I det här scenariot startar en kodtäckningssamlingsserver och flera klienter kan ansluta till servern. Kodtäckning samlas in för alla klienter tillsammans.

Starta kodtäckningsservern med följande kommando:

dotnet-coverage collect --session-id serverdemo --server-mode

I det här exemplet angavs serverdemo sessions-ID som för servern. En klient kan ansluta till servern med det här sessions-ID:t med hjälp av följande kommando:

dotnet-coverage connect serverdemo dotnet run

Slutligen kan du stänga sessionen serverdemo och servern med hjälp av följande kommando:

dotnet-coverage shutdown serverdemo

Serverprocessen skapar en samlad kodtäckningsrapport för alla klienter och utgångar.

Följande är ett exempel på fullständiga utdata på serversidan:

D:\serverexample\server> dotnet-coverage collect --session-id serverdemo --server-mode
SessionId: serverdemo
// Server will be in idle state and wait for connect and shutdown commands
Code coverage results: output.coverage.
D:\serverexample\server>

Följande är ett exempel på fullständiga utdata på klientsidan:

D:\serverexample\server> dotnet-coverage connect serverdemo ConsoleApplication.exe World
Hello World!!
D:\serverexample\server> dotnet-coverage connect serverdemo WpfApplication.exe
D:\serverexample\server> dotnet-coverage shutdown serverdemo
D:\serverexample\server>

Du kan också starta både servern och klienten i bakgrundsläge. En annan process startar i bakgrunden och returnerar kontrollen tillbaka till användaren.

Följande är ett exempel på fullständiga utdata i klientläge för bakgrundsservern:

D:\serverexample\server> dotnet-coverage collect --session-id serverdemo --server-mode --background
D:\serverexample\server> dotnet-coverage connect --background serverdemo ConsoleApplication.exe World
D:\serverexample\server> dotnet-coverage connect --background serverdemo WpfApplication.exe
D:\serverexample\server> dotnet-coverage shutdown serverdemo
D:\serverexample\server>

Statisk kodtäckning för hanterade sammansättningar

Verktyget dotnet-coverage kan användas för att samla in kodtäckning för hanterade sammansättningar med hjälp av statisk instrumentation. Det finns tre olika metoder som du kan använda. För att demonstrera antar vi att vi har ett enkelt C#-konsolprogram:

D:\examples\ConsoleApp> dotnet run
Hello, World!

Använd kommandot collect med alternativet inkludera filer eller konfiguration

Om du inte vill använda instrument kommandot kan de filer som ska instrumenteras anges med hjälp av --include-files alternativet så här:

D:\examples\ConsoleApp> dotnet-coverage collect --include-files .\bin\Debug\net7.0\*.dll dotnet run
Microsoft (R) Code Coverage Command Line Tool (x64)
Copyright (c) Microsoft Corporation. All rights reserved.

SessionId: 57862ec0-e512-49a5-8b66-2804174680fc
Hello, World!
Code coverage results: output.coverage.

Du kan också ange filer som ska instrumenteras med hjälp av konfigurationen på följande sätt:

<ModulePaths>
  <IncludeDirectories>
    <Directory>D:\examples\ConsoleApp\bin\Debug\net7.0</Directory>
  </IncludeDirectories>
</ModulePaths>

Använda instrument och samla in kommandon

I det här fallet måste den första binärfilen instrumenteras på följande sätt:

D:\examples\ConsoleApp> dotnet-coverage instrument .\bin\Debug\net7.0\ConsoleApp.dll
Microsoft (R) Code Coverage Command Line Tool (x64)
Copyright (c) Microsoft Corporation. All rights reserved.

Input file successfully instrumented.

Sedan kan du samla in kodtäckning på följande sätt:

D:\examples\ConsoleApp> dotnet-coverage collect .\bin\Debug\net7.0\ConsoleApp.exe
Microsoft (R) Code Coverage Command Line Tool (x64)
Copyright (c) Microsoft Corporation. All rights reserved.

SessionId: a09e6bef-ff64-4b5f-8bb8-fc495ebb50ba
Hello, World!
Code coverage results: output.coverage.

Använda instrument och samla in kommandon i serverläge

I det här fallet kan du helt separera täckningssamlingen från att köra ditt program. Instrumentera först binärfilen enligt följande:

D:\examples\ConsoleApp> dotnet-coverage instrument --session-id 73c34ce5-501c-4369-a4cb-04d31427d1a4 .\bin\Debug\net7.0\ConsoleApp.dll
Microsoft (R) Code Coverage Command Line Tool (x64)
Copyright (c) Microsoft Corporation. All rights reserved.

Input file successfully instrumented.

Kommentar

Sessions-ID måste användas i det här scenariot för att säkerställa att programmet kan ansluta och tillhandahålla data till extern insamlare.

I det andra steget måste du starta täckningsinsamlaren på följande sätt:

D:\examples\ConsoleApp> dotnet-coverage collect --session-id 73c34ce5-501c-4369-a4cb-04d31427d1a4 --server-mode
Microsoft (R) Code Coverage Command Line Tool (x64)
Copyright (c) Microsoft Corporation. All rights reserved.

SessionId: 73c34ce5-501c-4369-a4cb-04d31427d1a4

Sedan kan programmet startas på följande sätt:

D:\examples\ConsoleApp> .\bin\Debug\net7.0\ConsoleApp.exe
Hello, World!

Slutligen kan insamlaren stängas på följande sätt:

D:\examples\ConsoleApp> dotnet-coverage shutdown 73c34ce5-501c-4369-a4cb-04d31427d1a4
Microsoft (R) Code Coverage Command Line Tool (x64)
Copyright (c) Microsoft Corporation. All rights reserved.

Inställningar

Du kan ange en fil med inställningar när du använder collect kommandot . Inställningsfilen kan användas för att undanta vissa moduler eller metoder från kodtäckningsanalys. Formatet är samma som datainsamlarens konfiguration i en runsettings-fil . Mer information finns i Anpassa kodtäckningsanalys. Här är ett exempel:

<?xml version="1.0" encoding="utf-8"?>
<Configuration>
    <CodeCoverage>
        <!--
        Additional paths to search for .pdb (symbol) files. Symbols must be found for modules to be instrumented.
        If .pdb files are in the same folder as the .dll or .exe files, they are automatically found. Otherwise, specify them here.
        Note that searching for symbols increases code coverage run time. So keep this small and local.
        -->
        <SymbolSearchPaths>
            <Path>C:\Users\User\Documents\Visual Studio 2012\Projects\ProjectX\bin\Debug</Path>
            <Path>\\mybuildshare\builds\ProjectX</Path>
        </SymbolSearchPaths>

        <!--
        About include/exclude lists:
        Empty "Include" clauses imply all; empty "Exclude" clauses imply none.
        Each element in the list is a regular expression (ECMAScript syntax). See /visualstudio/ide/using-regular-expressions-in-visual-studio.
        An item must first match at least one entry in the include list to be included.
        Included items must then not match any entries in the exclude list to remain included.
        -->

        <!-- Match assembly file paths: -->
        <ModulePaths>
            <Include>
                <ModulePath>.*\.dll$</ModulePath>
                <ModulePath>.*\.exe$</ModulePath>
            </Include>
            <Exclude>
                <ModulePath>.*CPPUnitTestFramework.*</ModulePath>
            </Exclude>
            <!-- Additional directories from .NET assemblies should be statically instrumented: -->
            <IncludeDirectories>
                <Directory Recursive="true">C:\temp</Directory>
            </IncludeDirectories>
        </ModulePaths>

        <!-- Match fully qualified names of functions: -->
        <!-- (Use "\." to delimit namespaces in C# or Visual Basic, "::" in C++.)  -->
        <Functions>
            <Exclude>
                <Function>^Fabrikam\.UnitTest\..*</Function>
                <Function>^std::.*</Function>
                <Function>^ATL::.*</Function>
                <Function>.*::__GetTestMethodInfo.*</Function>
                <Function>^Microsoft::VisualStudio::CppCodeCoverageFramework::.*</Function>
                <Function>^Microsoft::VisualStudio::CppUnitTestFramework::.*</Function>
            </Exclude>
        </Functions>

        <!-- Match attributes on any code element: -->
        <Attributes>
            <Exclude>
            <!-- Don't forget "Attribute" at the end of the name -->
                <Attribute>^System\.Diagnostics\.DebuggerHiddenAttribute$</Attribute>
                <Attribute>^System\.Diagnostics\.DebuggerNonUserCodeAttribute$</Attribute>
                <Attribute>^System\.CodeDom\.Compiler\.GeneratedCodeAttribute$</Attribute>
                <Attribute>^System\.Diagnostics\.CodeAnalysis\.ExcludeFromCodeCoverageAttribute$</Attribute>
            </Exclude>
        </Attributes>

        <!-- Match the path of the source files in which each method is defined: -->
        <Sources>
            <Exclude>
                <Source>.*\\atlmfc\\.*</Source>
                <Source>.*\\vctools\\.*</Source>
                <Source>.*\\public\\sdk\\.*</Source>
                <Source>.*\\microsoft sdks\\.*</Source>
                <Source>.*\\vc\\include\\.*</Source>
            </Exclude>
        </Sources>

        <!-- Match the company name property in the assembly: -->
        <CompanyNames>
            <Exclude>
                <CompanyName>.*microsoft.*</CompanyName>
            </Exclude>
        </CompanyNames>

        <!-- Match the public key token of a signed assembly: -->
        <PublicKeyTokens>
            <!-- Exclude Visual Studio extensions: -->
            <Exclude>
                <PublicKeyToken>^B77A5C561934E089$</PublicKeyToken>
                <PublicKeyToken>^B03F5F7F11D50A3A$</PublicKeyToken>
                <PublicKeyToken>^31BF3856AD364E35$</PublicKeyToken>
                <PublicKeyToken>^89845DCD8080CC91$</PublicKeyToken>
                <PublicKeyToken>^71E9BCE111E9429C$</PublicKeyToken>
                <PublicKeyToken>^8F50407C4E9E73B6$</PublicKeyToken>
                <PublicKeyToken>^E361AF139669C375$</PublicKeyToken>
            </Exclude>
        </PublicKeyTokens>

        <EnableStaticManagedInstrumentation>True</EnableStaticManagedInstrumentation>
        <EnableDynamicManagedInstrumentation>True</EnableDynamicManagedInstrumentation>

    </CodeCoverage>
</Configuration>

Koppla kodtäckningsrapporter

Du kan sammanfoga a.coverage och b.coverage lagra data på merged.coverage följande sätt:

dotnet-coverage merge -o merged.coverage a.coverage b.coverage

Om du till exempel kör ett kommando som dotnet test --collect "Code Coverage"lagras täckningsrapporten i en mapp som heter ett slumpmässigt GUID. Sådana mappar är svåra att hitta och sammanfoga. Med det här verktyget kan du slå samman alla kodtäckningsrapporter för alla dina projekt med hjälp av globbande mönster på följande sätt:

dotnet-coverage merge -o merged.cobertura.xml -f cobertura **\*.coverage

Föregående kommando sammanfogar alla täckningsrapporter från den aktuella katalogen och alla underkataloger och lagrar resultatet i en cobertura-fil. I Azure Pipelines kan du använda aktiviteten Publicera kodtäckningsresultat för att publicera en sammanslagen cobertura-rapport.

Du kan använda merge kommandot för att konvertera en kodtäckningsrapport till ett annat format. Följande kommando konverterar till exempel en rapport om täckning av binär kod till XML-format.

dotnet-coverage merge -o output.xml -f xml input.coverage

Se även