Cobertura de testes com o EclEmma

AGRADEÇA AO AUTOR COMPARTILHE!

Introdução

Todo bom desenvolvedor tem consciência de que os testes unitários são uma grande arma para evitar a introdução de novos bugs na aplicação e garantir que, mesmo depois de fazer uma refatoração no código, incluir uma nova feature, ou qualquer outra atividade semelhante, tudo deve continuar funcionando como deveria.

É com este pensamento que a técnica de desenvolvimento orientado a testes, o famoso TDD (Test Driven Development), tem ganhado força – apesar de existirem críticos que se oponham a técnica dizendo que a mesma está ultrapassada. Eu não sou um deles, muito pelo contrário, defendo abertamente o uso do TDD, ainda mais hoje que trabalhamos adotando metologias ágeis, como o SCRUM e XP, onde tudo tem um prazo – e este prazo costuma ser bem curto.

Mas, apesar de toda esta discussão (que pode durar bastante), não estou aqui para falar sobre TDD, mas unicamente sobre os testes unitários. Este tipo de teste é a menor unidade de teste que teremos no nosso sistema e está a cargo do desenvolvedor criá-lo. Um teste unitário deve ser capaz de examinar o comportamento do seu código em várias condições diferentes, garantindo a sua funcionalidade. Entretanto, muitas vezes fica difícil saber se nossos testes unitários estão testando realmente todos os cenários possíveis para a funcionalidade que estamos implementando.

“Testei todos os casos que eu lembrei… mas será que são todos os casos possíveis?” – Acredito que você já tenha tido um pensamento deste tipo, e este artigo está aqui para ajudá-lo.

Hoje vou apresentar-lhes uma ferramenta chamada EclEmma. Esta ferramenta é um plugin do Eclipse que verifica o quanto os seus testes cobrem do seu código.

EclEmma

O EclEmma é uma ferramenta de cobertura de código para Java. De forma resumida, ele te mostra qual a porcentagem do seu código seus testes estão cobrindo. Com esta ferramenta fica muito claro descobrir que aquele cenário X que pensamos na hora de codificar (o famoso if no meio do caminho), não está sendo coberto em nenhum dos seus testes unitários.

Interessante, não? O EclEmma é um plugin gratuito, disponível para o Eclipse sob a licença Eclipse Public License. A ferramenta foi inspirada na biblioteca EMMA desenvolvida por Vlad Roubtsov. A partir da versão 2.0, foi baseada na biblioteca JaCoCo de “cobertura de código”. O JaCoCo está disponível para qualquer desenvolvedor que tenha interesse em criar sua própria ferramenta no site oficial do EclEmma (http://www.eclemma.org/jacoco/). Até o momento deste artigo, a última versão disponível é a 0.7.1.

Dentre as principais características que posso citar da ferramenta, a principal delas é que o EclEmma funciona de forma independente do seu projeto e pode ser executada a qualquer momento. Além disso, ela também dá suporte a diversos frameworks de testes:

  • JUnit Test
  • TestNG Test
  • SWTbot Test
  • Etc..

Para simplificar as coisas, vamos somente trabalhar com os testes JUnit.

Instalando no Eclipse

Estarei utilizando o Eclipse Kepler para fazer as demonstrações, mas já utilizei o EclEmma em versões mais antigas como o Juno, Índigo e Helios sem problemas. A instalação não tem nenhum segredo. É possível instalar a ferramenta de três maneiras diferentes:

  • Instalação pelo Eclipse Marketplace Client
  • Instalação pelo site de update
  • Instalação e download manuais

O site oficial mostra com detalhes cada uma das maneiras, vamos adotar a segunda.

1. Inicie o seu Eclipe e então vá ao menu Help > Install New Software…

figura1

2. No campo Work With digite http://update.eclemma.org/ e clique em Add…

figura2

3. Selecione a última versão do EclEmma e clique em Next.

4. Siga os próximos passos aceitando os termos de uso e reinicie o Eclipse.

Exemplo

Agora vou utilizar um exemplo bem simples para mostrar como a ferramenta funciona. Primeiramente, vamos criar uma classe chamada Calculadora com o seguinte código:

codigo1

Agora vamos criar uma segunda classe chamada CalculadoraTest para testar o método da classe acima:

codigo2

Com as duas classes criadas, vá até a classe CalculadoraTest e clique com o botão direito em cima do primeiro teste. Perceba que agora você possui a opção Coverage as… . Selecione a opção JUnit Test e espere o resultado.

figura3

Seu código ficou colorido, não ficou? Vamos entender o que significa cada uma das cores:

Verde: Código Executado
Amarelo: Ponto de decisão
Vermelho: Código não executado

Agora também preste atenção na aba Coverage:

figura4

Podemos notar que somente 64,3% da nossa classe Calculadora foi testada com este teste. Se olharmos a classe Calculadora, veremos que há um trecho em vermelho:

figura5

O que aconteceu foi que somente o primeiro teste não foi capaz de testar o caso onde o dividendo tem o valor zero. Para isso, temos o segundo teste. Agora, execute os dois testes juntos, clicando em Coverage as… > JUnit Test (sem selecionar nenhum dos testes). Pronto? Agora vamos avaliar nossa aba Coverage de novo.

figura6

Olha só que maravilha, 100% dos casos da classe foram testados!

Conclusão

O objetivo deste artigo era mostrar, através de um exemplo realmente simples, como utilizar a ferramenta de cobertura de testes EclEmma. Perceba que, com esta ferramenta, como ficam claros os casos que podem existir e que ainda não foram testados. Neste exemplo obtivemos um percentual de 100% mas, em casos reais, isso é muito difícil de se alcançar. O nível recomendado é de pelo menos 80% de cobertura. Com o uso da técnica TDD, fica ainda mais fácil alcançar estes valores.

AGRADEÇA AO AUTOR COMPARTILHE!

Diego Martins de Pinho

Mais artigos deste autor »

Bacharel em Ciência da Computação pela PUC SP e MBA em Gestão da Tecnologia da Informação pela FIAP. Me interesso muito não somente por tecnologia, mas também por inovação e empreendedorismo. Trabalho com programação desde 2013 e sou autor do livro ECMAScript 6 - Entre de cabeça no futuro do JavaScript.


3 Comentários

Deixe seu comentário

Seu endereço de e-mail não será publicado. Campos com * são obrigatórios!

Você pode usar estas tags e atributos de HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code class="" title="" data-url=""> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre class="" title="" data-url=""> <span class="" title="" data-url="">