Técnico

Testes Unitários – Mão na massa!

software-engineer-concept-people-front-many-computer-38321157

Os exemplo estão escritos em Java e estão disponíveis no Github através deste link, entretanto linguagem é só o meio e não o resultado final, foquem sempre no conceito apresentado e não como é implementado.

Nesse capítulo vamos abordar várias vertentes dos testes unitários, começando pelos conceitos básicos e avançando para pequenas implementações baseadas em cenários o mais próximo da realidade, com fim de tornar mais didático os exemplos. Vamos responder perguntas como;

O que é uma unidade?

Como se cria um teste?

Como garantir que um refactoring foi feito com sucesso?

O que é uma unidade

Para a física o átomo é conhecido por ser a unidade básica da matéria, olhando para a orientação a objetos também podemos identificar unidades básicas em um objeto, rapidamente conseguimos reconhecer alguns pontos chave, no caso dos atributos os quais são responsáveis por dar características a uma classe e por sua vez métodos que nos dão comportamentos.

Quando precisamos escrever testes de unitários precisamos identificar exatamente o quê é uma unidade a ser testada e também ter em mente que os testes buscam validar comportamento por meio de afirmações (asserções), um dos meios de se encontrar a unidade básica é por meio do encapsulamento, um dos três princípios da orientação a objeto, os atributos são expostos através de métodos, assim excluindo na maioria dos casos os atributos.

CTA-ebook-transformação-digital

Mão na massa

Cenário: Um site de filmes que precisa gerar a média da nota dos filmes baseado na critica dos usuários.

Criar um teste consiste em basicamente três etapas:

1  – Escrever o nome do teste

Descrever o comportamento esperado.

Screen Shot 2015-09-23 at 12.07.36 AM

2 – Escrever uma asserção

Nada mais nada menos que uma afirmação do que esperamos que aconteça.

Screen Shot 2015-09-23 at 12.05.36 AM

3 – Criar o cenário de teste

Screen Shot 2015-09-23 at 12.29.39 AM

Teste na integra

Screen Shot 2015-09-23 at 12.22.20 AM

OBS: Um dos elementos mais importantes, é sempre começar escrevendo testes e não o código de implementação, o teste deve influenciar na implementação e não ao contrário, essa pequena sutileza permite criar um código mais focado no objetivo, por consequência quando temos código focado no objetivo, os métodos se tornam menores e com menos responsabilidades, o quê diminui o acoplamento, basicamente esse modelo de pensamento gera diversos beneficios positivos.

Ao executar esse teste obtemos o seguinte resultado

Screen Shot 2015-09-28 at 10.19.11 PM

Basicamente ao executarmos o teste unitário o método Assert recebeu em ordem, valor esperado, valor resultante do average (média), e um valor delta (máxima variação para que os dois números sejam considerados iguais). O teste falhou pelo fato da implementação da classe Movie retornar sempre 0 como na imagem.

Screen Shot 2015-09-28 at 10.32.04 PM

Agora vamos implementar uma simples rotina de média e executaremos o teste novamente.

Screen Shot 2015-09-28 at 10.34.36 PM

Screen Shot 2015-09-28 at 10.35.31 PM

Conseguimos executar o teste com êxito, mas vamos pensar que na lógica de uma média, é impossível que a média seja negativa, pelo fato de não existir coleções de valor negativo, porém existe o caso da lista de reviews estar vazia, qual seria o resultado? Obviamente 0/0 é um grande absurdo matemático, então precisamos testar essa condição, quando um evento de divisão 0/0 acontece o Java nos retorna um valor NaN (Not a Number) e portanto precisamos testar esse retorno.

Vamos aplicar mais uma vez a forma de se escrever testes, primeiramente escrevemos o comportamento do teste na forma de nome do método, depois a asserção de que tal objeto tenha determinado comportamento, e por fim o corpo do teste.

Screen Shot 2015-09-28 at 10.56.12 PM

E se por acaso quisermos mudar a implementação do método usando todo o potencial do Java8, qual seria o impacto? Qual garantia que temos de que o código que fizemos é seguro?

Vamos pensar que nosso cliente precisa mudar a implementação da API de forma a modenizar o código que foi feito com java 7 para java 8, e que não podemos mudar o retorno das APIs para não comprometer outros projetos, garantindo assim a “assinatura” da API.

Bom, simplesmente fizemos dois testes que cobrem os principais casos básicos, portanto, qualquer mudança na implementação deverá atender a esses dois resultados esperados, vamos refatorar o código usando a nova API de Collection do Java8.

Screen Shot 2015-09-28 at 11.14.21 PM

O segundo teste falhou, pela maneira como a API de Collection do Java8 trata de forma diferente quando uma coleção é vazia, como nosso cliente pediu para garantir que o resultado seja exatamente igual, ajustamos a nova implementação para responder ao padrão antigo. Rodamos o teste de novo para garantir que nada deu errado.

Screen Shot 2015-09-28 at 11.20.20 PM

 

E é isso ai! Primeiro teste unitário e refactoring feito com sucesso!

firstunitest

 

Futuro

Esse segundo post explica os conceitos básicos sobre o que é um teste, como se cria um teste de maneira simples. Para os próximos posts vamos seguir a fundo em testes unitários, explorando métricas como line e branch covarage, utilizar de mock em API`s externas! E para quem não leu o primeiro post de todos segue link

A importância dos testes

2 Comments

Deixe um comentário

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

Compartilhe isso: