Aprendendo sobre testes de softwares
Tags: braziliandevs, testing, tdd
Published: 2022-07-29 04:24:03

Estudo programação desde 2017, mas só em 2020 que tive a necessidade de implementar testes nas aplicações que eu desenvolvo. Já tinha ouvido falar sobre esse assunto antes, mas nunca parei para estudar. Quando comecei a estudar com mais profundidade, tive muita dificuldade de entender alguns conceitos. Nesse artigo vou relatar minhas dificuldades, e dar algumas dicas para quem está estudando sobre testes de software.

# O que são e quais os tipos de testes de softwares?

O primeiro passo que eu considero importante entender ao começar a estudar sobre testes, é aprender o que são testes de softwares, para que servem e quais os tipos de testes que existem.
De uma forma resumida os testes de softwares servem para garantir que as funcionalidades que estamos implementando estão funcionando da forma esperada.

## Pirâmide de testes

Existem vários tipos de testes de software, irei falar um pouco sobre os três principais tipos baseado na pirâmide de software.

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/cwszlnayr4f2ljin27s4.png)

- Os testes E2E pretende testar todas as funcionalidades do seu software, indo do frontend até o acesso do banco de dados ou de um sistema externo. Esse tipo de teste é pouco aplicado no dia-a-dia, pois ele tem um custo muito alto e leva muito tempo para executar.

- Os testes de integração visam testar partes da sua aplicação, por exemplo, a geração de nota fiscal em um sistema de loja online. O teste de integração ira executar o teste na classe de geração de nota fiscal integradas com outras classes necessárias para executar essa ação. Esse tipo de teste possui um custo e tempo de execução médio, comparados aos testes de E2E você ira implementar esse tipo de teste com mais frequência, mas mesmo assim não será tão frequentemente.

- Os testes de unidades, procura testar a menor parte funcional de um sistema, esse tipo de teste, você implementa para testar uma classe ou então uma função, isolada de outras partes do sistema. Esse tipo de teste você ira implementar frequentemente, pois ele possui um baixo custo de implementação e possui uma velocidade muito rápida de execução.

# Meus estudos sobre teste de software

Quando comecei no meu estágio em 2020, a pessoa que tava sendo minha mentora, pediu pra eu fazer um curso de cypress. Até aquele momento eu não tinha tido nenhum contato com testes de softwares. Quando comecei a fazer as aulas achei incrível o poder dos testes automatizados, uma das minhas tasks foi implementar testes de interfaces em algumas partes do sistema que a gente desenvolvia.

Com o passar do tempo comecei a escutar sobre TDD e entrou na minha lista de coisas para estudar. Só em 2021 quando comecei em uma nova empresa, que comecei a olhar sobre TDD e procurar materiais para estudos, mas tive dificuldade de entender e saber como implementar. Nessa nova empresa eu escrevia testes de unidade frequentemente nas tarefas que eu trabalhava, mas tinha um pouco de dificuldade de criar um teste do zero. Sempre que ia implementar um teste, pegava como exemplo outros testes que alguém já escreveu no projeto. Eu entendia o conceito de teste, tinha uma noção de como estruturar um teste, mas na hora de programar tinha dificuldade.

# Dificuldades em aprender sobre testes

A minha maior dificuldade foi de aprender sobre TDD. O TDD é uma metodologia de desenvolvimento que visa escrever o teste antes de implementar a funcionalidade. Comecei a procurar materiais sobre TDD. Estudei com livros, cursos, videos, artigos e outras formas. Mas era complicado, parecia que o conceito não entrava na minha cabeça.

Em fevereiro de 2022 comecei a buscar por um novo emprego, e durante as entrevistas quando me perguntavam qual era a maior dificuldade que eu tinha, eu sempre falava que era em escrever os testes de software. Durante a entrevista para a vaga que estou trabalhando atualmente, uma das coisas definida de ser trabalhado quando eu começasse na empresa, era de evoluir minhas habilidades em testes.

Durante meus estudos eu tentava implementar os conceitos de TDD que eu via, nos sistemas que eu estava desenvolvendo, mas sempre acabava preso em duas principais coisas. A primeira era de saber o que testar. Não sabia quais as classes eu devia testar, quais os casos de uso criar para testar uma funcionalidade. 

Outro conceito que tinha muita dificuldade de entender era o de mocks. Os mocks servem para simular ações de  uma classe, como, por exemplo, o acesso ao banco de dados. Eu não sabia em que momento deveria utilizar o mock.

# Superando as dificuldades

Como disse anteriormente, ao entrar na empresa nova, iria evoluir meus conhecimentos em testes de software e assim está sendo. A equipe que estou trabalhando está desenvolvendo projetos do zero, e com isso tive a oportunidade de participar desde a escolha da ferramenta utilizada para escrever os testes e o primeiro teste escrito na aplicação. Mas isso não quer dizer que você precisa entrar em um projeto que está começando, pra poder aprender sobre testes. Um dos conceitos que eu aprendi é que testes bem escritos ajudam muito as pessoas novas que estão entrando no projeto. E esse é um ponto que eu sempre levanto com o meu time quando estamos escrevendo os testes.

Durante esse tempo implementando testes, consegui amenizar as dificuldades que eu tinha ao entrar na empresa. Comecei a entender pra que serviam os mocks e quando utilizar. Uma das coisas que aprendi, foi que uma das dificuldades de utilizar mocks nos sistemas que eu desenvolvia, era pela forma que as classes estavam escritas.

Com o tempo e muita prática consegui a habilidade de formular de maneira mais fácil os casos de uso que devem ser escritos.
Entender quais classes não devem ser testadas. Uma coisa que eu descobri que existe, foram os testes mutantes. Esse tipo de teste pretende testar os seus testes. [Nessa](https://twitter.com/Kastrowalker/status/1519690967569379328) thread do twitter que eu criei, explico um pouco sobre eles e materiais que você pode utilizar pra aprender mais sobre eles.

Ao executar os testes mutantes na nossa aplicação, a gente descobriu várias falhas nos testes que escrevemos. Logo foi criado uma task para poder refatorar os testes. E ali eu vi uma oportunidade de aprender mais sobre testes, como precisei refatorar boa parte dos testes e escrever novos casos de uso, consegui aprender muita coisa.

# Diferença entre a teoria e a prática

Uma coisa que percebi que dificultou meu aprendizado também, é de tentar implementar na prática tudo aquilo que vi na teoria. A teoria é importante você estudar e te ajuda a resolver muitos problemas, mas no dia-a-dia, você vai adaptar ao que te deixa mais produtivo. 

Um exemplo que eu tive foi o de TDD, depois de um tempo que eu percebi que eu não tinha que seguir a risca o TDD para escrever meus testes, o mais importante era entender o conceito e levar o princípio do TDD para a prática.

E isso não fica preso apenas a testes, isso também se aplica a outros conceitos. Se você é uma pessoa iniciante no mundo de desenvolvimento, não se preocupa que com o tempo você vai percebendo isso e aprendendo quando você não deve seguir a risca o que você aprender na teoria.

# Material para estudar sobre testes

Nessa seção irei deixar materiais que me ajudaram a aprender sobre testes. Quando eu estava estudando sobre testes, foquei em TDD e testes para backend.

Dois conceitos importantes que eu percebi depois de um tempo que te ajuda a entender melhor sobre testes, é Orientação a Objetos e Padrões de projetos. Vou deixar dois materiais gratuitos sobre esses assuntos.

[Curso de Orientação a Objetos](https://www.youtube.com/watch?v=KlIL63MeyMY&list=PLHz_AreHm4dkqe2aR0tQK74m8SFe-aGsY) (Curso)

[Site sobre padrões de projetos](https://refactoring.guru/pt-br) (Artigos)

Em relação ao TDD e testes em geral, você vai descobrir que existem muitas ferramentas que variam de linguagem para linguagem. Quando eu estava estudando, na maioria das vezes utilizei Java/Kotlin com Junit. Mas também consumi materiais em outras linguagens/ferramentas, afinal o conceito de TDD seria o mesmo.

[Tdd - Desenvolvimento Guiado Por Testes](https://www.amazon.com.br/TDD-Desenvolvimento-Guiado-por-Testes/dp/857780724X) (Livro)

[Test-Driven Development](https://www.casadocodigo.com.br/products/livro-tdd) (Livro)

[TDD – Desenvolvimento de software guiado por testes](https://pt.coursera.org/learn/tdd-desenvolvimento-de-software-guiado-por-testes) (Curso)

[Aprenda TDD na prática](https://github.com/PauloGoncalvesBH/aprenda-tdd-na-pratica) (Artigo)

[API em NodeJS com Clean Architecture e TDD](https://www.youtube.com/watch?v=vV1wQ6GFH0A&list=PL9aKtVrF05DyEwK5kdvzrYXFdpZfj1dsG) (Curso)

# Conclusão

Eu ainda não sou um especialista em testes, ainda possuo dificuldades e sempre peço ajuda as pessoas do meu time que tem mais experiência com teste quando fico empacado em algo. Mas durante esses seis últimos meses nessa nova empresa, consegui perceber a minha evolução com testes e consegui colocar em prática as coisas que eu estava estudando durante um ano.

Resolvi escrever esse artigo pra contar para vocês, sobre a minha experiência e falar pra você que não precisa ficar se culpando ao demorar para entender um conceito. Eu passei mais de um ano estudando sobre teste e só nos últimos meses que consegui entender com mais facilidade e colocar em prática tudo aquilo que eu vi.

Obrigado por ler esse artigo e espero ter te ajudado de alguma forma. Qualquer dúvida que você tiver pode me mandar mensagem lá na DM do meu [twitter](https://twitter.com/kastrowalker/).

Não esquece de curtir aqui no dev.to e compartilhar esse artigo com outras pessoas que você acha, que pode também gostar de saber como hospedar um site gratuitamente.

Até uma próxima <3