Analisando a cobertura de testes em aplicações .NET com o OpenCover

Quem trabalha com .NET geralmente utiliza o Visual Studio e, hoje, uma das deficiências de algumas versões desta ferramenta é a funcionalidade de avaliar a cobertura dos testes. Recurso este que encontra-se disponível apenas na versão Enterprise, e ele acaba não sendo utilizado na hora da implementação dos testes unitários.

Dependendo do tamanho da aplicação, não ter uma boa ferramenta de cobertura de teste pode dificultar e muito a análise das partes que ainda precisam ser testadas.

Para facilitar este processo para quem não possui a versão Enterprise do Visual Studio, temos a opção de utilizar o OpenCover, que é uma ferramenta open-source.

OpenCover

Como dito acima, o OpenCover é uma ferramenta open-source, que gera a cobertura de testes em projetos .NET. Infelizmente no momento ele só funciona no Windows, e não suporta projetos .NET Core.

Mesmo sendo uma ferramenta de linha de comando, ela pode ser baixada pelo NutGet ou como um arquivo MSI ou zip na página do projeto Github.

Para testá-la, criei um projeto simples, que possui apenas classe:

public class Exemplo
{
    public static void Metodo()
    {
        try
        {
            Console.WriteLine("Ok!");
        }
        catch (Exception ex)
        {
            Console.WriteLine(ex.Message);
        }
    }
}

E um projeto de teste também com apenas uma classe:

using NUnit.Framework;

[TestFixture]
public class ExemploTest
{
    [Test]
    public void MetodoTest()
    {
        Exemplo.Metodo();
    }
}

Executando os testes com o OpenCover

O OpenCover não executa diretamente os testes, na verdade, ele precisa de outra aplicação que executa o teste, que no nosso caso será o NUnit.

Como o OpenCover irá executar o NUnit pelo console, também adcione na aplicação o NUnit Console.

Com isso, poderemos executar o comando abaixo:

C:ProjetosTreinawebTreinaweb.CalculadorapackagesOpenCover.4.6.519toolsOpenCover.Console.exe -target:"C:ProjetosTreinawebTreinaweb.CalculadorapackagesNUnit.ConsoleRunner.3.7.0toolsnunit3-console.exe" -targetargs:"C:ProjetosTreinawebTreinaweb.CalculadoraTreinaweb.Calculadora.TestsbinDebugTreinaweb.Calculadora.Tests.dll" -output:"C:ProjetosTestResultscoverage.xml" -register:user

Os argumentos utilizados acima são:

  • target: – Indica o processo que OpenCover irá executar.
  • targetargs: – Informa argumentos para o processo que o OpenCover irá executar. No caso, é passado a dll do projeto que contém os testes;
  • output: – O local onde o arquivo xml gerado será salvo;
  • register:user – Utilizado para registrar objetos COM que o OpenCover utiliza. A opções user deve ser utilizada por usuários sem privilégios administrativos.

Você pode ver outros comandos, na documentação do OpenCover aqui.

Ao executar o código acima, o OpenCover irá gerar um arquivo XML como resultado. Para visualizar este resultado em um ambiente mais amigável, pode ser utilizado o ReportGenerator.

ReportGenerator

Assim como o OpenCover, o ReportGenerator também é uma ferramenta de linha de comando open source, que pode ser baixada pelo NuGet. Ao baixá-la, pode ser executado o comando abaixo para gerar o relatório:

C:ProjetosTreinawebTreinaweb.CalculadorapackagesReportGenerator.3.0.2toolsReportGenerator.exe -reports:"C:ProjetosTestResultscoverage.xml" -targetdir:"C:ProjetosTestResultsReport"

Neste relatório podemos visualizar quais trechos de código não são cobertos:

Relatório do Report Generator

Conclusão

Agora o projeto tem code coverage e histórico, tudo com ferramentas open source. Com isso, é possível enxergar os pontos mais críticos que precisam de testes, entender a complexidade do código escrito com as métricas disponíveis e acompanhar a evolução do projeto.

Essas ferramentas facilitam muito a vida de quem desenvolve software, e é ótimo ver que a comunidade .NET está criando ferramentas open-source para resolver esses problemas.

Utilizar o Cake facilita ainda mais o uso e a integração delas, pra que você não precise perder muito tempo com isso e possa focar no que importa.

Deixe seu comentário

Instrutor, nerd, cinéfilo e desenvolvedor nas horas vagas. Graduado em Ciências da Computação pela Universidade Metodista de São Paulo.

JUNTE-SE A MAIS DE 150.000 PROGRAMADORES