Ir para o conteúdo principal
Background Image

Como auxiliar um desenvolvedor na escrita de testes unitários

··5 minutos·
Rafael Issao
Autor
Rafael Issao
Apaixonado por tecnologia, programação e inovação. Adoro compartilhar conhecimento e aprender coisas novas todos os dias.
Tabela de conteúdos

Uma das práticas que considero importantes é a escrita de testes unitários.

No entanto, muitos desenvolvedores evitam ou escrevem poucos testes unitários.

Neste artigo, vamos definir o que são testes unitários, explorar as dificuldades que os desenvolvedores enfrentam e discutir como podemos apoiá-los na escrita desses testes.

👀 O que é um teste unitário?
#

Vamos usar a analogia da omelete.

Analogia da omelete
Analogia da omelete

O que precisamos para fazer um omelete simples e saboroso?

Os ingredientes são:

  • Ovo
  • Sal
  • Panela
  • Fogão

Sabemos que não podemos usar ovos podres, por isso realizamos um teste quebrando o ovo em uma xícara para verificar sua frescura.

Provamos o sal para garantir que não estamos utilizando açúcar.

A panela deve estar limpa e ser antiaderente.

O fogão precisa estar com gás.

Se algum desses testes falhar, não conseguiremos fazer um omelete, pois sabemos que o resultado será insatisfatório.

Podemos considerar que os componentes essenciais para a elaboração de um omelete são o ovo, o sal, a panela e o fogão. São as unidades testáveis do omelete.

Testamos cada um desses componentes de forma isolada e sabemos que, caso algum deles apresente problemas, não poderemos fazer o omelete.

Exemplo de testes unitários para um omelete:

  • O ovo não pode estar podre
  • É necessário usar 2 ovos
  • Deve ser utilizada 1g de sal
  • A panela deve ser antiaderente
  • A panela deve estar limpa
  • O fogão deve ter gás
  • O fogão deve ter pelo menos uma boca livre

Se todos os testes acima passarem, podemos avançar para a próxima etapa. No entanto, se algum deles falhar, sabemos que o omelete não será bom.

E observe as características dos testes acima: eles são rápidos de verificar e específicos em relação aos problemas que podem ocorrer:

  • 🚫 O ovo não pode estar podre

    Precisamos trocar por ovos frescos.
    
  • 🚫 A panela deve estar limpa

    Precisamos limpar a panela antes de cozinhar.
    

Portanto, um teste unitário envolve a verificação de partes significativas, isoladas e, principalmente, testáveis de uma funcionalidade completa.

Esses testes devem ser rápidos e precisos.

🥺 As dificuldades de escrever um teste unitário
#

Na analogia anterior, as unidades são fáceis de identificar: o ovo, a panela, o sal e o fogão.

Mas no mundo do desenvolvimento temos:

  • Um problema do cliente a ser resolvido
  • Uma feature a ser implementada
  • Um produto a ser criado
  • E assim por diante

Ou seja, começamos com um “omelete”.

E a partir desse todo, devemos identificar as unidades que serão verificadas no teste unitário.

E a maior dificuldade dos desenvolvedores é identificar as unidades significativas, isoladas e testáveis dentro desse todo.

É a falta do design estratégico.

O** design estratégico **fornece uma visão geral da solução, seja para resolver um problema, implementar uma funcionalidade ou criar um produto.

E você não precisa saber programar para fazer um design estratégico!

Precisamos somente de mentes criativas.

😍 Ajudando os desenvolvedores com design estratégico!
#

Vamos usar um exemplo para praticar o design estratégico:

Considere o seguinte requisito:

  • Ler um arquivo no formato txt e contar quantas senhas contêm apenas números
  • Cada linha do arquivo contém uma senha
  • O tamanho máximo permitido do arquivo é 150 MB

Exemplo de conteúdo do arquivo:

monkey
lovely
jessica
654321
michael
ashley
qwerty
111111
iloveu
000000
michelle
tigger
sunshine
chocolate
password1

Um modelo mental que pode ajudar você a identificar as unidades testáveis é pensar nas etapas necessárias para atingir o objetivo da funcionalidade.

Por exemplo, eu consideraria as seguintes etapas:

1️⃣ Abrir um arquivo txt e ler as senhas

2️⃣ Para cada senha encontrada, determinar se contém apenas números

3️⃣ Contabilizar o total de senhas que possuem somente números

Se possível, eu recomendo fazer um desenho das etapas:

Visão geral para a solução do requisito
Visão geral para a solução do requisito

Após identificar as unidades, precisamos analisá-las uma a uma.

E a análise que vamos fazer é: Que testes eu faria nesta etapa para garantir o bom funcionamento dela?

Por exemplo, vamos olhar a etapa 1️⃣.

O que a etapa 1️⃣ precisa para “Abrir o arquivo”?

Ele precisa do nome do arquivo que ele vai abrir!

Então os dados para a etapa 1️⃣ são nomes de arquivo.

Para documentar a análise, recomendo o uso de exemplos com os resultados esperados para cada um deles.

Abaixo está um modelo de tabela para organizar esses exemplos:

Como exercício, conseguem imaginar mais testes para a etapa 1️⃣? E o resultado esperado de cada uma delas?
Como exercício, conseguem imaginar mais testes para a etapa 1️⃣? E o resultado esperado de cada uma delas?

Pronto!

Com a unidade determinada e uma tabela de exemplo explicando como deve funcionar a unidade, facilita a escrita dos testes unitários!

Um exemplo para a etapa 2️⃣ poderia ser assim:

Nesta tabela tentamos deixar claro o que significa "senhas que possuem somente número".
Nesta tabela tentamos deixar claro o que significa “senhas que possuem somente número”.

Consegue pensar em outros casos? Tente!


📢 IMPORTANTE - Sempre pergunte!

Ao ler o requisito, pode não ficar claro que ‘-2’ e ‘0,23’ não são senhas que contêm apenas números. Isso é normal e faz parte do exercício.

Ao considerar os cenários que podem ocorrer, surgirão dúvidas sobre como o sistema deve se comportar.

Nesses momentos, é fundamental perguntar ao usuário final, cliente ou gestor de produto, qual deve ser o comportamento esperado.


Conclusão
#

Quando você possui um design estratégico e consegue identificar as unidades testáveis menores dentro de uma solução completa, os testes se tornam mais simples, focados e fáceis de criar.

Ao pensar nos testes após a definição das unidades, é mais fácil automatizá-los por meio de testes unitários.

Isso significa que conseguimos reduzir significativamente o custo dos testes manuais!

No início, é natural que você e sua equipe enfrentem dificuldades.

Mas isso é normal! Com a prática, vocês se tornarão mais proficientes.

Tomara que tenham curtido e obrigado por ter lido até aqui.

Qualquer dúvida, correção, sugestão, podem comentar a vontade.

Até a próxima!