Ontem escrevi sobre Como fazer testes unitários e de integração com o Couchbase e o TestContainers. Um dos pré-requisitos para esses testes era ter uma imagem já criada. Acontece que não é necessário. Você pode usar o TestContainers para criar suas próprias imagens personalizadas antes de executar seus testes, e isso é muito fácil. Graças a Sergei Egorov por me mostrar o caminho!
Criação de imagens em tempo real
No exemplo anterior, uma imagem seria instanciada com o seguinte código:
1 2 3 4 5 6 |
@Regra de classe público estático Contêiner genérico couchbase = novo Contêiner genérico("mycouchbase:latest") .comExposedPorts(8091, 8092, 8093, 8094, 11207, 11210, 11211, 18091, 18092, 18093) .waitingFor(novo Estratégia de espera do Couchbase()); |
O construtor GenericContainer receberia apenas uma String como parâmetro. Essa String é o nome do contêiner que você deseja testar. Mas o construtor GenericContainer também aceita um Future. Que, por acaso, é o que a classe ImageFromDockerfile é. A classe Docker será criada de forma assíncrona com os parâmetros que você fornecer.
Aqui, copiei tudo o que precisava na pasta de recursos do meu projeto, o que torna todos eles acessíveis a partir do classpath. É por isso que uso a tag comFileFromClasspath
método. Você também pode obter um arquivo a partir de uma cadeia de caracteres, um caminho absoluto ou um arquivo. Você encontrará mais informações sobre isso em Documentação do TestContainers.
1 2 3 4 5 6 7 8 9 10 11 |
@Regra de classe público estático Contêiner genérico couchbase = novo Contêiner genérico( novo ImageFromDockerfile().comFileFromClasspath("Dockerfile", "Dockerfile") .comFileFromClasspath("scripts/dummy.sh","scripts/dummy.sh") .comFileFromClasspath("scripts/entrypoint.sh","scripts/entrypoint.sh") .comFileFromClasspath("scripts/run","scripts/run") ) .comExposedPorts(8091, 8092, 8093, 8094, 11207, 11210, 11211, 18091, 18092, 18093) .waitingFor(novo Estratégia de espera do Couchbase()); |
E, com isso, sua imagem do Docker será criada automaticamente antes de executar seus testes. Por padrão, as imagens são excluídas na saída, mas você pode passar um sinalizador para manter as imagens e evitar reconstruí-las o tempo todo. Isso realmente depende de sua estratégia de teste.
Solução de problemas
Enquanto escrevia isso, encontrei um pequeno problema. Todos os recursos que foram usados para a criação da imagem perderam suas permissões, então tive que adicionar um EXECUTAR chmod +x
em todos os recursos que copio no Dockerfile. Agora, esse é um problema conhecido e as pessoas adoráveis e reativas por trás do TestContainer estão trabalhando nisso. Você pode conversar com eles em seu canal do SlackAssim como você pode conversar com o pessoal do Couchbase em nosso canal comunitário.