Testes: onde vale mesmo a pena gastar o tempo
"É preciso escrever testes" é um conselho inútil sem a segunda metade: quais. Escrever os errados custa tempo, dá falsa confiança e trava as alterações que devia proteger.
1. Os três andares
Unitários — uma função, sem base de dados nem rede. Milissegundos. É onde se testam as regras: cálculos, validações, transformações.
De integração — várias peças juntas, com base de dados a sério. Segundos. É onde se apanha o que a unidade não vê: consultas erradas, migrações em falta.
Ponta a ponta — um browser a clicar como uma pessoa. Minutos, e frágeis. Poucos, e só nos caminhos que não podem falhar: entrar, pagar, publicar.
A proporção clássica é uma pirâmide, e o erro clássico é invertê-la.
2. Testar o comportamento, não a implementação
// Frágil: parte quando se renomeia um método interno
test('chama o validarEmail', () => {
const espia = mock(servico, 'validarEmail');
registar(dados);
assert.equal(espia.callCount, 1);
});
// Robusto: descreve o que tem de acontecer
test('recusa registo com email inválido', async () => {
const resultado = await registar({ ...dados, email: 'nao-e-email' });
assert.equal(resultado.ok, false);
});O segundo continua a passar depois de reescrever a função por dentro — e é isso que um teste tem de fazer: dar liberdade para mudar o como, sem mudar o quê.
3. O que vale mais a pena
O que já partiu uma vez. Cada bug corrigido merece um teste que o impeça de voltar.
As fronteiras. Listas vazias, nulos, textos com acentos, datas na mudança da hora.
As regras que dão dinheiro ou dores de cabeça: preços, permissões, cálculos.
As invariantes. Um teste que percorre o código e falha se alguém acrescentar uma rota sem autenticação vale por vinte testes de funções.
4. E o que não vale
Getters, wrappers de uma linha à volta de uma biblioteca, e a percentagem de cobertura como objetivo. Cem por cento de cobertura com asserções fracas é uma suite que corre depressa e não impede nada.
Um teste intermitente é pior do que teste nenhum: ensina a equipa a ignorar o vermelho. Ou se corrige, ou se apaga.