{"id":3631,"date":"2022-07-26T11:02:35","date_gmt":"2022-07-26T11:02:35","guid":{"rendered":"http:\/\/the-codest.localhost\/blog\/test-containers-how-to-make-tests-easier\/"},"modified":"2026-03-11T06:00:15","modified_gmt":"2026-03-11T06:00:15","slug":"contentores-de-teste-como-tornar-os-testes-mais-faceis","status":"publish","type":"post","link":"https:\/\/thecodest.co\/pt\/blog\/test-containers-how-to-make-tests-easier\/","title":{"rendered":"Contentores de teste - Como tornar os testes mais f\u00e1ceis?"},"content":{"rendered":"<p>O desenvolvimento moderno de aplica\u00e7\u00f5es baseia-se numa regra simples:<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p><b>Utilizar a composi\u00e7\u00e3o<\/b><\/p>\n<\/blockquote>\n\n\n\n<p>Compomos classes, fun\u00e7\u00f5es e servi\u00e7os em pe\u00e7as maiores de software. Este \u00faltimo elemento \u00e9 a base do <a href=\"https:\/\/thecodest.co\/pt\/dictionary\/microservices\/\">microsservi\u00e7os<\/a> e <a href=\"https:\/\/thecodest.co\/pt\/blog\/the-power-of-hexagonal-architecture\/\">arquitetura hexagonal<\/a>. Gostar\u00edamos de utilizar as solu\u00e7\u00f5es existentes, integr\u00e1-las no nosso software e passar diretamente para o <a href=\"https:\/\/thecodest.co\/pt\/dictionary\/what-is-the-size-of-your-potential-reachable-market\/\">mercado<\/a>.<\/p>\n\n\n\n<p>Pretende gerir o registo da conta e armazenar o utilizador <a href=\"https:\/\/thecodest.co\/pt\/blog\/app-data-collection-security-risks-value-and-types-explored\/\">dados<\/a>? Pode escolher um dos servi\u00e7os OAuth. Talvez a sua aplica\u00e7\u00e3o ofere\u00e7a algum tipo de subscri\u00e7\u00e3o ou pagamento? Existem muitos servi\u00e7os que o podem ajudar a resolver este problema. Necessita de algumas an\u00e1lises no seu s\u00edtio Web, mas n\u00e3o compreende o que \u00e9 que est\u00e1 a fazer? <a href=\"https:\/\/thecodest.co\/pt\/blog\/cyber-security-dilemmas-data-leaks\/\">RGPD<\/a>? N\u00e3o hesite em optar por uma das solu\u00e7\u00f5es prontas a usar.<\/p>\n\n\n\n<p>Algo que torna o desenvolvimento t\u00e3o f\u00e1cil do ponto de vista empresarial pode dar-nos uma dor de cabe\u00e7a - no momento em que precisamos de escrever um simples teste.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">O Fantastic Beasts: Filas de espera, bases de dados e como as testar<\/h2>\n\n\n\n<p>Os testes unit\u00e1rios s\u00e3o bastante simples. Se apenas seguir as regras, ent\u00e3o o seu ambiente de teste e <a href=\"https:\/\/thecodest.co\/pt\/dictionary\/what-is-code-refactoring\/\">c\u00f3digo<\/a> s\u00e3o saud\u00e1veis. Que regras s\u00e3o essas?<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><b>F\u00e1cil de escrever<\/b> - um teste unit\u00e1rio deve ser f\u00e1cil de escrever porque se escrevem muitos deles. Menos esfor\u00e7o significa que mais testes s\u00e3o escritos.<\/li>\n\n\n\n<li><b>Leg\u00edvel<\/b> - o c\u00f3digo do teste deve ser f\u00e1cil de ler. O teste \u00e9 uma hist\u00f3ria. Descreve o comportamento do software e pode ser utilizado como um atalho para a documenta\u00e7\u00e3o. Um bom teste unit\u00e1rio ajuda-o a corrigir erros sem ter de depurar o c\u00f3digo.<\/li>\n\n\n\n<li><b>Fi\u00e1vel<\/b> - o teste s\u00f3 deve falhar se houver um erro no sistema que est\u00e1 a ser testado. \u00c9 \u00f3bvio? Nem sempre. Por vezes, os testes passam se os executarmos um a um, mas falham quando os executamos como um conjunto. Eles passam na sua m\u00e1quina, mas falham no CI (<a href=\"https:\/\/blog.codinghorror.com\/the-works-on-my-machine-certification-program\/\">Funciona no meu computador<\/a>). Um bom teste unit\u00e1rio tem apenas uma raz\u00e3o para falhar.<\/li>\n\n\n\n<li><b>R\u00e1pido<\/b> - Os testes devem ser r\u00e1pidos. A prepara\u00e7\u00e3o para a execu\u00e7\u00e3o, o in\u00edcio e a pr\u00f3pria execu\u00e7\u00e3o dos testes devem ser muito r\u00e1pidos. Caso contr\u00e1rio, os testes ser\u00e3o escritos, mas n\u00e3o executados. Testes lentos significam perda de foco. Espera-se e olha-se para a barra de progresso.<\/li>\n\n\n\n<li><b>Independente<\/b> - por \u00faltimo, o teste deve ser independente. Esta regra decorre das anteriores. S\u00f3 os testes verdadeiramente independentes podem constituir uma unidade. N\u00e3o interferem uns com os outros, podem ser executados em qualquer ordem e as potenciais falhas n\u00e3o dependem dos resultados de outros testes. Independente tamb\u00e9m significa n\u00e3o depender de quaisquer recursos externos como bases de dados, servi\u00e7os de mensagens ou sistema de ficheiros. Se precisar de comunicar com recursos externos, pode utilizar mocks, stubs ou dummies.<\/li>\n<\/ul>\n\n\n\n<p>Tudo se torna complicado quando queremos escrever alguns testes de integra\u00e7\u00e3o. N\u00e3o \u00e9 mau se quisermos testar alguns servi\u00e7os em conjunto. Mas quando precisamos de testar servi\u00e7os que utilizam recursos externos como bases de dados ou servi\u00e7os de mensagens, ent\u00e3o estamos a pedir problemas.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Para efetuar o teste, \u00e9 necess\u00e1rio instalar...<\/h3>\n\n\n\n<p>H\u00e1 muitos anos, quando quer\u00edamos efetuar alguns testes de integra\u00e7\u00e3o e utilizar, por exemplo, bases de dados, t\u00ednhamos duas op\u00e7\u00f5es:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Podemos instalar uma base de dados localmente. Configure um esquema e ligue-se a partir do nosso teste;<\/li>\n\n\n\n<li>Podemos ligar-nos a uma inst\u00e2ncia existente \"algures no espa\u00e7o\".<\/li>\n<\/ol>\n\n\n\n<p>Ambos t\u00eam pr\u00f3s e contras. Mas ambas introduzem n\u00edveis adicionais de complexidade. Por vezes, tratava-se de uma complexidade t\u00e9cnica decorrente das carater\u00edsticas de determinadas ferramentas, por exemplo, a instala\u00e7\u00e3o e gest\u00e3o de uma base de dados Oracle no seu servidor local. Por vezes, tratava-se de um inconveniente no processo, por exemplo, a necessidade de concordar com o teste <a href=\"https:\/\/thecodest.co\/pt\/dictionary\/how-to-lead-software-development-team\/\">equipa<\/a> sobre a utiliza\u00e7\u00e3o de JMS... de cada vez que quiser executar testes.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Contentores para o salvamento<\/h3>\n\n\n\n<p>Nos \u00faltimos 10 anos, a ideia de contentoriza\u00e7\u00e3o ganhou reconhecimento na ind\u00fastria. Assim, uma decis\u00e3o natural \u00e9 escolher os contentores como uma solu\u00e7\u00e3o para o nosso problema de teste de integra\u00e7\u00e3o. Esta \u00e9 uma solu\u00e7\u00e3o simples e limpa. Basta executar a constru\u00e7\u00e3o do processo e tudo funciona! N\u00e3o acredita? Veja esta configura\u00e7\u00e3o simples de uma compila\u00e7\u00e3o maven:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"xml\" class=\"language-xml\">com.dkanejs.maven.plugins\n     docker-compose-maven-plugin\n     4.0.0\n     \n       \n         up\n         testar-compilar\n         \n           acima\n         \n         \n           ${<a href=\"https:\/\/thecodest.co\/pt\/dictionary\/why-do-projects-fail\/\">projeto<\/a>.basedir}\/docker-compose.yml\n           verdadeiro\n         \n       \n       \n         down\n         p\u00f3s-teste de integra\u00e7\u00e3o\n         \n           descer\n         \n         \n           ${project.basedir}\/docker-compose.yml\n           true<\/code><\/pre>\n\n\n\n<p>E o <code>docker-compose.yml<\/code> o ficheiro tamb\u00e9m parece muito bonito!<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"yaml\" class=\"language-yaml\">vers\u00e3o: \"3.5\"\n\nservi\u00e7os:\n\n postgres:\n   nome_do_contentor: reactivedb\n   imagem: postgres:13.2\n   reiniciar: sempre\n   ambiente:\n     - POSTGRES_USER=admin\n     - POSTGRES_PASSWORD=palavra-passe\n     - POSTGRES_DB=cidades\n   portos:\n     - \"5432:5432\"\n   volumes:\n     - postgres_data:\/data\/db\n\n pgadmin:\n   nome_do_contentor: pgadmin4\n   imagem: dpage\/pgadmin4\n   restart: sempre\n   ambiente:\n     PGADMIN_DEFAULT_EMAIL: admin@admin.com\n     PGADMIN_DEFAULT_PASSWORD: password\n   portas:\n     - \"15050:80\"\n   volumes:\n     - pgadmin_data:\/data\/pgadmin\n\nvolumes:\n postgres_data:\n pgadmin_data:<\/code><\/pre>\n\n\n\n<p>Mas consegues identificar o problema aqui?<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Um cargueiro que bloqueia tudo<\/h3>\n\n\n\n<p>O exemplo acima \u00e9 muito simples. Apenas uma base de dados postgres, pgAdmin e mais nada. Quando se executa<\/p>\n\n\n\n<p><code>bash<br>\n$ mvn clean verify<br>\n<\/code><br>ent\u00e3o o plugin maven inicia os contentores e, ap\u00f3s os testes, desliga-os. Os problemas come\u00e7am quando o projeto cresce e o nosso ficheiro de composi\u00e7\u00e3o tamb\u00e9m cresce. Cada vez ser\u00e1 necess\u00e1rio iniciar todos os cont\u00eaineres, e eles permanecer\u00e3o ativos durante toda a constru\u00e7\u00e3o. \u00c9 poss\u00edvel melhorar um pouco a situa\u00e7\u00e3o alterando a configura\u00e7\u00e3o de execu\u00e7\u00e3o do plugin, mas isso n\u00e3o \u00e9 suficiente. Na pior das hip\u00f3teses, os seus contentores esgotam os recursos do sistema antes do in\u00edcio dos testes!<\/p>\n\n\n\n<p>E este n\u00e3o \u00e9 o \u00fanico problema. N\u00e3o \u00e9 poss\u00edvel executar um \u00fanico teste de integra\u00e7\u00e3o a partir do seu IDE. Antes disso, \u00e9 necess\u00e1rio iniciar os contentores manualmente. Al\u00e9m disso, a pr\u00f3xima execu\u00e7\u00e3o do maven ir\u00e1 derrubar esses contentores (d\u00ea uma olhada em <code>para baixo<\/code> execu\u00e7\u00e3o).<\/p>\n\n\n\n<p>Assim, esta solu\u00e7\u00e3o \u00e9 como um grande navio de carga. Se tudo funcionar bem, ent\u00e3o est\u00e1 tudo bem. Qualquer comportamento inesperado ou invulgar leva <a href=\"https:\/\/thecodest.co\/pt\/blog\/why-us-companies-are-opting-for-polish-developers\/\">n\u00f3s<\/a> a algum tipo de desastre.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Testar contentores - executar contentores a partir de testes<\/h2>\n\n\n\n<p>Mas e se pud\u00e9ssemos executar os nossos contentores a partir de testes? Esta ideia parece boa, e j\u00e1 est\u00e1 a ser implementada. <a href=\"https:\/\/www.testcontainers.org\/\" rel=\"nofollow\">Contentores de teste<\/a>Como estamos a falar deste projeto, aqui est\u00e1 uma solu\u00e7\u00e3o para os nossos problemas. N\u00e3o \u00e9 ideal, mas ningu\u00e9m \u00e9 perfeito.<\/p>\n\n\n\n<p>Este \u00e9 um <strong><a href=\"https:\/\/thecodest.co\/pt\/blog\/top-programming-languages-to-build-e-commerce\/\">Java<\/a><\/strong> que suporta testes JUnit e Spock, fornecendo maneiras leves e f\u00e1ceis de executar o <a href=\"https:\/\/thecodest.co\/pt\/dictionary\/docker-developer\/\">Docker<\/a> contentor. Vamos dar uma olhadela e escrever algum c\u00f3digo!<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Pr\u00e9-requisitos e configura\u00e7\u00e3o<\/h3>\n\n\n\n<p>Antes de come\u00e7armos, precisamos de verificar a nossa configura\u00e7\u00e3o. <strong>Contentores de ensaio<\/strong> necessidade:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Docker na vers\u00e3o v17.09,<\/li>\n\n\n\n<li>Vers\u00e3o m\u00ednima de Java 1.8,<\/li>\n\n\n\n<li>Acesso \u00e0 rede, especialmente ao docker.hub.<\/li>\n<\/ul>\n\n\n\n<p>Para mais informa\u00e7\u00f5es sobre os requisitos de um SO e de um IC espec\u00edficos, consultar<br>em <a href=\"https:\/\/www.testcontainers.org\/supported_docker_environment\/\" rel=\"nofollow\">documenta\u00e7\u00e3o<\/a>.<\/p>\n\n\n\n<p>Agora \u00e9 altura de adicionar algumas linhas ao <code>pom.xml<\/code>.<\/p>\n\n\n\n<aside>Utilizo o spring boot no projeto para reduzir o boilerplate. <strong>Contentores de ensaio<\/strong> s\u00e3o independentes do Spring Framework e podem ser utilizadas sem ele.<\/aside>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"xml\" class=\"language-xml\">org.testcontainers\n       testcontainers-bom\n       ${testcontaines.version}\n       pom\n       importar\n     \n   \n \n \n   \n     org.postgresql\n     postgresql\n     tempo de execu\u00e7\u00e3o\n   \n   \n     org.testcontainers\n     postgresql\n     teste\n   \n   \n     org.testcontainers\n     junit-jupiter\n     teste<\/code><\/pre>\n\n\n\n<p>Eu uso <strong>Contentores de ensaio<\/strong> vers\u00e3o <code>1.17.3<\/code>mas n\u00e3o hesite em utilizar a mais recente.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Testes com o contentor Postgres<\/h3>\n\n\n\n<p>O primeiro passo \u00e9 preparar a nossa inst\u00e2ncia de um contentor. Pode faz\u00ea-lo diretamente no teste, mas uma classe independente parece melhor.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"java\" class=\"language-java\">public class Postgres13TC extends PostgreSQLContainer {\n\n private static final Postgres13TC TC = new Postgres13TC();\n\n private Postgres13TC() {\n   super(\"postgres:13.2\");\n }\n\n public static Postgres13TC getInstance() {\n   return TC;\n }\n\n @Override\n public void start() {\n   super.start();\n   System.setProperty(\"DB_URL\", TC.getJdbcUrl());\n   System.setProperty(\"DB_USERNAME\", TC.getUsername()); System.setProperty(\"DB_USERNAME\", TC.getUsername());\n   System.setProperty(\"DB_PASSWORD\", TC.getPassword());\n }\n\n @Override\n public void stop() {\n   \/\/ n\u00e3o faz nada. Esta \u00e9 uma inst\u00e2ncia partilhada. Deixe a JVM lidar com esta opera\u00e7\u00e3o.\n }\n}\n<\/code><\/pre>\n\n\n\n<p>No in\u00edcio dos testes, vamos criar uma inst\u00e2ncia de <code>Postgres13TC<\/code>. Esta classe pode tratar as informa\u00e7\u00f5es sobre o nosso contentor. O mais importante aqui s\u00e3o as strings de conex\u00e3o com o banco de dados e as credenciais. Agora \u00e9 hora de escrever um teste muito simples.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"java\" class=\"language-java\">@Testcontainers\nclasse SimpleDbTest {\n\n @Contentor\n private static Postgres13TC = Postgres13TC.getInstance();\n\n @Teste\n void testConnection() {\n   assumeThat(postgres13TC.isRunning());\n   var connectionProps = new Properties();\n   connectionProps.put(\"user\", postgres13TC.getUsername());\n   connectionProps.put(\"password\", postgres13TC.getPassword());\n\n   try (Connection = DriverManager.getConnection(postgres13TC.getJdbcUrl(),\n       connectionProps)) {\n     var resultSet = connection.prepareStatement(\"Select 1\").executeQuery();\n     resultSet.next();\n     assertThat(resultSet.getInt(1)).isEqualTo(1);\n   } catch (SQLException sqlException) {\n     assertThat((Exception) sqlException).doesNotThrowAnyException();\n   }\n }\n}<\/code><\/pre>\n\n\n\n<p>Neste caso, utilizo o JUnit 5. Anota\u00e7\u00e3o <code>@Testcontainers<\/code> \u00e9 uma parte das extens\u00f5es que controlam os contentores no ambiente de teste. Elas encontram todos os campos com <code>@Contentor<\/code> e contentores de in\u00edcio e paragem, respetivamente.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Testes com o Spring Boot<\/h3>\n\n\n\n<p>Como referi anteriormente, utilizo o Spring Boot no projeto. Neste caso, precisamos de escrever um pouco mais de c\u00f3digo. O primeiro passo \u00e9 criar uma classe de configura\u00e7\u00e3o adicional.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"java\" class=\"language-java\">@Slf4j\npublic class ContainerInit implements\n   ApplicationContextInitializer {\n\n public static Postgres13TC;\n\n est\u00e1tico {\n   postgres13TC = Postgres13TC.getInstance();\n   postgres13TC.start();\n }\n\n @Override\n public void initialize(ConfigurableApplicationContext applicationContext) {\n   TestPropertySourceUtils.addInlinedPropertiesToEnvironment(\n       applicationContext,\n       \"spring.datasource.url=\" + postgres13TC.getJdbcUrl(),\n       \"spring.datasource.username=\" + postgres13TC.getUsername(),\n       \"spring.datasource.password=\" + postgres13TC.getPassword(),\n       \"db.host=\" + postgres13TC.getHost(),\n       \"db.port=\" + postgres13TC.getMappedPort(postgres13TC.POSTGRESQL_PORT),\n       \"db.name=\" + postgres13TC.getDatabaseName(),\n       \"db.username=\" + postgres13TC.getUsername(),\n       \"db.password=\" + postgres13TC.getPassword()\n   );\n }\n}<\/code><\/pre>\n\n\n\n<p>Esta classe substitui as propriedades existentes por valores da classe <strong>recipiente de ensaio<\/strong>. As tr\u00eas primeiras propriedades s\u00e3o propriedades padr\u00e3o do Spring. As cinco seguintes s\u00e3o propriedades adicionais e personalizadas que podem ser utilizadas para configurar outros recursos e extens\u00f5es como o liquibase, por exemplo:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"properties\" class=\"language-properties\">spring.liquibase.change-log=classpath:\/db\/changelog\/dbchangelog.xml\nspring.liquibase.url=jdbc:postgresql:\/\/${db.host:localhost}:${db.port:5432}\/${db.name:cities}\nspring.liquibase.user=${db.username:admin}\nspring.liquibase.password=${db.password:password}\nspring.liquibase.enabled=true<\/code><\/pre>\n\n\n\n<p>Agora \u00e9 altura de definir um teste de integra\u00e7\u00e3o simples.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"java\" class=\"language-java\">@SpringBootTest(webEnvironment = RANDOM_PORT)\n@AutoConfigureTestDatabase(replace = NONE)\n@ContextConfiguration(initializers = ContainerInit.class)\n@ContentoresTeste\nclasse DummyRepositoryTest {\n\n @Autowired\n private DummyRepository;\n\n @Teste\n void shouldReturnDummy() {\n   var byId = dummyRepository.getById(10L);\n   var expected = new Dummy();\n   expected.setId(10L);\n   assertThat(byId).completes().emitsCount(1).emits(expected);\n }\n}<\/code><\/pre>\n\n\n\n<p>Temos aqui algumas anota\u00e7\u00f5es extra.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>@SpringBootTest(webEnvironment = RANDOM_PORT)<\/code> - marca o teste como um teste Spring Boot e inicia o contexto do Spring.<\/li>\n\n\n\n<li><code>@AutoConfigureTestDatabase(replace = NONE)<\/code> - estas anota\u00e7\u00f5es dizem que a extens\u00e3o spring test n\u00e3o deve substituir a configura\u00e7\u00e3o da base de dados postgres por H2 na configura\u00e7\u00e3o da mem\u00f3ria.<\/li>\n\n\n\n<li><code>@ContextConfiguration(initializers = ContainerInit.class)<\/code> - um contexto de mola adicional<br>onde definimos as propriedades de <strong>Contentores de ensaio<\/strong>.<\/li>\n\n\n\n<li><code>@Testcontainers<\/code> - como mencionado anteriormente, esta anota\u00e7\u00e3o controla o ciclo de vida do contentor.<\/li>\n<\/ul>\n\n\n\n<p>Neste exemplo, utilizo reposit\u00f3rios reactivos, mas funciona da mesma forma com reposit\u00f3rios JDBC e JPA comuns.<\/p>\n\n\n\n<p>Agora podemos executar este teste. Se for a primeira execu\u00e7\u00e3o, o mecanismo precisa extrair imagens do docker.hub. Isso pode demorar um pouco. Depois disso, veremos que dois containers foram executados. Um \u00e9 o postgres e o outro \u00e9 o controlador Testcontainers. Esse segundo cont\u00eainer gerencia os cont\u00eaineres em execu\u00e7\u00e3o e, mesmo que a JVM pare inesperadamente, ele desliga os cont\u00eaineres e limpa o ambiente.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Resumindo<\/h2>\n\n\n\n<p><strong>Contentores de ensaio<\/strong> s\u00e3o ferramentas muito f\u00e1ceis de utilizar que nos ajudam a criar testes de integra\u00e7\u00e3o que utilizam contentores Docker. Isto d\u00e1-nos mais flexibilidade e aumenta a velocidade de desenvolvimento. A defini\u00e7\u00e3o correta da configura\u00e7\u00e3o dos testes reduz o tempo necess\u00e1rio para integrar novos programadores. Eles n\u00e3o precisam de configurar todas as depend\u00eancias, basta executar os testes escritos com ficheiros de configura\u00e7\u00e3o selecionados.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><a href=\"https:\/\/thecodest.co\/contact\"><img decoding=\"async\" src=\"\/app\/uploads\/2024\/05\/interested_in_cooperation_.png\" alt=\"faixa de coopera\u00e7\u00e3o\"\/><\/a><\/figure>","protected":false},"excerpt":{"rendered":"<p>Est\u00e1 \u00e0 procura de uma forma de fazer testes de uma maneira mais f\u00e1cil? N\u00f3s temos a solu\u00e7\u00e3o! Consulte o seguinte artigo e saiba como torn\u00e1-lo poss\u00edvel.<\/p>","protected":false},"author":2,"featured_media":3632,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"inline_featured_image":false,"footnotes":""},"categories":[8],"tags":[],"class_list":["post-3631","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-software-development"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v27.3 (Yoast SEO v27.3) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>Test Containers \u2013 How to Make Tests Easier? - The Codest<\/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:\/\/thecodest.co\/pt\/blogue\/contentores-de-teste-como-tornar-os-testes-mais-faceis\/\" \/>\n<meta property=\"og:locale\" content=\"pt_PT\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Test Containers \u2013 How to Make Tests Easier?\" \/>\n<meta property=\"og:description\" content=\"Are you looking for a way to make tests in an easier way? We got you! Check the following article and learn how to make it possible.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/thecodest.co\/pt\/blogue\/contentores-de-teste-como-tornar-os-testes-mais-faceis\/\" \/>\n<meta property=\"og:site_name\" content=\"The Codest\" \/>\n<meta property=\"article:published_time\" content=\"2022-07-26T11:02:35+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2026-03-11T06:00:15+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/thecodest.co\/app\/uploads\/2024\/05\/test_containers_-_how_to_make_tests_easier_.png\" \/>\n\t<meta property=\"og:image:width\" content=\"960\" \/>\n\t<meta property=\"og:image:height\" content=\"540\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"thecodest\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"thecodest\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"7 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/thecodest.co\\\/blog\\\/test-containers-how-to-make-tests-easier\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/thecodest.co\\\/blog\\\/test-containers-how-to-make-tests-easier\\\/\"},\"author\":{\"name\":\"thecodest\",\"@id\":\"https:\\\/\\\/thecodest.co\\\/#\\\/schema\\\/person\\\/7e3fe41dfa4f4e41a7baad4c6e0d4f76\"},\"headline\":\"Test Containers \u2013 How to Make Tests Easier?\",\"datePublished\":\"2022-07-26T11:02:35+00:00\",\"dateModified\":\"2026-03-11T06:00:15+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/thecodest.co\\\/blog\\\/test-containers-how-to-make-tests-easier\\\/\"},\"wordCount\":1399,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/thecodest.co\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/thecodest.co\\\/blog\\\/test-containers-how-to-make-tests-easier\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/thecodest.co\\\/app\\\/uploads\\\/2024\\\/05\\\/test_containers_-_how_to_make_tests_easier_.png\",\"articleSection\":[\"Software Development\"],\"inLanguage\":\"pt-PT\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/thecodest.co\\\/blog\\\/test-containers-how-to-make-tests-easier\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/thecodest.co\\\/blog\\\/test-containers-how-to-make-tests-easier\\\/\",\"url\":\"https:\\\/\\\/thecodest.co\\\/blog\\\/test-containers-how-to-make-tests-easier\\\/\",\"name\":\"Test Containers \u2013 How to Make Tests Easier? - The Codest\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/thecodest.co\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/thecodest.co\\\/blog\\\/test-containers-how-to-make-tests-easier\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/thecodest.co\\\/blog\\\/test-containers-how-to-make-tests-easier\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/thecodest.co\\\/app\\\/uploads\\\/2024\\\/05\\\/test_containers_-_how_to_make_tests_easier_.png\",\"datePublished\":\"2022-07-26T11:02:35+00:00\",\"dateModified\":\"2026-03-11T06:00:15+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/thecodest.co\\\/blog\\\/test-containers-how-to-make-tests-easier\\\/#breadcrumb\"},\"inLanguage\":\"pt-PT\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/thecodest.co\\\/blog\\\/test-containers-how-to-make-tests-easier\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-PT\",\"@id\":\"https:\\\/\\\/thecodest.co\\\/blog\\\/test-containers-how-to-make-tests-easier\\\/#primaryimage\",\"url\":\"https:\\\/\\\/thecodest.co\\\/app\\\/uploads\\\/2024\\\/05\\\/test_containers_-_how_to_make_tests_easier_.png\",\"contentUrl\":\"https:\\\/\\\/thecodest.co\\\/app\\\/uploads\\\/2024\\\/05\\\/test_containers_-_how_to_make_tests_easier_.png\",\"width\":960,\"height\":540},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/thecodest.co\\\/blog\\\/test-containers-how-to-make-tests-easier\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/thecodest.co\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Test Containers \u2013 How to Make Tests Easier?\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/thecodest.co\\\/#website\",\"url\":\"https:\\\/\\\/thecodest.co\\\/\",\"name\":\"The Codest\",\"description\":\"\",\"publisher\":{\"@id\":\"https:\\\/\\\/thecodest.co\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/thecodest.co\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"pt-PT\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/thecodest.co\\\/#organization\",\"name\":\"The Codest\",\"url\":\"https:\\\/\\\/thecodest.co\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-PT\",\"@id\":\"https:\\\/\\\/thecodest.co\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/thecodest.co\\\/app\\\/uploads\\\/2024\\\/03\\\/thecodest-logo.svg\",\"contentUrl\":\"https:\\\/\\\/thecodest.co\\\/app\\\/uploads\\\/2024\\\/03\\\/thecodest-logo.svg\",\"width\":144,\"height\":36,\"caption\":\"The Codest\"},\"image\":{\"@id\":\"https:\\\/\\\/thecodest.co\\\/#\\\/schema\\\/logo\\\/image\\\/\"},\"sameAs\":[\"https:\\\/\\\/pl.linkedin.com\\\/company\\\/codest\",\"https:\\\/\\\/clutch.co\\\/profile\\\/codest\"]},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/thecodest.co\\\/#\\\/schema\\\/person\\\/7e3fe41dfa4f4e41a7baad4c6e0d4f76\",\"name\":\"thecodest\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-PT\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/5dbfe6a1e8c86e432e8812759e34e6fe82ebac75119ae3237a6c1311fa19caf4?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/5dbfe6a1e8c86e432e8812759e34e6fe82ebac75119ae3237a6c1311fa19caf4?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/5dbfe6a1e8c86e432e8812759e34e6fe82ebac75119ae3237a6c1311fa19caf4?s=96&d=mm&r=g\",\"caption\":\"thecodest\"},\"url\":\"https:\\\/\\\/thecodest.co\\\/pt\\\/author\\\/thecodest\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Contentores de teste - Como tornar os testes mais f\u00e1ceis? - The Codest","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:\/\/thecodest.co\/pt\/blogue\/contentores-de-teste-como-tornar-os-testes-mais-faceis\/","og_locale":"pt_PT","og_type":"article","og_title":"Test Containers \u2013 How to Make Tests Easier?","og_description":"Are you looking for a way to make tests in an easier way? We got you! Check the following article and learn how to make it possible.","og_url":"https:\/\/thecodest.co\/pt\/blogue\/contentores-de-teste-como-tornar-os-testes-mais-faceis\/","og_site_name":"The Codest","article_published_time":"2022-07-26T11:02:35+00:00","article_modified_time":"2026-03-11T06:00:15+00:00","og_image":[{"width":960,"height":540,"url":"https:\/\/thecodest.co\/app\/uploads\/2024\/05\/test_containers_-_how_to_make_tests_easier_.png","type":"image\/png"}],"author":"thecodest","twitter_card":"summary_large_image","twitter_misc":{"Written by":"thecodest","Est. reading time":"7 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/thecodest.co\/blog\/test-containers-how-to-make-tests-easier\/#article","isPartOf":{"@id":"https:\/\/thecodest.co\/blog\/test-containers-how-to-make-tests-easier\/"},"author":{"name":"thecodest","@id":"https:\/\/thecodest.co\/#\/schema\/person\/7e3fe41dfa4f4e41a7baad4c6e0d4f76"},"headline":"Test Containers \u2013 How to Make Tests Easier?","datePublished":"2022-07-26T11:02:35+00:00","dateModified":"2026-03-11T06:00:15+00:00","mainEntityOfPage":{"@id":"https:\/\/thecodest.co\/blog\/test-containers-how-to-make-tests-easier\/"},"wordCount":1399,"commentCount":0,"publisher":{"@id":"https:\/\/thecodest.co\/#organization"},"image":{"@id":"https:\/\/thecodest.co\/blog\/test-containers-how-to-make-tests-easier\/#primaryimage"},"thumbnailUrl":"https:\/\/thecodest.co\/app\/uploads\/2024\/05\/test_containers_-_how_to_make_tests_easier_.png","articleSection":["Software Development"],"inLanguage":"pt-PT","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/thecodest.co\/blog\/test-containers-how-to-make-tests-easier\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/thecodest.co\/blog\/test-containers-how-to-make-tests-easier\/","url":"https:\/\/thecodest.co\/blog\/test-containers-how-to-make-tests-easier\/","name":"Contentores de teste - Como tornar os testes mais f\u00e1ceis? - The Codest","isPartOf":{"@id":"https:\/\/thecodest.co\/#website"},"primaryImageOfPage":{"@id":"https:\/\/thecodest.co\/blog\/test-containers-how-to-make-tests-easier\/#primaryimage"},"image":{"@id":"https:\/\/thecodest.co\/blog\/test-containers-how-to-make-tests-easier\/#primaryimage"},"thumbnailUrl":"https:\/\/thecodest.co\/app\/uploads\/2024\/05\/test_containers_-_how_to_make_tests_easier_.png","datePublished":"2022-07-26T11:02:35+00:00","dateModified":"2026-03-11T06:00:15+00:00","breadcrumb":{"@id":"https:\/\/thecodest.co\/blog\/test-containers-how-to-make-tests-easier\/#breadcrumb"},"inLanguage":"pt-PT","potentialAction":[{"@type":"ReadAction","target":["https:\/\/thecodest.co\/blog\/test-containers-how-to-make-tests-easier\/"]}]},{"@type":"ImageObject","inLanguage":"pt-PT","@id":"https:\/\/thecodest.co\/blog\/test-containers-how-to-make-tests-easier\/#primaryimage","url":"https:\/\/thecodest.co\/app\/uploads\/2024\/05\/test_containers_-_how_to_make_tests_easier_.png","contentUrl":"https:\/\/thecodest.co\/app\/uploads\/2024\/05\/test_containers_-_how_to_make_tests_easier_.png","width":960,"height":540},{"@type":"BreadcrumbList","@id":"https:\/\/thecodest.co\/blog\/test-containers-how-to-make-tests-easier\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/thecodest.co\/"},{"@type":"ListItem","position":2,"name":"Test Containers \u2013 How to Make Tests Easier?"}]},{"@type":"WebSite","@id":"https:\/\/thecodest.co\/#website","url":"https:\/\/thecodest.co\/","name":"The Codest","description":"","publisher":{"@id":"https:\/\/thecodest.co\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/thecodest.co\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"pt-PT"},{"@type":"Organization","@id":"https:\/\/thecodest.co\/#organization","name":"The Codest","url":"https:\/\/thecodest.co\/","logo":{"@type":"ImageObject","inLanguage":"pt-PT","@id":"https:\/\/thecodest.co\/#\/schema\/logo\/image\/","url":"https:\/\/thecodest.co\/app\/uploads\/2024\/03\/thecodest-logo.svg","contentUrl":"https:\/\/thecodest.co\/app\/uploads\/2024\/03\/thecodest-logo.svg","width":144,"height":36,"caption":"The Codest"},"image":{"@id":"https:\/\/thecodest.co\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/pl.linkedin.com\/company\/codest","https:\/\/clutch.co\/profile\/codest"]},{"@type":"Person","@id":"https:\/\/thecodest.co\/#\/schema\/person\/7e3fe41dfa4f4e41a7baad4c6e0d4f76","name":"thecodest","image":{"@type":"ImageObject","inLanguage":"pt-PT","@id":"https:\/\/secure.gravatar.com\/avatar\/5dbfe6a1e8c86e432e8812759e34e6fe82ebac75119ae3237a6c1311fa19caf4?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/5dbfe6a1e8c86e432e8812759e34e6fe82ebac75119ae3237a6c1311fa19caf4?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/5dbfe6a1e8c86e432e8812759e34e6fe82ebac75119ae3237a6c1311fa19caf4?s=96&d=mm&r=g","caption":"thecodest"},"url":"https:\/\/thecodest.co\/pt\/author\/thecodest\/"}]}},"_links":{"self":[{"href":"https:\/\/thecodest.co\/pt\/wp-json\/wp\/v2\/posts\/3631","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/thecodest.co\/pt\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/thecodest.co\/pt\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/thecodest.co\/pt\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/thecodest.co\/pt\/wp-json\/wp\/v2\/comments?post=3631"}],"version-history":[{"count":9,"href":"https:\/\/thecodest.co\/pt\/wp-json\/wp\/v2\/posts\/3631\/revisions"}],"predecessor-version":[{"id":8016,"href":"https:\/\/thecodest.co\/pt\/wp-json\/wp\/v2\/posts\/3631\/revisions\/8016"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/thecodest.co\/pt\/wp-json\/wp\/v2\/media\/3632"}],"wp:attachment":[{"href":"https:\/\/thecodest.co\/pt\/wp-json\/wp\/v2\/media?parent=3631"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/thecodest.co\/pt\/wp-json\/wp\/v2\/categories?post=3631"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/thecodest.co\/pt\/wp-json\/wp\/v2\/tags?post=3631"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}