Are my Tests Good Enough? Extra Criteria
A Pirâmide de Testes e Suas Implicações
Estrutura da Pirâmide de Testes
- A pirâmide de testes é uma abordagem que analisa a distribuição entre diferentes tipos de testes, com ênfase na quantidade e tipo.
- Na base da pirâmide, estão os testes unitários, seguidos pelos testes de integração e, no topo, os testes da interface gráfica (GUI).
- Empresas que adotam esse modelo priorizam um maior número de testes unitários devido ao seu baixo custo e alta eficácia na localização de defeitos.
Vantagens dos Testes Unitários
- Os testes unitários são mais baratos para criar e executar, proporcionando feedback rápido aos desenvolvedores.
- Em contraste, os testes GUI tendem a ser mais lentos e menos eficazes em identificar problemas rapidamente.
Diversidade nas Suítes de Teste
- É comum ter múltiplas suítes de teste em um projeto, cada uma com características específicas adaptadas às necessidades do desenvolvimento.
- Testes mais simples podem ser executados frequentemente antes das contribuições ao código, enquanto suítes mais complexas podem ser usadas após integrações significativas.
Propriedades dos Testes Eficazes
- As propriedades dos testes são fundamentais para garantir sua qualidade; se a maioria dos testes possui boas características, a suíte como um todo é considerada boa.
- Um teste deve ser sensível ao comportamento do sistema; falhas devem ser reportadas quando o comportamento esperado não é atendido.
Características Importantes dos Testes
- Os testes devem focar no comportamento do sistema em vez da estrutura interna do código. Mudanças estruturais não devem afetar a validade dos testes.
- A legibilidade e rapidez na execução são essenciais para fornecer feedback ágil aos desenvolvedores.
- Os testes precisam ser determinísticos; eles não devem apresentar resultados inconsistentes entre execuções.
Isolamento e Independência nos Testes
- Cada teste deve operar independentemente; isso permite flexibilidade na execução e combinação dos mesmos conforme necessário.
- Um bom teste deve limpar qualquer "lixo" gerado durante sua execução para evitar interferências em outros testes subsequentes.
Identificação Clara de Problemas
- Os testes devem ajudar a localizar defeitos específicos no código. Se um teste falha localmente, espera-se que também falhe em produção.