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.

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:

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:

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:

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!


