Um pouco sobre Testes
Hoje em dia, a ausência de rotinas de teste em um software pode ser considerada um problema significativo, como bem destacou Michael Feathers: "Se um código não é acompanhado de testes, ele pode ser considerado de baixa qualidade ou até mesmo um código legado."
Neste artigo, vou abordar especificamente os testes de unidades, um princípio crucial para o desenvolvimento sustentável de software. Continue lendo se estiver curioso para saber mais sobre essa prática essencial.
Antigamente, antes da adoção das metodologias ágeis (para mais informações, consulte meu artigo anterior [link]), no fluxo de desenvolvimento em cascata, uma equipe de teste era responsável por conduzir testes de forma manual. Hoje, no entanto, contamos com testes automatizados, simplificando a vida dos profissionais envolvidos no desenvolvimento de sistemas digitais.
Uma maneira interessante de classificar os testes automatizados é através da Pirâmide de Testes, originalmente proposta por Mike Cohn [link]. A pirâmide categoriza os testes de acordo com sua granularidade.
Particularmente, os testes podem ser divididos em três grupos: testes de unidade, testes de integração ou testes de serviço, e testes de sistema ou testes de interface com o usuário.
Particularmente os testes são divididos em três grupos(testes de unidade, testes de integração ou testes de serviço, testes de sistema ou testes de interface com o usuário)
Testes de Unidade: Verificam automaticamente pequenas partes de um código, normalmente uma classe única. A maioria dos testes se enquadra nessa categoria, sendo mais simples, fáceis de implementar e de execução rápida.
Testes de Integração ou Testes de Serviço: Verificam uma funcionalidade ou transação completa de um sistema, envolvendo diversas classes e pacotes distintos, podendo até mesmo testar componentes externos, como um banco de dados. Esses testes demandam mais esforço para implementação e têm uma execução mais lenta.
Testes de Sistema ou Testes de Interface com o Usuário: Simulam de forma fiel uma sessão de uso do sistema por um usuário real. Por serem end-to-end, esses testes são mais caros, mais lentos e menos numerosos. Além disso, os testes de interface tendem a ser mais frágeis, significando que pequenas alterações nos componentes da interface podem exigir modificações nos testes.
Testes de Unidade
Os testes de unidade são testes automatizados de pequena unidade de código, normalmente classes, quando o sistema é desenvolvido com paradigma OO. Normalmente as classes são testadas de forma isolada do restante do sistema.
Resumindo, teste de unidade é quando testamos um métodos, passando parâmetros diferentes e verificando seus retornos, isso de forma automatizada.
Princípios
Vamos agora discutir os princípios para implementar bons testes de unidade.
Os testes de unidade devem satisfazer às seguintes propriedades, cujas iniciais formam a palavra FIRST em inglês:
- Rápido (Fast): Os desenvolvedores devem executar testes de unidade frequentemente para obter feedback rápido sobre bugs e regressões no código. Portanto, é crucial que esses testes sejam rápidos, executando em questão de milissegundos.
- Independentes: A ordem de execução dos testes de unidade não é importante. A execução de T1 seguida de T2 deve ter o mesmo resultado da execução de T2 e depois T1. Os testes também podem ser executados de forma concorrente sem afetar os resultados.
- Determinístico (Repeatable): Os testes de unidade devem sempre produzir o mesmo resultado. Se um teste T é chamado n vezes, o resultado deve ser o mesmo em todas as execuções - ou passa em todas as execuções ou falha em todas.
- Auto-verificáveis (Self-checking): O resultado de um teste de unidade deve ser facilmente verificável. Os desenvolvedores não devem ter que analisar manualmente arquivos de saída ou fornecer dados manualmente para interpretar os resultados dos testes.
- Escrito o Quanto Antes (Timely): Idealmente, os testes de unidade devem ser escritos antes mesmo do código que estão testando. O desenvolvimento orientado a testes promove essa prática.
Para evitar que este artigo fique muito extenso, vou publicar um próximo artigo durante a semana, onde implemento uma classe simples com TypeScript e aplico os conceitos de testes de unidade. Fique ligado!