O Que É um Teste de Integração?
Um teste de integração verifica se dois ou mais componentes funcionam corretamente juntos, em vez de testar cada um isoladamente.
Testes unitários provam que as peças funcionam; testes de integração provam que as peças se encaixam. Eles exercitam as junções entre módulos, serviços ou um módulo e um banco de dados real, capturando as incompatibilidades que testes unitários deliberadamente eliminam via mock. Eles ficam no meio da pirâmide de testes.
O que testes de integração cobrem
Um teste de integração cruza uma fronteira que um teste unitário simula com stub: uma função conversando com um banco de dados real, dois serviços trocando mensagens ou uma camada de API alcançando seu armazenamento. O bug que ele captura geralmente é uma suposição errada sobre como duas partes interagem.
Dependências reais versus falsas
Testes de integração frequentemente usam dependências reais ou quase reais, como um banco de dados iniciado em um container, em vez de mocks. Esse realismo é o objetivo, mas também os torna mais lentos e mais propensos a problemas de ambiente do que testes unitários.
Um exemplo prático
Um teste que salva um registro e o lê de volta exercita o ORM, a camada de query e o banco de dados real juntos, capturando incompatibilidades de schema e serialização que um mock esconderia.
test("saves and loads a user", async () => {
await repo.save({ id: 1, name: "Ada" });
const loaded = await repo.findById(1);
expect(loaded.name).toBe("Ada");
});Por que importam
- Capturam incompatibilidades de contrato entre componentes.
- Trazem à tona problemas de configuração e ambiente cedo.
- Dão confiança de que o sistema montado funciona.
- São menos numerosos que testes unitários, mas mais reveladores por teste.
Testes de integração no CI
Como precisam de serviços reais, testes de integração frequentemente rodam com service containers no pipeline e levam mais tempo que testes unitários. Rodá-los em runners isolados evita interferência entre testes, e reexecutar automaticamente falhas genuinamente transitórias, como um container que demorou a iniciar, mantém o sinal limpo. Latchkey fornece runners limpos e isolados e retries de falhas transitórias que se adequam a esta camada.
Principais conclusões
- Testes de integração verificam se componentes funcionam juntos através de fronteiras.
- Eles favorecem dependências reais em vez de mocks, trocando velocidade por realismo.
- Ocupam o meio da pirâmide e rodam após os testes unitários no CI.