Testando aplicações com TestContainers e Selenium WebDriver
As empresas de software dependem fortemente de integração contínua e canais de entrega contínua para construir, testar e implantar seus aplicativos. Um meio de construção suave envolve uma estratégia de testes automatizados em cada fase com um ambiente real.
Um dos cenários mais populares é configurar o ambiente de teste no pipeline de CI (ou em qualquer servidor, até mesmo localmente), e executar os contêineres do docker para serviços necessários para execução dos testes.
Porém, há alguns fatores que podem implicar neste cenário, tais como:
- Normalmente usa-se ambientes de teste compartilhados entre as equipes, pois o uso de instâncias separadas para as dependências de cada teste ou equipes contém um custo alto(caro).
- Pode haver fragmentação nas massas de testes por conta do compartilhamento e, afetar diretamente outras equipes que utilizam o mesmo ambiente.
- A execução dos testes simultâneos podem trazer problemas de conflito com recursos.
A partir de agora, utilizaremos uma biblioteca java chamada de TestContainers, que nos auxilia nas questões mencionadas acima.
Mas afinal, o que é esse tal de TestContainers?
De acordo com a documentação oficial
“Testcontainers é uma biblioteca Java que suporta testes JUnit, fornecendo instâncias leves e descartáveis de bancos de dados comuns, navegadores da web com Selenium ou qualquer outra coisa que possa ser executada em um contêiner Docker.”
A biblioteca TestContainers nos permite usar contêineres docker em nossos testes e, portanto, fornece as dependências externas como camada de banco de dados, processamento de fluxo, Selenium WebDriver, AWS mocks (localStack), qualquer imagem docker ou qualquer aplicativo definido no arquivo docker compose contido em nossos testes. Ele ativará os contêineres Docker necessários para a duração dos testes e desativará quando a execução do teste for concluída.
Assim, sabemos que com o TestContainers é possível utilizar containers paralelos para execução de nossos testes com qualquer instância isolada de contêiner.
Dependências com suporte:
Benefícios:
- Totalmente compatível com os testes Selenium Webdriver, fornecendo uma RemoteWebDriver instância.
- Não há necessidade de ter navegadores da web específicos, ou mesmo um ambiente de desktop, instalados em servidores de teste. A única dependência é uma instalação do Docker em funcionamento e seu conjunto de testes Java JUnit.
- Os navegadores são sempre iniciados a partir de uma imagem fixa e limpa. Isso significa que não há desvio de configurações devido as alterações do usuário ou atualizações automáticas do navegador.
- A compatibilidade entre a versão do navegador e a API do Selenium é garantida: uma versão compatível das imagens do docker do navegador será selecionada automaticamente para corresponder à versão de selenium-api — *. Jar no classpath.
- Além disso, o uso de um navegador limpo evita o vazamento de cookies, dados em cache ou outro estado entre os testes
- Os contêineres de testes podem gravar automaticamente o vídeo das execuções dos testes (opcionalmente, capturando apenas os testes que falharam), pois ele excuta o navegador em modo headless.
Exemplo básico com TestContainers e Selenium Webdriver:
Neste exemplo, utilizaremos o Maven para importar as dependências necessárias, caso for optado por utilizar o Gradle, insira as dependências no formato comportado do arquivo.
Pré-requisitos:
> Instalação do Docker
> Estrutura de testes JVM
> JUnit 4 ou 5/Jupiter
No arquivo POM, importar as dependências:
A estrutura abaixo abre a página de pesquisa do Google no navegador Chrome do contêiner, e possibilita realizar qualquer tipo de ação definida.
Como dito anteriormente, o TestContainer executa o navegador no modo headless, nos dando a opção de gravar todos os testes ou apenas os testes que falharam. Por exemplo, podemos definir o VncRecording para gravar todos os testes e salvar no diretório ./target/ conforme o trecho:
A partir de agora, podemos modelar nossos testes de uma maneira mais estruturada, de forma que os times possam fazer suas execuções independentes, e em um estágio muito inicial do ciclo de desenvolvimento junto com o teste de unidade em paralelo, e também no pipeline de CI.
O TestContainers incorpora diversos contêineres de dependências externas, ou seja, podemos utiliza-lo para vários cenários além de um teste de UI, como por exemplo em testes de integração.
Para mais informações acesse o site oficial do TestContainers