Solução de problemas de cobertura de código
Aplica-se a: Visual Studio
A ferramenta de análise da cobertura de código no Visual Studio coleta dados para assemblies nativos e gerenciados (arquivos .dll ou .exe). No entanto, em alguns casos, a janela Resultados da cobertura de código exibe um erro semelhante a "Resultados vazios gerados: ....". Este artigo ajuda você a solucionar problemas e resolver os vários motivos pelos quais você pode estar encontrando resultados vazios.
O que você deve ver?
Se você escolher um comando Analisar Cobertura de Código no menu Teste e se o build e os testes forem executados com êxito, você deverá ver uma lista de resultados na janela Cobertura de Código. Você talvez tenha que expandir os itens para ver os detalhes.
Para obter mais informações, confira Usar a cobertura de código para determinar quanto do código está sendo testado.
Possíveis motivos para não ver resultados ou ver resultados anteriores
Você não está usando a edição correta do Visual Studio
Você precisa do Visual Studio Enterprise.
Nenhum teste foi executado
Análise
Verifique a janela de saída. Na lista suspensa Mostrar Saída de, escolha Testes. Verifique se existe algum aviso ou erro registrado em log.
Explicação
A análise de cobertura de código é feita durante a execução de testes. Ela inclui apenas assemblies carregados na memória durante a execução dos testes. Se nenhum dos testes for executado, não haverá nada para a cobertura de código a ser reportado.
Resolução
No Gerenciador de Testes, selecione Executar Tudo para verificar se os testes foram executados com êxito. Corrija todas as falhas antes de usar Analisar Cobertura de Código.
Você está olhando um resultado anterior
Quando você modificar e reexecutar os testes, um resultado anterior da cobertura de código poderá permanecer visível, inclusive a coloração de código com base nessa execução anterior. Siga estas etapas para resolver o problema:
- Executar Analisar Cobertura de Código.
- Não se esqueça de selecionar o conjunto de resultados mais recente na janela Resultados da Cobertura de Código.
Os arquivos .pdb (símbolo) não estão disponíveis
Análise
Abra a pasta de destino de compilação (normalmente bin\debug) e verifique se, para cada assembly, há um arquivo .pdb no mesmo diretório que o arquivo .dll ou .exe .
Explicação
O mecanismo de cobertura de código requer que cada assembly tenha seu arquivo .pdb associado acessível durante a execução do teste. Se não houver nenhum arquivo .pdb para um assembly específico, o assembly não será analisado.
O arquivo .pdb precisa ser gerado do mesmo build dos arquivos .dll ou .exe.
Resolução
Verifique se as configurações de build geram o arquivo .pdb .
Se os arquivos .pdb não forem atualizados quando o projeto for criado, abra as propriedades do projeto, selecione a página Compilar , escolha Avançado e inspecione Informações de Depuração.
No Visual Studio 2022 e versões posteriores, para projetos C# direcionados ao .NET Core ou .NET 5+, abra as propriedades do projeto, selecione a guia Compilar , escolha Geral e inspecione os símbolos de depuração.
Para projetos C++, verifique se os arquivos .pdb gerados têm informações completas de depuração. Abra as propriedades do projeto e verifique se Vinculador>Depuração>Gerar Informações de Depuração está definida como Gerar Informações de Depuração otimizada para compartilhamento e publicação (/DEBUG:FULL).
Se os arquivos .pdb e .dll ou .exe estiverem em locais diferentes, copie o arquivo .pdb para o mesmo diretório. Também é possível configurar o mecanismo de cobertura de código para pesquisar arquivos .pdb em outro local. Para obter mais informações, confira Personalizar a análise de cobertura de código.
Um binário instrumentado ou otimizado é usado
Análise
Determine se o binário passou por alguma forma de otimização avançada, como Otimização Guiada por Perfil, ou foi instrumentado por uma ferramenta de criação de perfil, como vsinstr.exe ou vsperfmon.exe.
Explicação
Se um assembly já tiver sido instrumentado ou otimizado por outra ferramenta de criação de perfil, o assembly será omitido da análise de cobertura de código. A análise de cobertura de código não pode ser realizada nesses assemblies.
Resolução
Desative a otimização e use uma nova compilação.
O código não é gerenciado (.NET) ou nativo (C++)
Análise
Determine se você está executando alguns testes em código gerenciado ou C++.
Explicação
A análise de cobertura de código no Visual Studio está disponível apenas no código gerenciado e nativo (C++). Se você estiver trabalhando com ferramentas de terceiros, um ou todo o código poderá ser executado em uma plataforma diferente.
Resolução
Não disponível.
O nome do projeto inclui 'DataCollector'
Projetos que usam DataCollector no nome do projeto não serão identificados pela cobertura de código.
O assembly foi instalado por NGen
Análise
Determine se o assembly é carregado do cache de imagem nativa.
Explicação
Por motivos de desempenho, os assemblies de imagem nativa não são analisados. Para obter mais informações, consulte Ngen.exe (Gerador de Imagens Nativas).
Resolução
Use uma versão MSIL do assembly. Não o processe com NGen.
O arquivo .runsettings personalizado tem problemas de sintaxe
Análise
Se você estiver usando um arquivo .runsettings personalizado, ele poderá conter um erro de sintaxe. A cobertura de código não é executada e a janela de cobertura de código não é aberta no final da execução do teste ou mostra resultados antigos.
Explicação
Você pode executar seus testes de unidade com um arquivo .runsettings personalizado para configurar opções de cobertura de código. As opções permitem incluir ou excluir arquivos. Para obter mais informações, confira Personalizar a análise de cobertura de código.
Resolução
Existem dois tipos possíveis de falhas:
Erro de XML
Abra o arquivo .runsettings no editor XML do Visual Studio. Procure indicações de erro.
Erro na expressão regular
Cada cadeia de caracteres no arquivo é uma expressão regular. Examine cada um em busca de erros e, em especial, procure:
- Parênteses incompatíveis (...) ou parênteses sem escape \… (\). Se quiser corresponder um parêntese na cadeia de pesquisa, você deverá usar o escape. Por exemplo, para realizar a correspondência de uma função, use:
.*MyFunction\(double\)
- Asterisco ou sinal de adição no início de uma expressão. Para comparar qualquer cadeia de caracteres, use um ponto seguido de um asterisco:
.*
- Parênteses incompatíveis (...) ou parênteses sem escape \… (\). Se quiser corresponder um parêntese na cadeia de pesquisa, você deverá usar o escape. Por exemplo, para realizar a correspondência de uma função, use:
Arquivo .runsettings personalizado com exclusões incorretas
Análise
Se você estiver usando um arquivo .runsettings personalizado, verifique se ele inclui seu assembly.
Explicação
Você pode executar seus testes de unidade com um arquivo .runsettings personalizado para configurar opções de cobertura de código. As opções permitem incluir ou excluir arquivos. Para obter mais informações, confira Personalizar a análise de cobertura de código.
Resolução
Remova todos os Include
nós do arquivo .runsettings e, em seguida, remova todos os Exclude
nós. Se isso corrigir o problema, recoloque-os em estágios.
Verifique se o nó DataCollectors especifica a Cobertura de Código. Compare-o com a amostra contida em Personalizar a análise de cobertura de código.
Um código é sempre mostrado como não coberto
O código de inicialização em DLLs nativas é executado antes da instrumentação
Análise
No código nativo vinculado estaticamente, a função de inicialização DllMain e o código que ele chama às vezes são mostrados como não cobertos, mesmo que o código tenha sido executado.
Explicação
A ferramenta de cobertura de código funciona inserindo-se a instrumentação em um assembly pouco antes do início da execução do aplicativo. Em qualquer assembly carregado anteriormente, o código de inicialização em DllMain é executado assim que o assembly é carregado e antes da execução do aplicativo. Esse código aparentemente não foi abordado, o que, em geral, se aplica aos assemblies carregados estaticamente.
Resolução
Nenhum.