domingo, 12 de agosto de 2012

Colorindo seu código para garantir qualidade instantânea com EclEmma

O TDD nos ajuda a desenvolver código coeso e influencia no design do nosso código, o tornando melhor, além de obviamente garantir testes de nossas funcionalidades.

Podemos também utilizar ferramentas de métricas e cobertura de código para garantir a qualidade de nosso projeto. Como por exemplo o Cobertura, uma ferramenta que mede o percentual de linhas cobertas por testes em nosso código.

Durante a fase de testes e desenvolvimento podemos querer saber de forma prática oque nossos testes estão cobrindo e onde esquecemos de testar, especialmente quando estamos trabalhando com código legado. Seria excelente se ao rodarmos um teste, a IDE já nos fornecesse essa informação.

Felizmente existem plugins que conseguem fazer este trabalho. Dentre eles o eCobertura e o EclEmma.

Vou demonstrar o uso do EclEmma através de um exemplo trivial.

O primeiro passo é instalar o plugin no Eclipse, para isso vá ao Marketplace do Eclipse (Help > Marketplace...), busque por eclemma e clique em install. A partir daí é só realizar os passos de uma instalação de plugin normalmente.

Agora vamos escrever um simples código para entender o funcionamento.

Vamos escrever testes para a classe legada Calculadora, esta possui um método chamado calcula, que dado um valor e um boolean decide se soma mais 10 ao valor.

Se o valor for maior que 100 ou o boolean passado seja true, então soma-se 10 ao valor, caso contrário não faz nada.

public class Calculadora {

 public double calcula(double valor, boolean aplicaTaxas) {
  double valorCalculado = valor;
  
  if(valor > 100 || aplicaTaxas) {
   valorCalculado += 10;
  }
  
  return valorCalculado;
 }
 
}

Vamos escrever nosso primeiro teste:

 @Test
 public void naoDeveCalcularPoisValorEMenorQue100ENaoAplicaTaxas() {
  Calculadora calc = new Calculadora();
  
  double valorCalculado = calc.calcula(80, false);
  
  assertTrue(valorCalculado == 80);
 }

Para rodar o teste com o plugin clique com o direito sobre o arquivo de testes ou em seu código e vá a opção Coverage as... JUnit Test, pelo atalho Alt + Shift + E e T.

Navegue até a classe calculadora e veja como nosso código ficou colorido:



Repare que as linhas cobertas pelo teste ficaram verdes, com exceção da linha 7, que está amarela e da linha 8, que está vermelha.

Isso significa que a linha 7 não foi totalmente testada, ou seja, depois de rodar o teste, todas suas condições não foram realizadas (passe o mouse sobre o losango para ver a dica).

Vamos criar mais um teste para entrarmos na condicional. Agora passando o valor como 110 e aplicaTaxas como false:

 @Test
 public void deveCalcularPoisValorEMaiorQue100() {
  Calculadora calc = new Calculadora();
  
  double valorCalculado = calc.calcula(110, false);
  
  assertTrue(valorCalculado == 120);
 }

Vamos ao resultado:



Note que a linha 8, que antes era vermelha, agora está verde, conseguimos criar um teste que cobre este caso. Porém a linha 7 ainda está amarela (passando o mouse sobre o losango vemos que falta apenas uma condicional não coberta).

Vamos à um ultimo teste que simula o cenário ainda não coberto: Passar o parâmetro aplicaTaxas como true.

 @Test
 public void deveCalcularPoisAplicaTaxas() {
  Calculadora calc = new Calculadora();
  
  double valorCalculado = calc.calcula(20, true);
  
  assertTrue(valorCalculado == 30);
 }


Pronto, nossa lógica foi completamente testada.



Um excelente exercício que fiz foi desenvolver essa mesma classe usando TDD. Conforme você desenvolve o teste e codifica a implementação, já tem automaticamente 100% de cobertura. Porém se tivesse tomado essa abordagem não conseguiria mostrar como a ferramenta ajuda colorindo as linhas não testadas.