Cobertura de testes unitários para Java com EclEmma

dezembro 8, 2016 11:00 am Publicado por Deixe um comentário

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 tudo continue funcionando como deveria, mesmo depois de fazer uma refatoração no código, incluir uma nova funcionalidade ou qualquer outra modificação.

Foi com este pensamento, que a técnica de desenvolvimento orientado a testes, o famoso TDD (Test Driven Development) – o desenvolvimento guiado a testes – ganhou força, ainda mais hoje que trabalhamos com metodologias ágeis, como o SCRUM, onde tudo tem um prazo muito curto e as coisas precisam ser desenvolvidas rapidamente.

Não estou aqui para falar tudo sobre TDD, mas unicamente sobre parte uma dele, 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á-los. Um teste unitário deve ser capaz de examinar o comportamento do 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 apresentá-los uma ferramenta muito bacana chamada EclEmma.

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 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 e está disponível no site oficial. Até o momento em que escrevo deste artigo, a última versão disponível é a 2.3.3.

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 executado a qualquer momento. Além disso, ela também dá suporte a diversos frameworks de testes, tais como:

  • JUNit
  • TestNG
  • SWTbot

Neste artigo, vou te mostrar como executar um teste de cobertura com o JUnit.

Instalando no Eclipse

Vou utilizar o Eclipse Mars 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:

  • 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 Eclipse e então vá ao menu Help > Install New Software

img1

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

img2

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 de uso

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:

public class Calculadora {

    public int dividir(int a, int b) {
        if (b == 0) {
            throw new RuntimeException("divisão por zero!");
        }

        return a / b;
    }

}

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

public class CalculadoraTest {

    private Calculadora calculadora = new Calculadora();

    @Test
    public void testeDivisao() {
        int dividendo = 3;
        int divisor = 1;
        assertTrue(this.calculadora.dividir(dividendo, divisor) > 0);
    }

    @Test(expected = RuntimeException.class)
    public void testeDivisaoPorZero() {
        int dividendo = 3;
        int divisor = 0;
        this.calculadora.dividir(dividendo, divisor);
    }

}

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

img3

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:

img4

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:

img5

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 com o botão direito no nome da classe e selecionando Coverage as… > JUnit Test. Pronto?

Agora vamos avaliar nossa aba Coverage de novo.

img6

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

Conclusão

O objetivo era mostrar, através de um exemplo realmente simples, como podemos utilizar a ferramenta de cobertura de testes EclEmma. Perceba que, com esta ferramenta, fica claro os casos que podem existir e que ainda não foram testadas. Neste exemplo obtivemos um percentual de 100%, mas em casos reais, isso é muito difícil 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.

Source: IMasters

Categorizados em:

Este artigo foi escrito pormajor

Deixe uma resposta

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