4 pontos por GN⁺ 2024-02-28 | 1 comentários | Compartilhar no WhatsApp
  • Framework open source que oferece bancos de dados, message brokers, navegadores web e outros componentes que podem ser executados em contêineres Docker
  • Não exige configuração complexa de ambiente nem objetos simulados (mocks); as dependências de teste são definidas em código e, ao executar os testes, os contêineres são criados e removidos
  • Suporta várias linguagens e frameworks de teste, e é possível começar apenas com Docker
  • Módulos: teste tudo o que puder ser conteinerizado
    • É possível testar diversos componentes por meio de mais de 50 módulos, incluindo bancos de dados e message brokers
  • Linguagens suportadas: há implementações do Testcontainers para várias linguagens populares, como Java, Go, .NET, Node.js, Python, Rust, Haskell, Ruby, Clojure e Elixir.

Casos de uso: como o Testcontainers pode ajudar

  • Testes de integração da camada de acesso a dados: teste o código da camada de acesso a dados usando uma instância de banco de dados conteinerizada
  • Testes de UI/aceitação: execute testes automatizados de UI usando navegadores web conteinerizados compatíveis com Selenium
  • Testes de integração de aplicações: execute a aplicação em um modo de teste temporário com dependências como banco de dados, fila de mensagens e servidor web, oferecendo um ambiente rico para interação e testes exploratórios

Opinião do GN⁺

  • O Testcontainers ajuda desenvolvedores a realizar testes em condições semelhantes ao ambiente real, contribuindo para melhorar a qualidade do software.
  • Testes com dependências reais podem fornecer resultados mais precisos do que o uso de objetos simulados, mas em sistemas complexos a configuração e a gestão podem ser difíceis.
  • Outros projetos com funcionalidades semelhantes ao Testcontainers incluem Docker Compose e Kubernetes Minikube, que também podem ser usados como ferramentas de apoio a testes em ambientes de desenvolvimento.
  • Ao adotar o Testcontainers, é necessário ter familiaridade com Docker, e pode ser exigido conhecimento técnico sobre gerenciamento de contêineres e configuração de rede.
  • Os benefícios dessa escolha incluem maior consistência entre os ambientes de desenvolvimento e teste, além de mais confiabilidade nos testes; por outro lado, a dependência do ambiente Docker e a complexidade associada podem ser desvantagens.

1 comentários

 
GN⁺ 2024-02-28
Comentários no Hacker News
  • Resumo do primeiro comentário:

    • Não esperava tantos elogios ao Testcontainers.
    • Para quem vem de um ambiente que não usava Docker, isso pode parecer atraente.
    • É útil em muitos casos de uso, mas é difícil fazer com que funcione bem com outros fluxos de trabalho containerizados.
    • O Testcontainers é uma biblioteca que usa chamadas de shell customizadas para a CLI do Docker como parte central da sua funcionalidade, o que causa problemas e complexidade ao introduzir outros fluxos de trabalho containerizados.
    • Tende a assumir que roda apenas na máquina host e que não há outras tarefas relacionadas ao Docker, então muitas vezes pode ser tão ruim quanto ou pior do que bibliotecas para ambientes sem Docker.
  • Resumo do segundo comentário:

    • Testcontainers é um divisor de águas para testes de integração.
    • Fornece APIs do Docker específicas por linguagem para subir contêineres facilmente e verificar quando estão prontos para conexão.
    • Uso Testcontainers em todos os projetos novos para testes de integração.
    • A configuração de CI inclui linting, build, testes unitários e testes de integração com Testcontainers.
    • Os bindings da linguagem oferecem funções auxiliares úteis para operações com bancos de dados.
  • Resumo do terceiro comentário:

    • Não entende por que não seria melhor usar docker-compose.yml.
    • Quando há dependências complexas entre os contêineres necessários, o Testcontainers é relativamente fraco.
    • Usou há cerca de 5 anos, mas a situação pode ter melhorado bastante desde então.
  • Resumo do quarto comentário:

    • Considera muito valiosos os testes de integração que usam banco de dados real/Elasticsearch/Redis/Varnish etc.
    • O Testcontainers cuida de tarefas como criar e encerrar um novo índice do Elasticsearch durante a suíte de testes.
    • Prefere uma estratégia que cubra o máximo possível das funcionalidades da aplicação com testes de integração no estilo ponta a ponta.
    • Usa testes unitários apenas nas partes do código com pares claros de entrada/saída, e mocks para coisas como chamadas de API externas que não podem ser controladas.
  • Resumo do quinto comentário:

    • Escreveu o conex, uma versão do Testcontainers para a linguagem Go, há cerca de 7 anos.
    • Ele oferece integração de primeira classe com o framework oficial de testes do Go.
  • Resumo do sexto comentário:

    • Há quem ache lento fornecer uma instância nova e limpa do navegador para cada teste.
    • Se você já investiu no mundo dos contêineres, faz sentido aceitar alguns contêineres extras.
    • Caso contrário, há pouco benefício diante da complexidade ou do peso adicional.
  • Resumo do sétimo comentário:

    • Analisou o Testcontainers e criou sua própria versão.
    • Docker é uma abstração cheia de vazamentos, e os testes precisam rodar em ambientes diversos.
    • A rede é completamente diferente no Mac, em uma VM Linux e dentro de um contêiner Docker em uma VM Linux com o socket do Docker montado.
    • Quer executar testes em paralelo e exibir logs adequados para cada teste.
    • Não tem certeza se o Testcontainers resolveu esses problemas, mas percebeu que o diabo mora nos detalhes.
  • Resumo do oitavo comentário:

    • Cria o ambiente local de testes com docker-compose.
    • O Testcontainers parece ser uma abstração em linguagem de programação para definir ambientes Docker sem aprender a sintaxe do Docker Compose.
    • Ainda é necessário entender rede do Docker, dependências e health checks para saber quando o ambiente de teste está pronto para uso.
  • Resumo do nono comentário:

    • Não há necessidade de mocks nem de configuração complexa de ambiente.
    • Você define as dependências de teste em código, executa o teste, e os contêineres são criados e removidos.
    • Achar que poder rodar testes de integração em contêineres elimina a necessidade de testes unitários é um mal-entendido.
    • Configurar contêineres Docker é simples, mas iniciá-los é doloroso e lento.
  • Resumo do décimo comentário:

    • É uma pergunta sobre o uso do Duke como logotipo do Java.