O que e um service container na CI? Bancos de dados para seus testes
Um service container e um continer de apoio - um banco de dados, cache ou fila - que seu provedor de CI inicia ao lado do seu job para que os testes de integracao tenham algo real com que conversar.
Muitos testes precisam de uma dependencia viva: um banco de dados Postgres, um cache Redis, um message broker. Em vez de instalar e gerenciar isso no runner, os sistemas de CI permitem que voce declare service containers. O provedor os inicia ao lado do seu job, configura a rede e os desativa depois.
O problema que resolvem
Testes de integracao sao muito mais valiosos quando rodam contra o mecanismo de banco de dados real, e nao contra um mock. Service containers tornam isso barato e repetivel - um Postgres limpo a cada execucao, sem poluir o host.
Como os jobs os alcancam
O servico e acessivel pela rede por um hostname (muitas vezes o label do servico). Sua configuracao de teste aponta para esse host e a porta mapeada, e se conecta como faria com qualquer banco de dados.
Um exemplo de GitHub Actions
Em um workflow voce adiciona um bloco services: com uma imagem postgres, env para a senha e um mapeamento de porta. O runner o inicia antes dos seus steps; os testes se conectam a ele pelo hostname do servico.
A prontidao importa
- Um banco de dados pode aceitar conexoes apenas depois de terminar a inicializacao.
- Health checks ou um loop de espera evitam flakes de "connection refused".
- Popule dados iniciais em um init step para que os testes partam de um estado conhecido.
Service containers e confiabilidade
Baixar e iniciar imagens de servico adiciona tempo e uma falha transitoria ocasional. Runners gerenciados fazem cache das imagens de servico comuns e reexecutam automaticamente blips de registry, para que um pull lento ou instavel nao reprove uma execucao de teste que estaria verde.
Principais conclusões
- Um service container e uma dependencia gerenciada pela CI (DB, cache, fila) para testes.
- Os jobs o alcancam pela rede via hostname e porta.
- Aguarde a prontidao para evitar flakiness de connection-refused.