Testes automatizados e TDD - Parte 1

Na primeira parte dessa série sobre testes automatizados e TDD. Falaremos sobre os conceitos de testes automatizados e seus tipos.

Testes automatizados e TDD - Parte 1
Photo by Jeswin Thomas on Unsplash

Inspirado pela playlist sobre testes automatizados do Vinícius Dias (canal DiasdeDev), resolvi trazer para o blog alguns artigos sobre esse tema, começando com a teoria por trás dos testes automatizados, alguns exemplos práticos e também um pouco sobre TDD.

O que são testes automatizados?

Testes automatizados ou automação de testes é um método de testar softwares, que conta com o auxílio (ou não) de ferramentas especiais para controlar sua execução e compara o resultado obtido com um resultado esperado. Todo esse processo é realizado de maneira automática com pouca ou nenhuma intervenção humana.

Vantagens

As principais vantagens que podemos listar com relação a testes automatizados são:

  1. Testes automatizados não dependem de recurso humano para ser executado. assim é possível executá-lo em horários alternativos, liberando desenvolvedores a executarem outras tarefas;
  2. Reduz os erros humanos na execução dos testes. Quando todos os cenários são mapeados nos testes automatizados, conseguimos reduzir os erros humanos (ou vícios) dos testes manuais.
  3. Teste automatizados são facilmente reproduzidos. Com testes automatizados não é necessário conhecimento completo do funcionamento do sistema, uma vez que qualquer desenvolvedor é capaz de reproduzir a execução dos testes.
  4. Feedback mais rápido. Com testes automatizados conseguimos identificar mais rapidamente quando o software não está funcionando da maneira esperada.

Desvantagens

Apesar das inúmeras vantagens dos testes automatizados, também podemos listar algumas de suas desvantagens:

  1. É necessário utilizar recursos para desenvolver os testes automatizados. Existe um trabalho adicional durante o desenvolvimento para que os testes sejam escritos.
  2. Demanda conhecimento sobre automação de testes. Testes automatizados mal definidos podem causar falsa sensação de que o software está funcionando corretamente, por isso é necessário capacitação da equipe.
  3. Podem exigir recursos adicionais. Pode ser necessário a construção de um ambiente dedicado aos testes, com banco de dados etc.
  4. Pode desviar o objetivo principal dos testes. Pode causar o efeito de programar apenas para fazer o teste passar, desviando o foco do objetivo principal que é solucionar um problema.

Tipos de testes automatizados

Existem vários tipos de testes automatizados, todos têm um mesmo objetivo: reduzir o trabalho manual no teste de software, cada literatura divide os tipos de testes de uma maneira. Reuni alguns e separei da maneira que foi a mais fácil de entender durante meus estudos, são eles:

  1. Teste de Unidade - Testes de unidade (ou unitários) são responsáveis por testar a menor unidade de código possível, por exemplo, para assegurar o funcionamento correto de um método, ou um cálculo etc.
  2. Testes de Integração - Teste de integração asseguram que as unidades estão comunicando entre si da maneira esperada. Geralmente é nesse tipo de teste que verificamos se os dados estão sendo salvos corretamente no banco de dados, por exemplo.
  3. Testes End to End (E2E) - Testes End-to-End (E2E) visam garantir o funcionamento de ponta a ponta da aplicação, normalmente simula o comportamento do usuário através da navegação pelas telas.
  4. Teste de carga - Teste de carga servem para determinar o desempenho de um sistema em condições de carga da vida real. Através desse tipo de teste conseguimos validar o comportamento do sistema quando vários usuários acessam simultaneamente.

Pirâmide de testes

Mike Cohn propôs o conceito de pirâmide de testes em seu livro Succeeding with Agile, porém nem todos concordam com a nomenclatura utilizada por Mike Cohn, por isso, algumas versões da pirâmide foram derivadas da proposta original, uma delas, que gosto de utilizar como base, pode ser vista na figura da direita da imagem abaixo:

A proposta diz que devemos priorizar os testes debaixo para cima (bottom-up), ou seja, devemos ter em nosso sistema uma base sólida de testes de unidade (mais baratos e rápidos de serem executados) seguido de testes de integração e por fim testes E2E.

Porém o que vemos na maioria dos cenários é a ilustrado na figura da direita em que vemos a predominância de testes manuais e poucos testes de unidade.

Conclusão

O desenvolvimento de testes automatizados não é uma tarefa trivial e exige um certo conhecimento da equipe para que os testes automatizados não causem mais prejuízo do que benefícios.

É recomendado a implantação de testes automatizados em estágios iniciais do desenvolvimento (falaremos mais sobre isso quando abordarmos TDD). Em se tratando de sistemas já existentes, por exemplo, é importante que haja uma análise criteriosa de como os testes automatizados serão implementados para que não representem mais desvantagens do que vantagens.

Na próxima parte dessa série trarei exemplos práticos dos testes automatizados utilizando PHP, com e sem frameworks de teste. Também falaremos sobre dublês de teste e seus tipos. Até lá!