O Que É um Teste Unitário?
Um teste unitário verifica um único pequeno trecho de código, como uma função ou classe, isolado do resto do sistema.
Testes unitários são os menores e mais numerosos testes na maioria das suítes. Cada um exercita uma única unidade de comportamento sem banco de dados, sem rede e sem outras partes móveis, então roda em milissegundos e falha por um único motivo claro. Eles formam a base da pirâmide de testes.
O que conta como uma unidade
Uma unidade é o menor trecho de código que vale a pena testar isoladamente, frequentemente uma única função ou método. A característica definidora é o isolamento: um teste unitário não toca sistemas externos, então seu resultado depende apenas da entrada que você fornece.
Por que testes unitários são rápidos e focados
Como evitam I/O, testes unitários rodam aos milhares em segundos. Quando um falha, a causa é local e óbvia, o que os torna baratos de escrever, baratos de rodar e baratos de depurar. Essa velocidade é o que permite que desenvolvedores os rodem constantemente.
Um exemplo simples
Uma função que formata um preço tem entradas e saídas claras, então um punhado de asserts descreve totalmente seu comportamento.
test("formats price", () => {
expect(formatPrice(1999)).toBe("$19.99");
expect(formatPrice(0)).toBe("$0.00");
});Armadilhas comuns
- Alcançar um banco de dados ou rede, o que o torna um teste de integração.
- Fazer assertions sobre detalhes internos de implementação em vez de comportamento.
- Fazer mock em excesso até o teste não refletir mais o uso real.
- Escrever um teste gigante em vez de vários pequenos e focados.
Testes unitários em uma suíte de CI
Testes unitários são o primeiro portão no CI porque são rápidos e determinísticos. Um pull request que quebra um deveria falhar em segundos. Manter a camada unitária grande e as camadas mais lentas pequenas é o que torna uma suíte de CI rápida. Em runners rápidos essa camada pode terminar em bem menos de um minuto mesmo em bases de código grandes.
Principais conclusões
- Um teste unitário exercita um pequeno trecho de código isolado.
- O isolamento torna testes unitários rápidos, focados e fáceis de depurar.
- Eles formam a base larga da pirâmide de testes e rodam primeiro no CI.