Curso JUnit: #1 - Primeiros passos em testes de Software

Todos os dias nós consumimos diversos produtos e serviços, como: Roupas, Alimentos, Bebidas, Eletrodomésticos, Computadores, Smartphones, Consoles de Video Games, etc. Porém antes de consumir cada um desses itens uma dúvida sempre vem à nossa cabeça: Será que esse produto tem qualidade? E é justamente por isso que é super comum acharmos diversos vídeos, posts em redes sociais, blogs, etc. Mostrando Review de produtos e mostrando se são ou não tão bons quanto dizem ser.

Mas, o que é considerado um produto de qualidade? Será que um smartphone que trava no meio de uma ligação pode ser considerado um produto de qualidade? Será que uma torta de chocolate, dentro de prazo de validade, que deveria ser doce, mas que está com o sabor salgado, pode ser considerado um produto de qualidade?

Na minha opinião, uma das frases que melhor descreve o que é um produto de qualidade é: "Um produto tem qualidade, quando ele entrega corretamente o que se espera dele".

Nós normalmente não compramos produtos que não foram devidamente testados, então porque a gente espera que nossos usuários utilizem nossos softwares sem que os mesmos sejam devidamente testados?

Diversas empresas de desenvolvimento de softwares têm em seus times uma equipe de QA (Quality Assurance ou Garantia da Qualidade). O time de QA testa exaustivamente os softwares para garantir que os mesmos vão "entregar corretamente o que se espera deles", mas você enquanto desenvolvedor, também precisa garantir que seu código está funcionando corretamente antes de submete-lo para a equipe de QA validar, e principalmente antes de disponibiliza-lo para o cliente final.

Ai vem uma grande dúvida: Como eu devo testar meus softwares?

Tipos de testes de software

Um software é constituído por diversas pequenas partes interconectadas, como por exemplo: Camada de Front-end, Camada de Back-end, Camada de Banco de dados, Camada de Cache, Camada de Mensageria, etc. E cada pequena parte dessa precisa ser testada para garantir que ela está funcionando corretamente. Uma analogia seria um carro. Um carro também é constituído por diversas pequenas partes, e certamente não faria sentido colocar um motor no carro sem que esse motor tenha sido testado e tenha garantia de que está funcionando corretamente.

Mas, o que eu preciso testar? A resposta é muito simples: "Tudo!"

Precisamos garantir que:

  • Todas as funcionalidades que foram especificadas, foram implementadas e estão funcionando corretamente;

  • O software está funcionando sem lentidão, sem sobrecarga de recursos, etc;

  • O software está sendo executado corretamente em todas as plataformas para as quais o mesmo foi projetado;

  • As informações armazenadas no software estão seguras e estarão disponíveis quando precisarmos;

  • etc...

Testes E2E ou End-to-End ou Fim-a-Fim

São testes onde o objetivo é testar o produto final do ponto de vista do usuário. Ou seja, usamos o software como se fosse um usuário, testando cada funcionalidade. Como exemplo poderíamos imaginar um programa como o Microsoft Word. Nesse caso precisaríamos:

  • Testar se é possível criar um novo arquivo em branco;

  • Testar se é possível salvar um arquivo em branco;

  • Testar se é possível salvar um arquivo com algum texto;

  • Testar se é possível aplicar negrito, italico, sublinhado, etc. nos textos;

  • Testar se é possível inserir imagens no texto;

  • etc.

Se você já usou o Word provavelmente deve ter ficado cansado só de pensar nas milhões de funcionalidades que o Word tem, agora imagine que a cada novo Release, ou seja, a cada nova atualização, seja necessário re-testar todas essas funcionalidades! Complicado, não é?

Ferramentas mais comuns: Cypress, Playwright, Selenium, etc...

Testes Unitários ou Testes de Unidade

Como eu disse anteriormente, não faria sentido colocar um motor não testado num carro, para só então realizar o teste completo do veículo. Assim sendo, não faria sentido testar a aplicação como um todo sem antes testar cada pedacinho separadamente. Mas... de quais pedacinhos estamos falando?

A menor unidade testável de um software é uma função (ou método no caso de Programação Orientada a Objetos), assim sendo, precisamos testar cada função dessa de forma isolada antes de poder integrar ela em outras partes do software e isso é o teste de unidade.

Ferramentas mais comuns: JUnit, PHPUnit, Pest, PyUnit, Jest, etc...

Testes de Integração

Os testes de integração visam garantir que diferentes componentes do sistema funcionam corretamente quando integrados. Isso é extremamente útil para revelar problemas de comunicação entre os componentes.

Ferramentas mais comuns: JUnit, PHPUnit, Pest, PyUnit, Jest, etc...

Testes de Desempenho ou Teste de Carga

Imagine que você desenvolveu uma loja virtual e a mesma está funcionando corretamente em seu computador, porém quando você disponibiliza no servidor para os usuários finais, na primeira Black Friday ela não consegue ficar 2 minutos no ar porque não aguenta a alta carga de acesso. A função do teste de desempenho é avaliar os limites de utilização suportados pelo sistema para melhor dimensionar a infraestrutura e definir recursos mínimos e recomendados de hardware.

Ferramentas mais comuns: Apache JMeter, K6, Gatling, etc...

Bem, como você já deve ter percebido, existem diversos tipos de testes de softwares (além dos que já foram apresentado), mas nosso foco nessa série será nos testes de unidade com a ferramenta JUnit.

Na próximo post veremos como instalar e configurar o JUnit em um novo projeto Java, e veremos como executar nosso primeiro teste de software, espero vocês lá!