No anterior blog expliquei como usar o Docker executando o Couchbase durante seus testes. Ambas as publicações tinham o requisito de que você precisava criar sua própria imagem do Docker do Couchbase com o cluster e os dados já configurados. Nesta publicação, mostrarei como você pode usar nossa imagem oficial do Docker e configurar o cluster como desejar durante a fase de configuração do seu teste.
Um contêiner de teste personalizado do Couchbase
O TestContainers já oferece suporte a vários tipos específicos de contêineres, especialmente no mundo relacional, como você pode ver na página documentação. Eles oferecem alguns recursos avançados, como uma conexão JDBC que permite que você use o banco de dados subjacente diretamente. Com o mesmo espírito, podemos criar um CouchbaseContainer personalizado que permitirá que você configure o cluster e os buckets durante os testes.
Ele será responsável por iniciar a imagem do Docker e retornará uma instância configurada do CouchbaseCluster. Primeiro, definimos o identificador padrão da imagem da plataforma e a porta Liveness como a porta 8091. Essa é a porta que será testada pela estratégia de espera HTTP padrão para o caminho '/ui/index.html#/'. Quando conseguirmos acessar essa página, poderemos começar a configurar o cluster.
1 2 3 4 5 6 7 8 9 |
público CouchbaseContainer() { super("couchbase:4.5.0"); } @Substituir protegida Inteiro getLivenessCheckPort() { retorno getMappedPort(8091); } |
A segunda etapa é substituir o método configure para garantir que todas as portas necessárias sejam expostas e definir a estratégia de espera HTTP,
1 2 3 4 5 6 |
@Substituir protegida vazio configurar() { addExposedPorts(8091, 8092, 8093, 8094, 11207, 11210, 11211, 18091, 18092, 18093); setWaitStrategy(novo HttpWaitStrategy (estratégia de espera)().forPath("/ui/index.html#/")); } |
Nesse ponto, você pode testar esse contêiner genérico. A imagem será executada em um estado em que você precisará configurar o Couchbase. Você precisa passar por todas as etapas do assistente. Essas etapas podem ser automatizadas por meio das ferramentas da CLI ou da API REST. Vamos usar a API para configurar o cluster.
Há três chamadas obrigatórias que precisamos fazer. Uma para configurar as cotas de RAM, uma para configurar o nome de usuário e a senha do usuário administrador e uma para configurar os serviços disponíveis no cluster (chave/valor, índice, consulta e fts).
Usando o curl, essas chamadas teriam a seguinte aparência:
1 2 3 4 |
enrolar -v -X POST http://192.168.99.100:8091/pools/default -d memoryQuota=300 -d indexMemoryQuota=300 enrolar -v http://192.168.99.100:8091/node/controller/setupServices -d 'services=kv%2Cn1ql%2Cindex' enrolar -v -X POST enrolar -v -X POST http://192.168.99.100:8091/settings/web -d port=8091 -d username=Administrator -d password=password |
Há várias maneiras de fazer um POST em Java, veja um exemplo:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
público vazio callCouchbaseRestAPI(Cordas url, Cordas carga útil, Cordas nome de usuário, Cordas senha) lançamentos IOException { HttpURLConnection httpConnection = (HttpURLConnection) ((novo URL(url).openConnection())); httpConnection.setDoOutput(verdadeiro); httpConnection.setDoInput(verdadeiro); httpConnection.setRequestMethod("POST"); httpConnection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded"); se (nome de usuário != nulo) { Cordas codificado = Base64.codificar((nome de usuário + ":" + senha).getBytes("UTF-8")); httpConnection.setRequestProperty("Authorization" (Autorização), "Básico"+codificado); } Fluxo de saída de dados fora = novo Fluxo de saída de dados(httpConnection.getOutputStream()); fora.writeBytes(carga útil); fora.descarga(); fora.próximo(); httpConnection.getResponseCode(); httpConnection.desconectar(); } |
Todas essas chamadas serão feitas a partir do initCluster
method. O conteúdo dessas chamadas dependerá da configuração fornecida ao contêiner. Podemos adicionar alguns métodos para definir quais serviços estão ativados, quais são o nome de usuário e a senha, as cotas de RAM ou os buckets de amostra a serem instalados.
Depois de implementar esse método, vamos expor um CouchbaseEnvironnement e um CouchbaseCluster. O getter do ambiente é responsável por executar initCluster
se ainda não tiver sido inicializado. Esse método também requer o estratégia de espera personalizada escreveu na postagem anterior. Basicamente, ele faz uma pesquisa em '/pools/default' até que o primeiro nó apresente um estado íntegro.
Aqui está o código da classe completa:
Uso
Para usar o CouchbaseContainer, basta fazer algo como:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
@Regra de classe público estático CouchbaseContainer couchbase = novo CouchbaseContainer(); @Teste público vazio testSimple() lançamentos Exceção { CouchbaseCluster cc = couchbase.geCouchbaseCluster(); Gerenciador de cluster cm = cc.gerenciador de cluster("Administrador","senha"); Configurações do balde configurações = DefaultBucketSettings.construtor() .enableFlush(verdadeiro).nome("default").cota(100).réplicas(0).tipo(Tipo de balde.BASE DE SOFÁ).construir(); configurações = cm.insertBucket(configurações); Estratégia de espera do Couchbase s = novo Estratégia de espera do Couchbase(); s.comBasicCredentials("Administrador", "senha"); s.waitUntilReady(couchbase); Balde balde = cc.openBucket("default"); Afirmar.assertNotNull(balde); } |
Se você quiser ter apenas o serviço k/v em execução com todas as amostras de dados importadas:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
público classe Teste do driver do Couchbase { @Regra de classe público estático CouchbaseContainer couchbase = novo CouchbaseContainer() .comAmostra de Cerveja(verdadeiro) .comGamesIMSample(verdadeiro) .comTravelSample(verdadeiro) .comFTS(falso) .com índice(falso) .comQuery(falso); @Teste público vazio testSimple() lançamentos Exceção { CouchbaseCluster cc = couchbase.geCouchbaseCluster(); Gerenciador de cluster cm = cc.gerenciador de cluster("Administrador","senha"); Lista baldes = cm.getBuckets(); Afirmar.assertNotNull(baldes); Afirmar.assertTrue(baldes.tamanho() == 3); } } |
Como você pode ver, isso é muito simples e permite que qualquer pessoa execute testes no Couchbase, desde que tenha o Docker instalado.
Conclusão
Diga-nos nos comentários abaixo se você gostou e se deseja que forneçamos configurações adicionais e atalhos para configurar seu cluster do Couchbase durante os testes.