Por que e como testar?
Podemos dizer que hoje já existe um consenso entre as pessoas desenvolvedoras de que é importante testar nossa aplicação. Mas por que exatamente? E quais as formas de testar? Quais ferramentas estão disponíveis para a linguagem que utilizo? As perguntas são muitas e vou abordar algumas delas aqui.
Começando do começo, o que são testes automatizados e por que usá-los?
A forma mais simples de descrever testes automatizados é: Um código para testar nosso código. Ou seja, o teste invocaria os comportamentos da sua aplicação a fim de garantir que a saída é sempre a esperada.
Quando usamos testes automatizados, podemos garantir que o código que foi desenvolvido não impactou no código funcional que já existia, pois não é prático nem rápido testar manualmente toda a aplicação para garantir que tudo continua funcionando a cada nova alteração no código.
Outro ponto importante é que os testes automatizados nos garantem mais produtividade já que, sim, perdemos um pouco mais de tempo desenvolvendo os testes além do desenvolvimento da feature, mas ganhamos tempo nos testes futuros. Rodando os testes ainda durante o desenvolvimento temos uma probabilidade maior de evitar que certos bugs cheguem em produção.
A pirâmide de testes é uma estratégia de divisão dos testes de uma aplicação, separada, em geral, em 3 partes: Testes unitários, testes de integração e testes E2E ou Testes de UI. Conforme subimos na pirâmide, vemos que a quantidade de testes das camadas seguintes diminui, enquanto o tempo de execução e os custos do teste aumentam.
Testes de unitários
Os testes unitários constituem a base da pirâmide de testes. São mais rápidos de desenvolver e executar além de ter custo menor quando comparados com os outros testes da pirâmide. São também os responsáveis por garantir que após alguma alteração o código continua funcionando como deveria. Tratam-se dos testes referentes à menor unidade de código testável da nossa aplicação como um método ou função, logo, cada unidade é testada de forma isolada do resto da aplicação.
Testes integrados
Estes são os testes que ficam na camada intermediária onde verificamos se um conjunto de unidades se comportam da maneira desejada. Depois de testados as unidades do código e garantir que elas funcionam isoladamente, precisamos garantir que elas também funcionam unidas. É ai que entram os testes de integração. É também onde testamos a integração com serviços externos (outras classes do projeto, repositories, api externa, etc).
Testes de ponta a ponta
Os testes de ponta a ponta, end-to-end (E2E) ou testes de UI estão no topo da pirâmide pois são os mais lentos e caros por serem extremamente integrados. O objetivo desses testes é imitar o comportamento da aplicação quando acessada pelo usuário do inicio ao fim. Nessa camada testamos a aplicação como um todo. Desde os cliques no browser, dependências, banco de dados, comportamento do backend e a integração de toda a aplicação. Algumas ferramentas disponíveis para testes e2e são Selenium (Java, Python, Javascript, Kotlin, Ruby e C#), Mink e Behat (PHP).
Ferramentas de testes
Listarei aqui algumas ferramentas para testes unitários e integrados disponíveis por linguagem.
PHP
Java
JavaScript
C#
Python