{"id":2499,"date":"2017-01-19T17:00:00","date_gmt":"2017-01-19T17:00:00","guid":{"rendered":"https:\/\/www.couchbase.com\/blog\/?p=2499"},"modified":"2025-06-13T23:03:37","modified_gmt":"2025-06-14T06:03:37","slug":"integration-tests-couchbase-application","status":"publish","type":"post","link":"https:\/\/www.couchbase.com\/blog\/pt\/integration-tests-couchbase-application\/","title":{"rendered":"Testes de integra\u00e7\u00e3o e seu aplicativo Couchbase"},"content":{"rendered":"<p style=\"box-sizing: border-box;padding-top: 0.66001rem;margin-bottom: 1.33999rem;color: #373d49;font-family: Georgia, Cambria, serif;font-size: 14px;text-align: start\">Os testes de integra\u00e7\u00e3o adequados exigem uma configura\u00e7\u00e3o completa de sua infraestrutura. E isso pode ser um pouco dif\u00edcil de colocar em pr\u00e1tica \u00e0s vezes, especialmente quando voc\u00ea precisa dar suporte ao seu lapop de desenvolvedor, ao seu n\u00f3 de CI ou a qualquer outra m\u00e1quina em que precise executar os testes. Uma boa solu\u00e7\u00e3o para corrigir isso \u00e9 usar cont\u00eaineres como um tempo de execu\u00e7\u00e3o comum. O Docker funciona da mesma forma em todas as m\u00e1quinas. Portanto, desde que esteja instalado em seu laptop de desenvolvedor e em seu n\u00f3 de CI, n\u00e3o h\u00e1 problema :) Ent\u00e3o, mais uma vez, mostrarei a voc\u00ea como fazer isso usando <a href=\"https:\/\/www.couchbase.com\/blog\/pt\/create-couchbase-docker-images-testcontainers\/\">Cont\u00eaineres de teste<\/a>.<\/p>\n<h2 style=\"box-sizing: border-box\">O que queremos testar<\/h2>\n<p style=\"box-sizing: border-box;padding-top: 0.66001rem;margin-bottom: 1.33999rem;color: #373d49;font-family: Georgia, Cambria, serif;font-size: 14px;text-align: start\">H\u00e1 um \u00f3timo aplicativo de amostra para testar o Couchbase com o Travel Sample. O backend Java est\u00e1 localizado aqui\u00a0<a style=\"box-sizing: border-box;background-image: initial;background-position: 0px 0px;background-size: initial;background-repeat: initial;background-attachment: initial;cursor: pointer;color: #a0aabf\" href=\"https:\/\/github.com\/couchbaselabs\/try-cb-java\/\">https:\/\/github.com\/couchbaselabs\/try-cb-java\/<\/a>\u00a0e o front-end aqui\u00a0<a style=\"box-sizing: border-box;background-image: initial;background-position: 0px 0px;background-size: initial;background-repeat: initial;background-attachment: initial;cursor: pointer;color: #a0aabf\" href=\"https:\/\/github.com\/couchbaselabs\/try-cb-frontend\/\">https:\/\/github.com\/couchbaselabs\/try-cb-frontend\/<\/a>. Ele permitir\u00e1 que voc\u00ea entenda v\u00e1rios recursos, como N1QL, FTS ou subdocumentos. \u00c9 um \u00f3timo lugar para come\u00e7ar a aprender o Couchbase. E, embora seja um \u00f3timo lugar para aprender, ainda n\u00e3o temos nenhum teste de integra\u00e7\u00e3o para ele. Portanto, iniciei um novo projeto para remediar isso. Ele est\u00e1 dispon\u00edvel em\u00a0<a style=\"box-sizing: border-box;background-image: initial;background-position: 0px 0px;background-size: initial;background-repeat: initial;background-attachment: initial;cursor: pointer;color: #a0aabf\" href=\"https:\/\/github.com\/couchbaselabs\/try-cb-integration-test\">https:\/\/github.com\/couchbaselabs\/try-cb-integration-test<\/a>. \u00c9 sobre isso que escreverei hoje.<\/p>\n<h2 style=\"box-sizing: border-box\">Configura\u00e7\u00e3o de teste<\/h2>\n<p style=\"box-sizing: border-box;padding-top: 0.66001rem;margin-bottom: 1.33999rem;color: #373d49;font-family: Georgia, Cambria, serif;font-size: 14px;text-align: start\">Para testar o frontend, usarei o Selenium. Ele permite que voc\u00ea especifique basicamente onde deseja clicar em uma p\u00e1gina, digitar teclas e verificar o conte\u00fado de uma p\u00e1gina. Assim, voc\u00ea pode dizer ao driver do Selenium para carregar uma p\u00e1gina em um determinado URL, verificar se ela foi carregada corretamente, clicar em um link e verificar se a nova p\u00e1gina o levou ao local desejado. Isso \u00e9 tudo o que faremos hoje em termos de testes. O importante aqui \u00e9 como configurar isso. Primeiro, d\u00ea uma olhada no meu c\u00f3digo de teste:<\/p>\n<pre style=\"box-sizing: border-box;margin-bottom: 1.33999rem;color: #333333;background-image: linear-gradient(#ffffff 0px, #ffffff 0.75rem, #f5f7fa 0.75rem, #f5f7fa 2.75rem, #ffffff 2.75rem, #ffffff 4rem);background-position: 0% 0%;background-size: 100% 4rem;background-repeat: initial;background-attachment: initial;border: 1px solid #d3daea;border-radius: 4px;overflow: auto;font-size: 14px;padding: 0.66001rem 9.5px 9.5px;line-height: 2rem;text-align: start\"><code style=\"box-sizing: border-box;color: inherit;background-color: transparent;border-radius: 0px;padding: 0px;font-size: inherit\">    @Test\r\n    public void testTab() throws InterruptedException {\r\n        RemoteWebDriver driver = chrome.getWebDriver();\r\n        driver.get(\"https:\/\/trycbfront\");\r\n        WebElement usernameField = (new WebDriverWait(driver, 10))\r\n                .until(ExpectedConditions.presenceOfElementLocated(By.name(\"username\")));\r\n\r\n        \/\/ SIGNUP\r\n        usernameField.sendKeys(\"ld@cb.com\");\r\n        driver.findElementByName(\"password\").sendKeys(\"password\");\r\n        driver.findElementByTagName(\"button\").click();\r\n\r\n        \/\/ Verify SIGNUP\r\n        String textElement = (new WebDriverWait(driver, 10))\r\n                .until(ExpectedConditions.presenceOfElementLocated(By.xpath((\"\/html\/body\/app-root\/div\/div[2]\/div[1]\/div\/div[2]\/app-home\/div[1]\/div\/div[1]\/div[1]\/div\/div\/div[2]\/div\/small\/strong\")))).getText();\r\n        Assert.assertEquals(\"Find a Flight\", textElement);\r\n\r\n        \/\/ Test Cart Page\r\n        navigateToCart(driver);\r\n        textElement = (new WebDriverWait(driver, 10))\r\n                .until(ExpectedConditions.presenceOfElementLocated(By.xpath((\"\/html\/body\/app-root\/div\/div[2]\/div[1]\/div\/div[2]\/app-cart\/div[1]\/button\")))).getText();\r\n        Assert.assertEquals(\"Clear Cart\", textElement);\r\n    }\r\n\r\n    public void navigateToCart(RemoteWebDriver driver) {\r\n        driver.findElementByXPath(\"\/html\/body\/app-root\/div\/div[2]\/div[1]\/div\/div[1]\/div\/app-navbar\/div\/div[3]\/div\/a[2]\").click();\r\n}\r\n<\/code><\/pre>\n<p style=\"box-sizing: border-box;padding-top: 0.66001rem;margin-bottom: 1.33999rem;color: #373d49;font-family: Georgia, Cambria, serif;font-size: 14px;text-align: start\">Se estiver familiarizado com o Selenium, seus olhos provavelmente est\u00e3o doendo ao olhar para esses valores XPath grandes e longos. Na maioria dos aplicativos, isso ser\u00e1 substitu\u00eddo pelo id do elemento DOM que voc\u00ea est\u00e1 procurando. Agora que j\u00e1 tiramos isso do caminho, d\u00ea uma olhada na primeira linha:\u00a0<code style=\"box-sizing: border-box;color: #c7254e;background-color: #f9f2f4;border-radius: 4px;padding: 2px 4px\">RemoteWebDriver driver = chrome.getWebDriver();<\/code><\/p>\n<p style=\"box-sizing: border-box;padding-top: 0.66001rem;margin-bottom: 1.33999rem;color: #373d49;font-family: Georgia, Cambria, serif;font-size: 14px;text-align: start\">O driver do Selenium foi fornecido por um objeto chrome. Esse objeto representa um cont\u00eainer que executa o selenium. Isso \u00e9 poss\u00edvel gra\u00e7as ao TestContainers e sua integra\u00e7\u00e3o com o Selenium. Mas, como se trata de um cont\u00eainer, para acessar outra coisa, ou voc\u00ea a constr\u00f3i no cont\u00eainer ou precisa se vincular a outro cont\u00eainer. \u00c9 claro que foi isso que foi feito. Para executar o Travel Sample, voc\u00ea precisa de tr\u00eas coisas. Voc\u00ea precisa de um servidor Couchbase, um backend de amostra de viagem e um frontend de amostra de viagem, de prefer\u00eancia todos em seu pr\u00f3prio cont\u00eainer. Felizmente, temos uma imagem do Docker para cada um deles. Consulte a imagem\u00a0<a style=\"box-sizing: border-box;background-image: initial;background-position: 0px 0px;background-size: initial;background-repeat: initial;background-attachment: initial;cursor: pointer;color: #a0aabf\" href=\"https:\/\/github.com\/couchbaselabs\/try-cb-integration-test\/blob\/master\/README.md\">Leia-me do projeto<\/a>\u00a0se voc\u00ea quiser constru\u00ed-los.<\/p>\n<p style=\"box-sizing: border-box;padding-top: 0.66001rem;margin-bottom: 1.33999rem;color: #373d49;font-family: Georgia, Cambria, serif;font-size: 14px;text-align: start\">Para que tudo isso funcione, voc\u00ea precisa inici\u00e1-los em uma ordem espec\u00edfica. Primeiro, inicie o Couchabse porque ele \u00e9 necess\u00e1rio para o backend. Em seguida, inicie o backend porque ele \u00e9 necess\u00e1rio para o frontend, e depois o frontend porque ele \u00e9 necess\u00e1rio para a imagem do Selenium que cont\u00e9m o selenium e um navegador. Portanto, precisamos garantir que cada cont\u00eainer seja iniciado e esteja pronto antes de iniciar o outro. Digo pronto porque, em alguns casos, pode ser diferente de iniciado. Quando voc\u00ea inicia um cont\u00eainer do Couchbase, precisa configur\u00e1-lo. Quanto ao aplicativo Spring Boot para o backend, ele leva algum tempo para estar pronto para aceitar conex\u00f5es. Felizmente, o TestContainers pensou nisso e fornece um mecanismo de espera interessante.<\/p>\n<p style=\"box-sizing: border-box;padding-top: 0.66001rem;margin-bottom: 1.33999rem;color: #373d49;font-family: Georgia, Cambria, serif;font-size: 14px;text-align: start\">Vamos come\u00e7ar com o cont\u00eainer do Couchbase:<\/p>\n<pre style=\"box-sizing: border-box;margin-bottom: 1.33999rem;color: #333333;background-image: linear-gradient(#ffffff 0px, #ffffff 0.75rem, #f5f7fa 0.75rem, #f5f7fa 2.75rem, #ffffff 2.75rem, #ffffff 4rem);background-position: 0% 0%;background-size: 100% 4rem;background-repeat: initial;background-attachment: initial;border: 1px solid #d3daea;border-radius: 4px;overflow: auto;font-size: 14px;padding: 0.66001rem 9.5px 9.5px;line-height: 2rem;text-align: start\"><code style=\"box-sizing: border-box;color: inherit;background-color: transparent;border-radius: 0px;padding: 0px;font-size: inherit\">    public static final String clusterUser = \"Administrator\";\r\n    public static final String clusterPassword = \"password\";\r\n\r\n    public static CouchbaseContainer couchbaseContainer = new CouchbaseContainer()\r\n            .withFTS(true)\r\n            .withIndex(true)\r\n            .withQuery(true)\r\n            .withTravelSample(true)\r\n            .withClusterUsername(clusterUser)\r\n            .withClusterPassword(clusterPassword)\r\n            .withNewBucket(DefaultBucketSettings.builder().enableFlush(true).name(\"default\").quota(100).replicas(0).type(BucketType.COUCHBASE).build());\r\n\r\n    static {\r\n        couchbaseContainer.start();\r\n    }\r\n<\/code><\/pre>\n<p style=\"box-sizing: border-box;padding-top: 0.66001rem;margin-bottom: 1.33999rem;color: #373d49;font-family: Georgia, Cambria, serif;font-size: 14px;text-align: start\">Voc\u00ea pode ver que ele pode ser facilmente configurado com essa API fluente. Aqui, estou configurando-o de modo que ele tenha os servi\u00e7os FTS, Index e Query ativados, que a amostra de viagem seja pr\u00e9-carregada, com meu pr\u00f3prio nome de usu\u00e1rio e senha e tamb\u00e9m com um bucket padr\u00e3o.<\/p>\n<p style=\"box-sizing: border-box;padding-top: 0.66001rem;margin-bottom: 1.33999rem;color: #373d49;font-family: Georgia, Cambria, serif;font-size: 14px;text-align: start\">Normalmente, com TestContainers, voc\u00ea teria uma @ClassRule em seus testes. Isso iniciaria o cont\u00eainer automaticamente. Mas isso iniciaria tudo com uma @ClassRule ao mesmo tempo. Infelizmente, n\u00e3o podemos fazer isso porque, conforme explicado anteriormente, os cont\u00eaineres precisam estar prontos antes de iniciar o pr\u00f3ximo. Por isso, podemos nos livrar disso adicionando um bloco de c\u00f3digo est\u00e1tico. Todos eles s\u00e3o executados em ordem. Portanto, se iniciarmos nosso cont\u00eainer em um bloco de in\u00edcio, podemos garantir que ele esteja pronto antes do pr\u00f3ximo bloco est\u00e1tico. A estrat\u00e9gia CouchbaseContainer Waiting faz pesquisas no status da API REST do Couchbase e verifica se o estado do n\u00f3 est\u00e1 saud\u00e1vel para consider\u00e1-lo pronto e parar de esperar. Se quiser obter mais detalhes sobre o CouchbaseContainer, consulte o c\u00f3digo\u00a0<a style=\"box-sizing: border-box;background-image: initial;background-position: 0px 0px;background-size: initial;background-repeat: initial;background-attachment: initial;cursor: pointer;color: #a0aabf\" href=\"https:\/\/github.com\/couchbaselabs\/try-cb-integration-test\/blob\/master\/src\/test\/java\/trycb\/testcontainers\/CouchbaseContainer.java\">aqui<\/a>\u00a0e tamb\u00e9m no <a href=\"\/blog\/pt\/create-couchbase-docker-images-testcontainers\/\">anterior<\/a> <a href=\"\/blog\/pt\/unit-integration-tests-couchbase-docker-container\/\">blog<\/a> <a href=\"\/blog\/pt\/configure-official-couchbase-docker-test\/\">postagens<\/a> sobre o Couchbase e o TestContainers.<\/p>\n<p style=\"box-sizing: border-box;padding-top: 0.66001rem;margin-bottom: 1.33999rem;color: #373d49;font-family: Georgia, Cambria, serif;font-size: 14px;text-align: start\">A pr\u00f3xima etapa \u00e9 iniciar o backend Java, j\u00e1 que o Couchbase est\u00e1 pronto:<\/p>\n<pre style=\"box-sizing: border-box;margin-bottom: 1.33999rem;color: #333333;background-image: linear-gradient(#ffffff 0px, #ffffff 0.75rem, #f5f7fa 0.75rem, #f5f7fa 2.75rem, #ffffff 2.75rem, #ffffff 4rem);background-position: 0% 0%;background-size: 100% 4rem;background-repeat: initial;background-attachment: initial;border: 1px solid #d3daea;border-radius: 4px;overflow: auto;font-size: 14px;padding: 0.66001rem 9.5px 9.5px;line-height: 2rem;text-align: start\"><code style=\"box-sizing: border-box;color: inherit;background-color: transparent;border-radius: 0px;padding: 0px;font-size: inherit\">\r\n    public static GenericContainer trycbBack = new LinkedContainer(\"trycb\/java:latest\")\r\n            .withLinkToContainer(couchbaseContainer, \"couchbase\")\r\n            .withExposedPorts(8080)\r\n            .withCommand(\"-Dspring.couchbase.bootstrap-hosts=\"+couchbaseContainer.getContainerIpAddress())\r\n            .waitingFor(new HttpWaitStrategy().forPath(\"\/wut\").forStatusCode(404));\r\n\r\n    static {\r\n        trycbBack.start();\r\n    }\r\n<\/code><\/pre>\n<p style=\"box-sizing: border-box;padding-top: 0.66001rem;margin-bottom: 1.33999rem;color: #373d49;font-family: Georgia, Cambria, serif;font-size: 14px;text-align: start\">Algumas coisas interessantes a serem observadas aqui. Novamente, a presen\u00e7a de um bloco est\u00e1tico que inicia o cont\u00eainer pelos mesmos motivos mencionados anteriormente. Voc\u00ea pode ver que estamos expondo a porta 8080 aqui. N\u00e3o h\u00e1 necessidade de fazer isso com o CouchbaseContainer, pois ele \u00e9 uma classe espec\u00edfica dedicada \u00e0 imagem padr\u00e3o do Couchbase. Dessa forma, ele tem uma configura\u00e7\u00e3o padr\u00e3o para portas, bem como uma estrat\u00e9gia de espera predefinida. Para o backend, usamos um GenericContainer, portanto, precisamos especific\u00e1-los. A estrat\u00e9gia de espera aguardar\u00e1 at\u00e9 obter um 404 para o caminho configurado. Se ela responder algo, basicamente o servidor est\u00e1 ativo e o Frontend pode us\u00e1-lo. Voc\u00ea tamb\u00e9m ver\u00e1 que o par\u00e2metro Java que define o endere\u00e7o do Couchbase \u00e9 fornecido e o valor \u00e9 obtido da inst\u00e2ncia do CouchbaseContainer.<\/p>\n<p style=\"box-sizing: border-box;padding-top: 0.66001rem;margin-bottom: 1.33999rem;color: #373d49;font-family: Georgia, Cambria, serif;font-size: 14px;text-align: start\">A \u00faltima informa\u00e7\u00e3o muito \u00fatil \u00e9 a chamada para o m\u00e9todo withLinkToContainer. Ele n\u00e3o faz parte da API GenericContainer, n\u00e3o sei bem por qu\u00ea. Tive que estend\u00ea-lo:<\/p>\n<pre style=\"box-sizing: border-box;margin-bottom: 1.33999rem;color: #333333;background-image: linear-gradient(#ffffff 0px, #ffffff 0.75rem, #f5f7fa 0.75rem, #f5f7fa 2.75rem, #ffffff 2.75rem, #ffffff 4rem);background-position: 0% 0%;background-size: 100% 4rem;background-repeat: initial;background-attachment: initial;border: 1px solid #d3daea;border-radius: 4px;overflow: auto;font-size: 14px;padding: 0.66001rem 9.5px 9.5px;line-height: 2rem;text-align: start\"><code style=\"box-sizing: border-box;color: inherit;background-color: transparent;border-radius: 0px;padding: 0px;font-size: inherit\">public class LinkedContainer&gt; extends GenericContainer {\r\n\r\n    public LinkedContainer(String name) {\r\n        super(name);\r\n    }\r\n\r\n    public SELF withLinkToContainer(LinkableContainer otherContainer, String alias) {\r\n        addLink(otherContainer, alias);\r\n        return self();\r\n}\r\n<\/code><\/pre>\n<p style=\"box-sizing: border-box;padding-top: 0.66001rem;margin-bottom: 1.33999rem;color: #373d49;font-family: Georgia, Cambria, serif;font-size: 14px;text-align: start\">Tudo o que ele faz \u00e9 garantir que haver\u00e1 um link do Docker entre o CouchbaseContainer e o backemd. Dessa forma, \u00e9 poss\u00edvel garantir que os cont\u00eaineres possam se comunicar uns com os outros.<\/p>\n<p style=\"box-sizing: border-box;padding-top: 0.66001rem;margin-bottom: 1.33999rem;color: #373d49;font-family: Georgia, Cambria, serif;font-size: 14px;text-align: start\">Agora que o Couchbase e o backend est\u00e3o prontos, podemos iniciar o frontend. Trata-se de um aplicativo Angular2 dentro do\u00a0<a style=\"box-sizing: border-box;background-image: initial;background-position: 0px 0px;background-size: initial;background-repeat: initial;background-attachment: initial;cursor: pointer;color: #a0aabf\" href=\"https:\/\/hub.docker.com\/_\/nginx\/\">cont\u00eainer padr\u00e3o do nginx<\/a>. Ele precisa acessar o backend, portanto, precisamos adicionar um link ao cont\u00eainer anterior. Algo que voc\u00ea precisa garantir \u00e9 a possibilidade de alterar a URL do servidor de backend dinamicamente em seu aplicativo Angular. Isso pode ser feito facilmente com Environments. Essa imagem de teste foi criada com os ambientes de teste e, portanto, procure o nome de host trycbBack, que \u00e9 o nome fornecido no m\u00e9todo withLinkToContainer. E, novamente, iniciamos o cont\u00eainer em um bloco est\u00e1tico.<\/p>\n<pre style=\"box-sizing: border-box;margin-bottom: 1.33999rem;color: #333333;background-image: linear-gradient(#ffffff 0px, #ffffff 0.75rem, #f5f7fa 0.75rem, #f5f7fa 2.75rem, #ffffff 2.75rem, #ffffff 4rem);background-position: 0% 0%;background-size: 100% 4rem;background-repeat: initial;background-attachment: initial;border: 1px solid #d3daea;border-radius: 4px;overflow: auto;font-size: 14px;padding: 0.66001rem 9.5px 9.5px;line-height: 2rem;text-align: start\"><code style=\"box-sizing: border-box;color: inherit;background-color: transparent;border-radius: 0px;padding: 0px;font-size: inherit\">    public static GenericContainer trycbFront = new LinkedContainer(\"trycb\/front:latest\").withLinkToContainer(trycbBack, \"trycbBack\").withExposedPorts(80);\r\n\r\n    static {\r\n        trycbFront.start();\r\n    }\r\n<\/code><\/pre>\n<p style=\"box-sizing: border-box;padding-top: 0.66001rem;margin-bottom: 1.33999rem;color: #373d49;font-family: Georgia, Cambria, serif;font-size: 14px;text-align: start\">Quando todos esses cont\u00eaineres estiverem em funcionamento, podemos iniciar o cont\u00eainer do Selenium. Esse cont\u00eainer faz parte do projeto TestContainers e lhe d\u00e1 acesso a v\u00e1rios recursos. Voc\u00ea pode decidir se quer usar o Chrome ou o Firefox e se quer que o teste seja gravado. No nosso caso, \u00e9 um driver do Chrome e o teste ser\u00e1 registrado e armazenado no arquivo de destino. Voc\u00ea tamb\u00e9m notar\u00e1 que adicionamos um link para o Frontend e o Backend. O frontend \u00e9 acessado no navegador Chrome dentro do cont\u00eainer, e o aplicativo angular acessar\u00e1 o backend a partir dele. Portanto, \u00e9 preciso garantir que ele tamb\u00e9m seja acess\u00edvel a partir do cont\u00eainer do Selenium e que sua configura\u00e7\u00e3o CORS permita a comunica\u00e7\u00e3o.<\/p>\n<pre style=\"box-sizing: border-box;margin-bottom: 1.33999rem;color: #333333;background-image: linear-gradient(#ffffff 0px, #ffffff 0.75rem, #f5f7fa 0.75rem, #f5f7fa 2.75rem, #ffffff 2.75rem, #ffffff 4rem);background-position: 0% 0%;background-size: 100% 4rem;background-repeat: initial;background-attachment: initial;border: 1px solid #d3daea;border-radius: 4px;overflow: auto;font-size: 14px;padding: 0.66001rem 9.5px 9.5px;line-height: 2rem;text-align: start\"><code style=\"box-sizing: border-box;color: inherit;background-color: transparent;border-radius: 0px;padding: 0px;font-size: inherit\">    @ClassRule\r\n    public static BrowserWebDriverContainer chrome = new BrowserWebDriverContainer()\r\n            .withLinkToContainer(trycbFront, \"trycbfront\")\r\n            .withLinkToContainer(trycbBack, \"trycbback\")\r\n            .withDesiredCapabilities(DesiredCapabilities.chrome())\r\n            .withRecordingMode(BrowserWebDriverContainer.VncRecordingMode.RECORD_ALL, new File(\"target\"));\r\n<\/code><\/pre>\n<p style=\"box-sizing: border-box;padding-top: 0.66001rem;margin-bottom: 1.33999rem;color: #373d49;font-family: Georgia, Cambria, serif;font-size: 14px;text-align: start\">Agora voc\u00ea tem tudo configurado e pode executar o teste apresentado no in\u00edcio deste post. Espero que isso tenha sido \u00fatil e que agora voc\u00ea use o TestContainers para facilitar o teste de integra\u00e7\u00e3o de aplicativos baseados no Couchbase.<\/p>","protected":false},"excerpt":{"rendered":"<p>Proper integration tests require a complete setup of your infrastructure. And this can be a litle hard to put in place sometimes, especially when you need to support your developer lapop, your CI node, or any other machine where you [&hellip;]<\/p>","protected":false},"author":49,"featured_media":13873,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"inline_featured_image":false,"footnotes":""},"categories":[1815],"tags":[1877],"ppma_author":[9023],"class_list":["post-2499","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-best-practices-and-tutorials","tag-testing"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v26.0 (Yoast SEO v26.0) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Integration Tests and your Couchbase Application - The Couchbase Blog<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.couchbase.com\/blog\/pt\/integration-tests-couchbase-application\/\" \/>\n<meta property=\"og:locale\" content=\"pt_BR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Integration Tests and your Couchbase Application\" \/>\n<meta property=\"og:description\" content=\"Proper integration tests require a complete setup of your infrastructure. And this can be a litle hard to put in place sometimes, especially when you need to support your developer lapop, your CI node, or any other machine where you [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.couchbase.com\/blog\/pt\/integration-tests-couchbase-application\/\" \/>\n<meta property=\"og:site_name\" content=\"The Couchbase Blog\" \/>\n<meta property=\"article:published_time\" content=\"2017-01-19T17:00:00+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-06-14T06:03:37+00:00\" \/>\n<meta name=\"author\" content=\"Laurent Doguin\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@ldoguin\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"unstructured.io\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"6 minutos\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/integration-tests-couchbase-application\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/integration-tests-couchbase-application\/\"},\"author\":{\"name\":\"Laurent Doguin\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/c0aa9b8f1ed51b7a9e2f7cb755994a5e\"},\"headline\":\"Integration Tests and your Couchbase Application\",\"datePublished\":\"2017-01-19T17:00:00+00:00\",\"dateModified\":\"2025-06-14T06:03:37+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/integration-tests-couchbase-application\/\"},\"wordCount\":1291,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/integration-tests-couchbase-application\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png\",\"keywords\":[\"testing\"],\"articleSection\":[\"Best Practices and Tutorials\"],\"inLanguage\":\"pt-BR\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/integration-tests-couchbase-application\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/integration-tests-couchbase-application\/\",\"url\":\"https:\/\/www.couchbase.com\/blog\/integration-tests-couchbase-application\/\",\"name\":\"Integration Tests and your Couchbase Application - The Couchbase Blog\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/integration-tests-couchbase-application\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/integration-tests-couchbase-application\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png\",\"datePublished\":\"2017-01-19T17:00:00+00:00\",\"dateModified\":\"2025-06-14T06:03:37+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/integration-tests-couchbase-application\/#breadcrumb\"},\"inLanguage\":\"pt-BR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/integration-tests-couchbase-application\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/integration-tests-couchbase-application\/#primaryimage\",\"url\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png\",\"contentUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png\",\"width\":1800,\"height\":630},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/integration-tests-couchbase-application\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.couchbase.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Integration Tests and your Couchbase Application\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#website\",\"url\":\"https:\/\/www.couchbase.com\/blog\/\",\"name\":\"The Couchbase Blog\",\"description\":\"Couchbase, the NoSQL Database\",\"publisher\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.couchbase.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"pt-BR\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\",\"name\":\"The Couchbase Blog\",\"url\":\"https:\/\/www.couchbase.com\/blog\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png\",\"contentUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png\",\"width\":218,\"height\":34,\"caption\":\"The Couchbase Blog\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/\"}},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/c0aa9b8f1ed51b7a9e2f7cb755994a5e\",\"name\":\"Laurent Doguin\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/12929ce99397769f362b7a90d6b85071\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/b8c466908092b46634af916b6921f30187a051e4367ded7ac9b1a3f2c5692fd2?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/b8c466908092b46634af916b6921f30187a051e4367ded7ac9b1a3f2c5692fd2?s=96&d=mm&r=g\",\"caption\":\"Laurent Doguin\"},\"description\":\"Laurent is a nerdy metal head who lives in Paris. He mostly writes code in Java and structured text in AsciiDoc, and often talks about data, reactive programming and other buzzwordy stuff. He is also a former Developer Advocate for Clever Cloud and Nuxeo where he devoted his time and expertise to helping those communities grow bigger and stronger. He now runs Developer Relations at Couchbase.\",\"sameAs\":[\"https:\/\/x.com\/ldoguin\"],\"honorificPrefix\":\"Mr\",\"birthDate\":\"1985-06-07\",\"gender\":\"male\",\"award\":[\"Devoxx Champion\",\"Couchbase Legend\"],\"knowsAbout\":[\"Java\"],\"knowsLanguage\":[\"English\",\"French\"],\"jobTitle\":\"Director Developer Relation & Strategy\",\"worksFor\":\"Couchbase\",\"url\":\"https:\/\/www.couchbase.com\/blog\/pt\/author\/laurent-doguin\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Integration Tests and your Couchbase Application - The Couchbase Blog","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.couchbase.com\/blog\/pt\/integration-tests-couchbase-application\/","og_locale":"pt_BR","og_type":"article","og_title":"Integration Tests and your Couchbase Application","og_description":"Proper integration tests require a complete setup of your infrastructure. And this can be a litle hard to put in place sometimes, especially when you need to support your developer lapop, your CI node, or any other machine where you [&hellip;]","og_url":"https:\/\/www.couchbase.com\/blog\/pt\/integration-tests-couchbase-application\/","og_site_name":"The Couchbase Blog","article_published_time":"2017-01-19T17:00:00+00:00","article_modified_time":"2025-06-14T06:03:37+00:00","author":"Laurent Doguin","twitter_card":"summary_large_image","twitter_creator":"@ldoguin","twitter_misc":{"Written by":"unstructured.io","Est. reading time":"6 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.couchbase.com\/blog\/integration-tests-couchbase-application\/#article","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/integration-tests-couchbase-application\/"},"author":{"name":"Laurent Doguin","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/c0aa9b8f1ed51b7a9e2f7cb755994a5e"},"headline":"Integration Tests and your Couchbase Application","datePublished":"2017-01-19T17:00:00+00:00","dateModified":"2025-06-14T06:03:37+00:00","mainEntityOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/integration-tests-couchbase-application\/"},"wordCount":1291,"commentCount":0,"publisher":{"@id":"https:\/\/www.couchbase.com\/blog\/#organization"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/integration-tests-couchbase-application\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png","keywords":["testing"],"articleSection":["Best Practices and Tutorials"],"inLanguage":"pt-BR","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.couchbase.com\/blog\/integration-tests-couchbase-application\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.couchbase.com\/blog\/integration-tests-couchbase-application\/","url":"https:\/\/www.couchbase.com\/blog\/integration-tests-couchbase-application\/","name":"Integration Tests and your Couchbase Application - The Couchbase Blog","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/integration-tests-couchbase-application\/#primaryimage"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/integration-tests-couchbase-application\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png","datePublished":"2017-01-19T17:00:00+00:00","dateModified":"2025-06-14T06:03:37+00:00","breadcrumb":{"@id":"https:\/\/www.couchbase.com\/blog\/integration-tests-couchbase-application\/#breadcrumb"},"inLanguage":"pt-BR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.couchbase.com\/blog\/integration-tests-couchbase-application\/"]}]},{"@type":"ImageObject","inLanguage":"pt-BR","@id":"https:\/\/www.couchbase.com\/blog\/integration-tests-couchbase-application\/#primaryimage","url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png","contentUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png","width":1800,"height":630},{"@type":"BreadcrumbList","@id":"https:\/\/www.couchbase.com\/blog\/integration-tests-couchbase-application\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.couchbase.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Integration Tests and your Couchbase Application"}]},{"@type":"WebSite","@id":"https:\/\/www.couchbase.com\/blog\/#website","url":"https:\/\/www.couchbase.com\/blog\/","name":"Blog do Couchbase","description":"Couchbase, o banco de dados NoSQL","publisher":{"@id":"https:\/\/www.couchbase.com\/blog\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.couchbase.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"pt-BR"},{"@type":"Organization","@id":"https:\/\/www.couchbase.com\/blog\/#organization","name":"Blog do Couchbase","url":"https:\/\/www.couchbase.com\/blog\/","logo":{"@type":"ImageObject","inLanguage":"pt-BR","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/","url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png","contentUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png","width":218,"height":34,"caption":"The Couchbase Blog"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/"}},{"@type":"Person","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/c0aa9b8f1ed51b7a9e2f7cb755994a5e","name":"Laurent Doguin","image":{"@type":"ImageObject","inLanguage":"pt-BR","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/12929ce99397769f362b7a90d6b85071","url":"https:\/\/secure.gravatar.com\/avatar\/b8c466908092b46634af916b6921f30187a051e4367ded7ac9b1a3f2c5692fd2?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/b8c466908092b46634af916b6921f30187a051e4367ded7ac9b1a3f2c5692fd2?s=96&d=mm&r=g","caption":"Laurent Doguin"},"description":"Laurent \u00e9 um nerd metaleiro que mora em Paris. Em sua maior parte, ele escreve c\u00f3digo em Java e texto estruturado em AsciiDoc, e frequentemente fala sobre dados, programa\u00e7\u00e3o reativa e outras coisas que est\u00e3o na moda. Ele tamb\u00e9m foi Developer Advocate do Clever Cloud e do Nuxeo, onde dedicou seu tempo e experi\u00eancia para ajudar essas comunidades a crescerem e se fortalecerem. Atualmente, ele dirige as Rela\u00e7\u00f5es com Desenvolvedores na Couchbase.","sameAs":["https:\/\/x.com\/ldoguin"],"honorificPrefix":"Mr","birthDate":"1985-06-07","gender":"male","award":["Devoxx Champion","Couchbase Legend"],"knowsAbout":["Java"],"knowsLanguage":["English","French"],"jobTitle":"Director Developer Relation & Strategy","worksFor":"Couchbase","url":"https:\/\/www.couchbase.com\/blog\/pt\/author\/laurent-doguin\/"}]}},"authors":[{"term_id":9023,"user_id":49,"is_guest":0,"slug":"laurent-doguin","display_name":"Laurent Doguin","avatar_url":"https:\/\/secure.gravatar.com\/avatar\/b8c466908092b46634af916b6921f30187a051e4367ded7ac9b1a3f2c5692fd2?s=96&d=mm&r=g","author_category":"","last_name":"Doguin","first_name":"Laurent","job_title":"","user_url":"","description":"Laurent \u00e9 um nerd metaleiro que mora em Paris. Em sua maior parte, ele escreve c\u00f3digo em Java e texto estruturado em AsciiDoc, e frequentemente fala sobre dados, programa\u00e7\u00e3o reativa e outras coisas que est\u00e3o na moda. Ele tamb\u00e9m foi Developer Advocate do Clever Cloud e do Nuxeo, onde dedicou seu tempo e experi\u00eancia para ajudar essas comunidades a crescerem e se fortalecerem. Atualmente, ele dirige as Rela\u00e7\u00f5es com Desenvolvedores na Couchbase."}],"_links":{"self":[{"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/posts\/2499","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/users\/49"}],"replies":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/comments?post=2499"}],"version-history":[{"count":0,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/posts\/2499\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/media\/13873"}],"wp:attachment":[{"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/media?parent=2499"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/categories?post=2499"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/tags?post=2499"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/ppma_author?post=2499"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}