Utilitário de cobertura do código de cobertura dotnet
Este artigo aplica-se a: ✔️ SDK do .NET Core 3.1 e versões posteriores
Sinopse
dotnet-coverage [-h, --help] [--version] <command>
Description
A dotnet-coverage
ferramenta:
- Permite a coleta entre plataformas de dados de cobertura de código de um processo em execução.
- Fornece mesclagem entre plataformas de relatórios de cobertura de código.
Opções
-h|--help
Mostra a ajuda da linha de comando.
--version
Exibe a versão do utilitário dotnet-coverage.
Instalar
Para instalar a versão mais recente do dotnet-coverage
pacote NuGet, use o comando dotnet tool install :
dotnet tool install --global dotnet-coverage
Comandos
Comando |
---|
mesclagem de cobertura dotnet |
coleta de cobertura dotnet |
conexão de cobertura dotnet |
instantâneo de cobertura dotnet |
desligamento de cobertura dotnet |
Instrumento de cobertura dotnet |
mesclagem de cobertura dotnet
O merge
comando é usado para mesclar vários relatórios de cobertura de código em um. Este comando está disponível em todas as plataformas. Este comando suporta os seguintes formatos de relatório de cobertura de código:
coverage
cobertura
xml
Sinopse
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>
Argumentos
<files>
Os relatórios de cobertura do código de entrada.
Opções
--remove-input-files
Remove todos os relatórios de cobertura de entrada que foram mesclados.
-r, --recursive
SDK do .NET 7 e versões anteriores somente Pesquise relatórios de cobertura em subdiretórios.
-o|--output <output>
Define o arquivo de saída do relatório de cobertura de código.
-f|--output-format <output-format>
O formato do arquivo de saída. Valores suportados:
coverage
,xml
ecobertura
. O padrão écoverage
(formato binário que pode ser aberto no Visual Studio).-l|--log-file <log-file>
Define o caminho do arquivo de log. Quando você fornece um diretório (com um separador de caminho no final), um novo arquivo de log é gerado para cada processo em análise.
-ll|--log-level <log-level>
Define o nível de log. Valores suportados:
Error
,Info
eVerbose
.
coleta de cobertura dotnet
O collect
comando é usado para coletar dados de cobertura de código para qualquer processo .NET e seus subprocessos. Por exemplo, você pode coletar dados de cobertura de código para um aplicativo de console ou um aplicativo Blazor. Este comando suporta instrumentação dinâmica e estática. A instrumentação estática está disponível em todas as plataformas. Você pode especificar arquivos a serem instrumentados estaticamente usando include-files
a opção. A instrumentação dinâmica está disponível no Windows (x86, x64 e Arm64), Linux (x64) e macOS (x64). O comando suporta apenas módulos .NET. Não há suporte para módulos nativos.
Sinopse
O collect
comando pode ser executado em dois modos.
Modo de comando
O collect
comando coletará cobertura de código para o processo dado executado pelo command
argumento.
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>
Modo de servidor
O collect
comando hospeda um servidor para coleta de cobertura de código. Os clientes podem se conectar ao servidor via connect
comando.
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]
Argumentos
<command>
O comando para o qual coletar dados de cobertura de código.
<args>
Os argumentos de linha de comando para o comando.
Opções
-s|--settings <settings>
Define o caminho para as configurações de cobertura de código XML.
-id|--session-id <session-id>
Especifica o ID da sessão de cobertura de código. Se não for fornecida, a ferramenta gerará um GUID aleatório.
-sv|--server-mode
Inicia o coletor no modo de servidor. Os clientes podem se conectar ao servidor com o
connect
comando.-b|--background
Inicia o servidor de coleta de cobertura de código em um novo processo em segundo plano. Os clientes podem se conectar ao servidor com o
connect
comando.-t|--timeout
Tempo limite (em milissegundos) para comunicação entre processos entre clientes e o servidor.
-if|--include-files <include-files>
Especifica a lista de arquivos a serem instrumentados estaticamente.
-o|--output <output>
Define o arquivo de saída do relatório de cobertura de código.
-f|--output-format <output-format>
O formato do arquivo de saída. Valores suportados:
coverage
,xml
ecobertura
. O padrão écoverage
(formato binário que pode ser aberto no Visual Studio).-l|--log-file <log-file>
Define o caminho do arquivo de log. Quando você fornece um diretório (com um separador de caminho no final), um novo arquivo de log é gerado para cada processo em análise.
-ll|--log-level <log-level>
Define o nível de log. Valores suportados:
Error
,Info
eVerbose
.
conexão de cobertura dotnet
O connect
comando é usado para se conectar com o servidor existente e coleta dados de cobertura de código para qualquer processo .NET e seus subprocessos. Por exemplo, você pode coletar dados de cobertura de código para um aplicativo de console ou um aplicativo Blazor. O comando suporta apenas módulos .NET. Não há suporte para módulos nativos.
Nota
O comando usará instrumentação dinâmica para todos os subprocessos disponíveis no Windows (x86, x64 e Arm64), Linux (x64) e macOS (x64). Se você precisar instrumentar estaticamente qualquer módulo .NET, use instrument
o comando (com a opção de ID de sessão correspondente) antes de executar o connect
comando.
Sinopse
dotnet-coverage connect
[-b|--background] [-t|--timeout]
[-l|--log-file <log-file>] [-ll|--log-level <log-level>] [-?|-h|--help]
<session>
<command> <args>
Argumentos
<session>
O ID de sessão do servidor hospedado pelo
collect
comando.<command>
O comando para o qual coletar dados de cobertura de código.
<args>
Os argumentos de linha de comando para o comando.
Opções
-b|--background
Inicia o cliente em um novo processo em segundo plano.
-t|--timeout
Tempo limite (em milissegundos) para comunicação entre processos entre o cliente e o servidor.*
-l|--log-file <log-file>
-l|--log-file <log-file>
Define o caminho do arquivo de log. Quando você fornece um diretório (com um separador de caminho no final), um novo arquivo de log é gerado para cada processo em análise.
-ll|--log-level <log-level>
Define o nível de log. Valores suportados:
Error
,Info
eVerbose
.
instantâneo de cobertura dotnet
Cria um arquivo de cobertura para a coleção de cobertura de código existente.
Sinopse
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>
Argumentos
<session>
O ID de sessão da coleção para a qual um arquivo de cobertura deve ser gerado.
Opções
-r|--reset <reset>
Limpa as informações de cobertura existentes após a criação de um arquivo de cobertura.
-o|--output <output>
Define o arquivo de saída do relatório de cobertura de código. Se não for fornecido, é gerado automaticamente com um carimbo de data/hora.
-tn|--tag-name <tag-name>
Cria um nome de marca de instantâneo no arquivo de cobertura com informações de cobertura atuais. Tag-name e tag-identifier são mutuamente inclusivos.
-tid|--tag-identifier <tag-identifier>
Cria um identificador de marca de instantâneo no arquivo de cobertura com informações de cobertura atuais. Tag-name e tag-identifier são mutuamente inclusivos.
-t|--timeout
Tempo limite (em milissegundos) para comunicação entre processos entre o cliente e o servidor.
-l|--log-file <log-file>
Define o caminho do arquivo de log. Quando você fornece um diretório (com um separador de caminho no final), um novo arquivo de log é gerado para cada processo em análise.
-ll|--log-level <log-level>
Define o nível de log. Valores suportados:
Error
,Info
eVerbose
.
desligamento de cobertura dotnet
Fecha a coleção de cobertura de código existente.
Sinopse
dotnet-coverage shutdown
[-t|--timeout]
[-l|--log-file <log-file>] [-ll|--log-level <log-level>] [-?|-h|--help]
<session>
Argumentos
<session>
O ID da sessão da coleção a ser fechada.
Opções
-t|--timeout
Tempo limite (em milissegundos) para comunicação entre processos com o servidor.
-l|--log-file <log-file>
Define o caminho do arquivo de log. Quando você fornece um diretório (com um separador de caminho no final), um novo arquivo de log é gerado para cada processo em análise.
-ll|--log-level <log-level>
Define o nível de log. Valores suportados:
Error
,Info
eVerbose
.
Instrumento de cobertura dotnet
O comando instrument é usado para instrumentar binários no disco.
Sinopse
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>
Argumentos
<input-file>
O binário de entrada.
Opções
-s|--settings <settings>
Define o caminho para as configurações de cobertura de código XML.
-id|--session-id <session-id>
Especifica o ID da sessão de cobertura de código. Se não for fornecida, a ferramenta gerará um GUID aleatório.
-o|--output <output>
Define o caminho para binário do arquivo de saída. Se não for fornecida, a instrumentação será executada no local.
-l|--log-file <log-file>
Define o caminho do arquivo de log. Quando você fornece um diretório (com um separador de caminho no final), um novo arquivo de log é gerado para cada processo em análise.
-ll|--log-level <log-level>
Define o nível de log. Valores suportados:
Error
,Info
eVerbose
.
Cenários de exemplo
Coleta de cobertura de código
Colete dados de cobertura de código para qualquer aplicativo .NET (como console ou Blazor) usando o seguinte comando:
dotnet-coverage collect dotnet run
No caso de um aplicativo que requer um sinal para terminar, você pode usar Ctrl+C, que ainda permitirá que você colete dados de cobertura de código. Para o argumento, você pode fornecer qualquer comando que eventualmente iniciará um aplicativo .NET. Por exemplo, pode ser um script do PowerShell.
Sessões
Quando você está executando a análise de cobertura de código em um servidor .NET que apenas aguarda mensagens e envia respostas, você precisa de uma maneira de parar o servidor para obter os resultados finais da cobertura de código. Você pode usar Ctrl+C localmente, mas não no Azure Pipelines. Para esses cenários, você pode usar sessões. Você pode especificar uma ID de sessão ao iniciar a coleta e, em seguida, usar o comando para interromper a shutdown
coleta e o servidor.
Por exemplo, suponha que você tenha um servidor no diretório D:\serverexample\server e um projeto de teste no diretório D:\serverexample\tests . Os testes estão se comunicando com o servidor através da rede. Você pode iniciar a coleta de cobertura de código para o servidor da seguinte maneira:
D:\serverexample\server> dotnet-coverage collect --session-id serverdemo "dotnet run"
O ID da sessão foi especificado como serverdemo
. Em seguida, você pode executar testes da seguinte maneira:
D:\serverexample\tests> dotnet test
Um arquivo de cobertura de código para sessão serverdemo
pode ser gerado com cobertura atual da seguinte maneira:
dotnet-coverage snapshot --output after_first_test.coverage serverdemo
Além disso, uma tag de instantâneo pode ser adicionada ao arquivo de cobertura usando as opções de tag da seguinte maneira:
dotnet-coverage snapshot --tag-name after_first_test --tag-identifier after_first_test serverdemo
Finalmente, a sessão serverdemo
e o servidor podem ser fechados da seguinte forma:
dotnet-coverage shutdown serverdemo
Segue-se um exemplo de saída completa no lado do servidor:
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>
Modo de servidor e cliente
A coleta de cobertura de código também pode ser feita no modo servidor-cliente. Nesse cenário, um servidor de coleta de cobertura de código é iniciado e vários clientes podem se conectar com o servidor. A cobertura do código é coletada para todos os clientes coletivamente.
Inicie o servidor de cobertura de código usando o seguinte comando:
dotnet-coverage collect --session-id serverdemo --server-mode
Neste exemplo, o ID da sessão foi especificado como serverdemo
para o servidor. Um cliente pode se conectar ao servidor usando essa ID de sessão usando o seguinte comando:
dotnet-coverage connect serverdemo dotnet run
Finalmente, você pode fechar a sessão serverdemo
e o servidor usando o seguinte comando:
dotnet-coverage shutdown serverdemo
O processo do servidor cria um relatório de cobertura de código coletivo para todos os clientes e saídas.
Segue-se um exemplo de saída completa no lado do servidor:
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>
Segue-se um exemplo de saída completa no lado do cliente:
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>
Você também pode iniciar o servidor e o cliente no modo de segundo plano. Outro processo começa em segundo plano e retorna o controle de volta para o usuário.
A seguir está um exemplo de saída completa no modo de cliente do servidor em segundo plano:
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>
Cobertura de código estático para assemblies gerenciados
A ferramenta dotnet-coverage pode ser usada para coletar cobertura de código para assemblies gerenciados usando instrumentação estática. Há três métodos diferentes disponíveis que você pode usar. Para demonstrar, vamos supor que temos um aplicativo de console C# simples:
D:\examples\ConsoleApp> dotnet run
Hello, World!
Use o comando collect com a opção ou configuração include files
Se você não quiser usar o comando, os arquivos a serem instrumentados podem ser especificados usando --include-files
a instrument
opção da seguinte maneira:
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.
Você também pode especificar arquivos a serem instrumentados usando a configuração da seguinte maneira:
<ModulePaths>
<IncludeDirectories>
<Directory>D:\examples\ConsoleApp\bin\Debug\net7.0</Directory>
</IncludeDirectories>
</ModulePaths>
Usando instrumentos e comandos de coleta
Neste caso, o primeiro binário precisa ser instrumentado da seguinte forma:
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.
Em seguida, você pode coletar a cobertura do código da seguinte maneira:
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.
Use o instrumento e colete comandos no modo de servidor
Nesse caso, você pode separar completamente a coleta de cobertura da execução do aplicativo. Primeiro, instrumente seu binário da seguinte maneira:
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
A ID de sessão precisa ser usada neste cenário para garantir que o aplicativo possa se conectar e fornecer dados ao coletor externo.
Na segunda etapa, você precisa iniciar o coletor de cobertura da seguinte maneira:
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
Em seguida, o aplicativo pode ser iniciado da seguinte forma:
D:\examples\ConsoleApp> .\bin\Debug\net7.0\ConsoleApp.exe
Hello, World!
Finalmente, o coletor pode ser fechado da seguinte forma:
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.
Definições
Você pode especificar um arquivo com configurações ao usar o collect
comando. O arquivo de configurações pode ser usado para excluir alguns módulos ou métodos da análise de cobertura de código. O formato é o mesmo que a configuração do coletor de dados dentro de um arquivo runsettings . Para obter mais informações, consulte Personalizar análise de cobertura de código. Eis um exemplo:
<?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>
Mesclar relatórios de cobertura de código
Você pode mesclar a.coverage
e b.coverage
armazenar os dados da merged.coverage
seguinte maneira:
dotnet-coverage merge -o merged.coverage a.coverage b.coverage
Por exemplo, se você executar um comando como dotnet test --collect "Code Coverage"
, o relatório de cobertura será armazenado em uma pasta chamada GUID aleatório. Essas pastas são difíceis de encontrar e mesclar. Usando essa ferramenta, você pode mesclar todos os relatórios de cobertura de código para todos os seus projetos usando padrões de globbing da seguinte maneira:
dotnet-coverage merge -o merged.cobertura.xml -f cobertura **\*.coverage
O comando anterior mescla todos os relatórios de cobertura do diretório atual e todos os subdiretórios e armazena o resultado em um arquivo de cobertura. No Azure Pipelines, você pode usar a tarefa Publicar Resultados de Cobertura de Código para publicar um relatório de cobertura mesclado.
Você pode usar o merge
comando para converter um relatório de cobertura de código para outro formato. Por exemplo, o comando a seguir converte um relatório de cobertura de código binário em formato XML.
dotnet-coverage merge -o output.xml -f xml input.coverage