Utilità di code coverage dotnet-coverage
Questo articolo si applica a: ✔️ .NET Core 3.1 SDK e versioni successive
Riepilogo
dotnet-coverage [-h, --help] [--version] <command>
Descrizione
Lo strumento dotnet-coverage
:
- Abilita la raccolta multipiattaforma dei dati di code coverage di un processo in esecuzione.
- Fornisce l'unione multipiattaforma dei report di code coverage.
Opzioni
-h|--help
Mostra la Guida della riga di comando.
--version
Visualizza la versione dell'utilità dotnet-coverage.
Installare
Per installare la versione più recente del dotnet-coverage
pacchetto NuGet, usare il comando dotnet tool install:
dotnet tool install --global dotnet-coverage
Comandi
Comando |
---|
unione dotnet-coverage |
raccolta dotnet-coverage |
connessione dotnet-coverage |
snapshot dotnet-coverage |
arresto dotnet-coverage |
strumento dotnet-coverage |
unione dotnet-coverage
Il comando merge
viene usato per unire più report di code coverage in uno. Questo comando è disponibile in tutte le piattaforme. Questo comando supporta i formati di report di code coverage seguenti:
coverage
cobertura
xml
Riepilogo
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>
Argomenti
<files>
Report di code coverage di input.
Opzioni
--remove-input-files
Rimuove tutti i report di copertura di input che sono stati uniti.
-r, --recursive
.NET 7 SDK e versioni precedenti cercano solo report di copertura nelle sottodirectory.
-o|--output <output>
Imposta il file di output del report code coverage.
-f|--output-format <output-format>
Formato del file di output. Valori supportati:
coverage
,xml
ecobertura
. Il valore predefinito ècoverage
(formato binario che può essere aperto in Visual Studio).-l|--log-file <log-file>
Immettere il percorso del file log. Quando si specifica una directory (con un separatore di percorso alla fine), viene generato un nuovo file di log per ogni processo sottoposto ad analisi.
-ll|--log-level <log-level>
Imposta il livello di log. Valori supportati:
Error
,Info
eVerbose
.
raccolta dotnet-coverage
Il comando collect
viene usato per raccogliere i dati di code coverage per qualsiasi processo .NET e i relativi sottoprocessi. Ad esempio, è possibile raccogliere dati di code coverage per un'applicazione console o un'applicazione Blazor. Questo comando supporta la strumentazione dinamica e statica. La strumentazione statica è disponibile in tutte le piattaforme. È possibile specificare i file da instrumentare in modo statico usando l'opzione include-files
. La strumentazione dinamica è disponibile in Windows (x86, x64 e Arm64), Linux (x64) e macOS (x64). Il comando supporta solo i moduli .NET. I moduli nativi non sono supportati.
Riepilogo
Il comando collect
può essere eseguito in due modalità.
Modalità di comando
Il comando collect
raccoglierà il code coverage per il processo specificato eseguito dall'argomento command
.
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>
Modalità server
Il comando collect
ospita un server per la raccolta di code coverage. I client possono connettersi al server tramite il comando connect
.
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]
Argomenti
<command>
Comando per il quale raccogliere i dati di code coverage.
<args>
Argomenti della riga di comando per il comando.
Opzioni
-s|--settings <settings>
Imposta il percorso delle impostazioni di code coverage XML.
-id|--session-id <session-id>
Specifica l'ID sessione di code coverage. Se non specificato, lo strumento genererà un GUID casuale.
-sv|--server-mode
Avvia l'agente di raccolta in modalità server. I client possono connettersi al server con il comando
connect
.-b|--background
Avvia il server di raccolta code coverage in un nuovo processo in background. I client possono connettersi al server con il comando
connect
.-t|--timeout
Timeout (in millisecondi) per la comunicazione interprocesso tra client e server.
-if|--include-files <include-files>
Specifica l'elenco di file da instrumentare in modo statico.
-o|--output <output>
Imposta il file di output del report code coverage.
-f|--output-format <output-format>
Formato del file di output. Valori supportati:
coverage
,xml
ecobertura
. Il valore predefinito ècoverage
(formato binario che può essere aperto in Visual Studio).-l|--log-file <log-file>
Immettere il percorso del file log. Quando si specifica una directory (con un separatore di percorso alla fine), viene generato un nuovo file di log per ogni processo sottoposto ad analisi.
-ll|--log-level <log-level>
Imposta il livello di log. Valori supportati:
Error
,Info
eVerbose
.
connessione dotnet-coverage
Il comando connect
viene usato per connettersi al server esistente e raccoglie i dati di code coverage per qualsiasi processo .NET e i relativi sottoprocessi. Ad esempio, è possibile raccogliere dati di code coverage per un'applicazione console o un'applicazione Blazor. Il comando supporta solo i moduli .NET. I moduli nativi non sono supportati.
Nota
Il comando userà la strumentazione dinamica per tutti i sottoprocessi disponibili in Windows (x86, x64 e Arm64), Linux (x64) e macOS (x64). Se è necessario instrumentare in modo statico qualsiasi modulo .NET, usare il comando instrument
(con l'opzione ID sessione corrispondente) prima di eseguire il comando connect
.
Riepilogo
dotnet-coverage connect
[-b|--background] [-t|--timeout]
[-l|--log-file <log-file>] [-ll|--log-level <log-level>] [-?|-h|--help]
<session>
<command> <args>
Argomenti
<session>
ID sessione del server ospitato dal comando
collect
.<command>
Comando per il quale raccogliere i dati di code coverage.
<args>
Argomenti della riga di comando per il comando.
Opzioni
-b|--background
Avvia il client in un nuovo processo in background.
-t|--timeout
Timeout (in millisecondi) per la comunicazione interprocesso tra il client e il server.*
-l|--log-file <log-file>
-l|--log-file <log-file>
Immettere il percorso del file log. Quando si specifica una directory (con un separatore di percorso alla fine), viene generato un nuovo file di log per ogni processo sottoposto ad analisi.
-ll|--log-level <log-level>
Imposta il livello di log. Valori supportati:
Error
,Info
eVerbose
.
snapshot dotnet-coverage
Crea un file di copertura per la raccolta di code coverage esistente.
Riepilogo
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>
Argomenti
<session>
ID sessione della raccolta per cui deve essere generato un file di copertura.
Opzioni
-r|--reset <reset>
Cancella le informazioni di copertura esistenti dopo la creazione di un file di copertura.
-o|--output <output>
Imposta il file di output del report code coverage. Se non specificato, viene generato automaticamente con un timestamp.
-tn|--tag-name <tag-name>
Crea un nome di tag snapshot nel file di copertura con le informazioni di copertura correnti. Tag-name e tag-identifier sono inclusivi a vicenda.
-tid|--tag-identifier <tag-identifier>
Crea un identificatore di tag snapshot nel file di copertura con le informazioni di copertura correnti. Tag-name e tag-identifier sono inclusivi a vicenda.
-t|--timeout
Timeout (in millisecondi) per la comunicazione interprocesso tra il client e il server.
-l|--log-file <log-file>
Immettere il percorso del file log. Quando si specifica una directory (con un separatore di percorso alla fine), viene generato un nuovo file di log per ogni processo sottoposto ad analisi.
-ll|--log-level <log-level>
Imposta il livello di log. Valori supportati:
Error
,Info
eVerbose
.
arresto dotnet-coverage
Chiude la raccolta code coverage esistente.
Riepilogo
dotnet-coverage shutdown
[-t|--timeout]
[-l|--log-file <log-file>] [-ll|--log-level <log-level>] [-?|-h|--help]
<session>
Argomenti
<session>
ID sessione della raccolta da chiudere.
Opzioni
-t|--timeout
Timeout (in millisecondi) per la comunicazione interprocesso con il server.
-l|--log-file <log-file>
Immettere il percorso del file log. Quando si specifica una directory (con un separatore di percorso alla fine), viene generato un nuovo file di log per ogni processo sottoposto ad analisi.
-ll|--log-level <log-level>
Imposta il livello di log. Valori supportati:
Error
,Info
eVerbose
.
strumento dotnet-coverage
Il comando strumento viene usato per instrumentare il file binario su disco.
Riepilogo
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>
Argomenti
<input-file>
Binario di input.
Opzioni
-s|--settings <settings>
Imposta il percorso delle impostazioni di code coverage XML.
-id|--session-id <session-id>
Specifica l'ID sessione di code coverage. Se non specificato, lo strumento genererà un GUID casuale.
-o|--output <output>
Imposta il percorso del file binario di output. Se non specificato, la strumentazione verrà eseguita sul posto.
-l|--log-file <log-file>
Immettere il percorso del file log. Quando si specifica una directory (con un separatore di percorso alla fine), viene generato un nuovo file di log per ogni processo sottoposto ad analisi.
-ll|--log-level <log-level>
Imposta il livello di log. Valori supportati:
Error
,Info
eVerbose
.
Scenari di esempio
Raccolta di code coverage
Raccogliere i dati di code coverage per qualsiasi applicazione .NET (ad esempio console o Blazor) usando il comando seguente:
dotnet-coverage collect dotnet run
Nel caso di un'applicazione che richiede un segnale da terminare, è possibile usare CTRL+C, che consente comunque di raccogliere i dati di code coverage. Per l'argomento, è possibile specificare qualsiasi comando che alla fine avvierà un'app .NET. Ad esempio, può essere uno script di PowerShell.
Sessioni
Quando si esegue l'analisi del code coverage in un server .NET che attende solo i messaggi e invia risposte, è necessario un modo per arrestare il server per ottenere i risultati finali del code coverage. È possibile usare CTRL+C in locale, ma non in Azure Pipelines. Per questi scenari, è possibile usare le sessioni. È possibile specificare un ID sessione all'avvio della raccolta e quindi usare il comando shutdown
per arrestare la raccolta e il server.
Si supponga, ad esempio, di avere un server nella directory D:\serverexample\server e un progetto di test nella directory D:\serverexample\tests. I test comunicano con il server tramite la rete. È possibile avviare la raccolta di code coverage per il server come indicato di seguito:
D:\serverexample\server> dotnet-coverage collect --session-id serverdemo "dotnet run"
L'ID sessione è stato specificato come serverdemo
. È quindi possibile eseguire i test come segue:
D:\serverexample\tests> dotnet test
È possibile generare un file di code coverage per serverdemo
della sessione con copertura corrente come indicato di seguito:
dotnet-coverage snapshot --output after_first_test.coverage serverdemo
Inoltre, è possibile aggiungere un tag snapshot al file di copertura usando le opzioni tag come indicato di seguito:
dotnet-coverage snapshot --tag-name after_first_test --tag-identifier after_first_test serverdemo
Infine, serverdemo
della sessione e il server possono essere chiusi nel modo seguente:
dotnet-coverage shutdown serverdemo
Di seguito è riportato un esempio di output completo sul lato server:
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>
Modalità server e client
La raccolta di code coverage può essere eseguita anche in modalità client server. In questo scenario viene avviato un server di raccolta code coverage e più client possono connettersi al server. Il code coverage viene raccolto per tutti i client collettivamente.
Avviare il server code coverage usando il comando seguente:
dotnet-coverage collect --session-id serverdemo --server-mode
In questo esempio l'ID sessione è stato specificato come serverdemo
per il server. Un client può connettersi al server usando questo ID sessione usando il comando seguente:
dotnet-coverage connect serverdemo dotnet run
Infine, è possibile chiudere serverdemo
della sessione e il server usando il comando seguente:
dotnet-coverage shutdown serverdemo
Il processo del server crea un report di code coverage collettivo per tutti i client e le uscite.
Di seguito è riportato un esempio di output completo sul lato server:
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>
Di seguito è riportato un esempio di output completo sul lato client:
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>
È anche possibile avviare sia il server che il client in modalità in background. Un altro processo viene avviato in background e restituisce il controllo all'utente.
Di seguito è riportato un esempio di output completo in modalità client del server in background:
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>
Code coverage statico per gli assembly gestiti
Lo strumento dotnet-coverage può essere usato per raccogliere code coverage per gli assembly gestiti usando la strumentazione statica. Sono disponibili tre metodi diversi che è possibile usare. Per dimostrare, si supponga di avere una semplice applicazione console C#:
D:\examples\ConsoleApp> dotnet run
Hello, World!
Usare il comando Collect con l'opzione includi file o la configurazione
Se non si vuole usare il comando instrument
, è possibile specificare i file da instrumentare usando l'opzione --include-files
come indicato di seguito:
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.
È anche possibile specificare i file da instrumentare usando la configurazione come indicato di seguito:
<ModulePaths>
<IncludeDirectories>
<Directory>D:\examples\ConsoleApp\bin\Debug\net7.0</Directory>
</IncludeDirectories>
</ModulePaths>
Uso di strumento e raccolta di comandi
In questo caso, il primo file binario deve essere instrumentato come segue:
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.
È quindi possibile raccogliere il code coverage come segue:
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.
Usare lo strumento e raccogliere i comandi in modalità server
In questo caso, è possibile separare completamente la raccolta di copertura dall'esecuzione dell'applicazione. Prima di tutto, instrumentare il file binario come segue:
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.
Nota
L'ID sessione deve essere usato in questo scenario per assicurarsi che l'applicazione possa connettersi e fornire dati all'agente di raccolta esterno.
Nel secondo passaggio è necessario avviare l'agente di raccolta code coverage come indicato di seguito:
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
È quindi possibile avviare l'applicazione come segue:
D:\examples\ConsoleApp> .\bin\Debug\net7.0\ConsoleApp.exe
Hello, World!
Infine, l'agente di raccolta può essere chiuso nel modo seguente:
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.
Impostazione
È possibile specificare un file con le impostazioni quando si usa il comando collect
. Il file di impostazioni può essere usato per escludere alcuni moduli o metodi dall'analisi del code coverage. Il formato corrisponde alla configurazione dell'agente di raccolta dati all'interno di un file runsettings. Per altre informazioni, vedere Personalizzare l'analisi code coverage. Ecco un esempio:
<?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>
Unire report di code coverage
È possibile unire a.coverage
e b.coverage
e archiviare i dati in merged.coverage
come indicato di seguito:
dotnet-coverage merge -o merged.coverage a.coverage b.coverage
Ad esempio, se si esegue un comando come dotnet test --collect "Code Coverage"
, il report di copertura viene archiviato in una cartella denominata GUID casuale. Tali cartelle sono difficili da trovare e unire. Usando questo strumento, è possibile unire tutti i report di code coverage per tutti i progetti usando criteri GLOB come indicato di seguito:
dotnet-coverage merge -o merged.cobertura.xml -f cobertura **\*.coverage
Il comando precedente unisce tutti i report di copertura dalla directory corrente e tutte le sottodirectory e archivia il risultato in un file cobertura. In Azure Pipelines è possibile usare l'attività Pubblica risultati code coverage per pubblicare un report di cobertura unito.
È possibile usare il comando merge
per convertire un report di code coverage in un altro formato. Ad esempio, il comando seguente converte un report di code coverage binario in formato XML.
dotnet-coverage merge -o output.xml -f xml input.coverage