{"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":"contenedores-de-pruebas-como-facilitar-las-pruebas","status":"publish","type":"post","link":"https:\/\/thecodest.co\/es\/blog\/test-containers-how-to-make-tests-easier\/","title":{"rendered":"Contenedores de pruebas - \u00bfC\u00f3mo facilitar las pruebas?"},"content":{"rendered":"<p>El desarrollo moderno de aplicaciones se basa en una regla muy sencilla:<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p><b>Utilizar la composici\u00f3n<\/b><\/p>\n<\/blockquote>\n\n\n\n<p>Componemos clases, funciones y servicios en piezas de software m\u00e1s grandes. Este \u00faltimo elemento es la base de <a href=\"https:\/\/thecodest.co\/es\/dictionary\/microservices\/\">microservicios<\/a> y <a href=\"https:\/\/thecodest.co\/es\/blog\/the-power-of-hexagonal-architecture\/\">arquitectura hexagonal<\/a>. Nos gustar\u00eda utilizar las soluciones existentes, integrarlas con nuestro software y pasar directamente a la <a href=\"https:\/\/thecodest.co\/es\/dictionary\/what-is-the-size-of-your-potential-reachable-market\/\">mercado<\/a>.<\/p>\n\n\n\n<p>\u00bfDesea gestionar el registro de cuentas y almacenar usuarios <a href=\"https:\/\/thecodest.co\/es\/blog\/app-data-collection-security-risks-value-and-types-explored\/\">datos<\/a>? Puedes elegir uno de los servicios OAuth. \u00bfTal vez tu aplicaci\u00f3n ofrece alg\u00fan tipo de suscripci\u00f3n o pago? Hay muchos servicios que pueden ayudarte a gestionar esto. \u00bfNecesita alg\u00fan tipo de an\u00e1lisis en su sitio web, pero no entiende <a href=\"https:\/\/thecodest.co\/es\/blog\/cyber-security-dilemmas-data-leaks\/\">GDPR<\/a>? No dude en optar por una de las soluciones listas para usar.<\/p>\n\n\n\n<p>Algo que facilita tanto el desarrollo desde el punto de vista empresarial podr\u00eda darle un dolor de cabeza: el momento en que necesita escribir una simple prueba.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Las bestias fant\u00e1sticas: Colas, bases de datos y c\u00f3mo probarlas<\/h2>\n\n\n\n<p>Las pruebas unitarias son bastante sencillas. Si s\u00f3lo sigues las reglas, entonces tu entorno de pruebas y <a href=\"https:\/\/thecodest.co\/es\/dictionary\/what-is-code-refactoring\/\">c\u00f3digo<\/a> son saludables. \u00bfQu\u00e9 normas son \u00e9sas?<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><b>F\u00e1cil de escribir<\/b> - una prueba unitaria debe ser f\u00e1cil de escribir porque se escriben muchas. Menos esfuerzo significa que se escriben m\u00e1s pruebas.<\/li>\n\n\n\n<li><b>Legible<\/b> - el c\u00f3digo de la prueba debe ser f\u00e1cil de leer. La prueba es una historia. Describe el comportamiento del software y puede utilizarse como un atajo de documentaci\u00f3n. Una buena prueba unitaria ayuda a corregir errores sin depurar el c\u00f3digo.<\/li>\n\n\n\n<li><b>Fiable<\/b> - la prueba debe fallar s\u00f3lo si hay un error en el sistema que se est\u00e1 probando. \u00bfEs obvio? No siempre. A veces las pruebas pasan si las ejecutas una a una, pero fallan cuando las ejecutas en conjunto. Pasan en tu m\u00e1quina, pero fallan en CI (<a href=\"https:\/\/blog.codinghorror.com\/the-works-on-my-machine-certification-program\/\">Funciona en mi m\u00e1quina<\/a>). Una buena prueba unitaria s\u00f3lo tiene una raz\u00f3n para fallar.<\/li>\n\n\n\n<li><b>R\u00e1pido<\/b> - Las pruebas deben ser r\u00e1pidas. La preparaci\u00f3n para la ejecuci\u00f3n, el inicio y la propia ejecuci\u00f3n de las pruebas deben ser muy r\u00e1pidos. De lo contrario, las escribir\u00e1, pero no las ejecutar\u00e1. Las pruebas lentas significan p\u00e9rdida de concentraci\u00f3n. Esperas y miras la barra de progreso.<\/li>\n\n\n\n<li><b>Independiente<\/b> - por \u00faltimo, la prueba debe ser independiente. Esta regla se deriva de las anteriores. S\u00f3lo las pruebas verdaderamente independientes pueden constituir una unidad. No interfieren entre s\u00ed, pueden ejecutarse en cualquier orden y los posibles fallos no dependen de los resultados de otras pruebas. Independiente tambi\u00e9n significa que no depende de ning\u00fan recurso externo, como bases de datos, servicios de mensajer\u00eda o sistemas de archivos. Si necesitas comunicarte con recursos externos, puedes utilizar mocks, stubs o dummies.<\/li>\n<\/ul>\n\n\n\n<p>Todo se complica cuando queremos escribir algunas pruebas de integraci\u00f3n. No est\u00e1 mal si queremos probar unos cuantos servicios juntos. Pero cuando necesitamos probar servicios que utilizan recursos externos como bases de datos o servicios de mensajer\u00eda, entonces nos estamos buscando problemas.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Para ejecutar la prueba, debe instalar...<\/h3>\n\n\n\n<p>Hace muchos a\u00f1os, cuando quer\u00edamos hacer algunas pruebas de integraci\u00f3n y utilizar, por ejemplo, bases de datos, ten\u00edamos dos opciones:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Podemos instalar una base de datos localmente. Configura un esquema y con\u00e9ctate desde nuestra prueba;<\/li>\n\n\n\n<li>Podemos conectarnos a una instancia existente \"en alg\u00fan lugar del espacio\".<\/li>\n<\/ol>\n\n\n\n<p>Ambas tienen pros y contras. Pero ambas introducen niveles adicionales de complejidad. A veces se trataba de complejidad t\u00e9cnica derivada de las caracter\u00edsticas de determinadas herramientas, por ejemplo, la instalaci\u00f3n y gesti\u00f3n de la base de datos Oracle en el host local. A veces era un inconveniente en el proceso, por ejemplo, tienes que ponerte de acuerdo con la prueba <a href=\"https:\/\/thecodest.co\/es\/dictionary\/how-to-lead-software-development-team\/\">equipo<\/a> sobre el uso de JMS... cada vez que quiera ejecutar pruebas.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Contenedores al rescate<\/h3>\n\n\n\n<p>En los \u00faltimos 10 a\u00f1os, la idea de la contenedorizaci\u00f3n ha ganado reconocimiento en la industria. Por lo tanto, una decisi\u00f3n natural es elegir los contenedores como soluci\u00f3n para nuestro problema de pruebas de integraci\u00f3n. Se trata de una soluci\u00f3n sencilla y limpia. Basta con ejecutar la compilaci\u00f3n del proceso y \u00a1todo funciona! \u00bfNo te lo puedes creer? Echa un vistazo a esta sencilla configuraci\u00f3n de una construcci\u00f3n 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         prueba-compilaci\u00f3n\n         \n           arriba\n         \n         \n           ${<a href=\"https:\/\/thecodest.co\/es\/dictionary\/why-do-projects-fail\/\">proyecto<\/a>.basedir}\/docker-compose.yml\n           true\n         \n       \n       \n         abajo\n         posterior a la prueba de integraci\u00f3n\n         \n           down\n         \n         \n           ${project.basedir}\/docker-compose.yml\n           true<\/code><\/pre>\n\n\n\n<p>Y el <code>docker-compose.yml<\/code> Adem\u00e1s, el expediente tiene muy buena pinta.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"yaml\" class=\"language-yaml\">versi\u00f3n: \"3.5\"\n\nservicios:\n\n postgres:\n   nombre_contenedor: reactivedb\n   imagen: postgres:13.2\n   reiniciar: siempre\n   entorno:\n     - POSTGRES_USER=admin\n     - POSTGRES_PASSWORD=contrase\u00f1a\n     - POSTGRES_DB=ciudades\n   puertos:\n     - \"5432:5432\"\n   vol\u00famenes:\n     - postgres_data:\/data\/db\n\n pgadmin\n   nombre_contenedor: pgadmin4\n   imagen: dpage\/pgadmin4\n   reinicio: siempre\n   entorno:\n     PGADMIN_DEFAULT_EMAIL: admin@admin.com\n     PGADMIN_DEFAULT_PASSWORD: contrase\u00f1a\n   puertos:\n     - \"15050:80\"\n   vol\u00famenes:\n     - pgadmin_data:\/data\/pgadmin\n\nvol\u00famenes:\n postgres_data:\n pgadmin_data:<\/code><\/pre>\n\n\n\n<p>Pero, \u00bfse da cuenta del problema?<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Un carguero que lo bloquea todo<\/h3>\n\n\n\n<p>El ejemplo anterior es muy simple. S\u00f3lo una base de datos postgres, pgAdmin y eso es todo. Cuando ejecutes<\/p>\n\n\n\n<p><code>bash<br>\n$ mvn clean verify<br>\n<\/code><br>entonces el plugin de maven inicia los contenedores y despu\u00e9s de las pruebas los apaga. Los problemas empiezan cuando el proyecto crece y nuestro fichero de composici\u00f3n crece tambi\u00e9n. Cada vez tendr\u00e1s que arrancar todos los contenedores, y estar\u00e1n vivos durante toda la compilaci\u00f3n. Puedes mejorar un poco la situaci\u00f3n cambiando la configuraci\u00f3n de ejecuci\u00f3n del plugin, pero no es suficiente. En el peor de los casos, \u00a1tus contenedores agotar\u00e1n los recursos del sistema antes de que comiencen las pruebas!<\/p>\n\n\n\n<p>Y este no es el \u00fanico problema. No puedes ejecutar una sola prueba de integraci\u00f3n desde tu IDE. Antes de eso, necesitas arrancar los contenedores a mano. Adem\u00e1s, la siguiente ejecuci\u00f3n de maven derribar\u00e1 esos contenedores (echa un vistazo a <code>abajo<\/code> ejecuci\u00f3n).<\/p>\n\n\n\n<p>As\u00ed que esta soluci\u00f3n es como un gran carguero. Si todo funciona bien, no pasa nada. Cualquier comportamiento inesperado o poco com\u00fan conduce <a href=\"https:\/\/thecodest.co\/es\/blog\/why-us-companies-are-opting-for-polish-developers\/\">us<\/a> a alg\u00fan tipo de desastre.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Contenedores de prueba: ejecute contenedores desde las pruebas<\/h2>\n\n\n\n<p>Pero, \u00bfy si pudi\u00e9ramos ejecutar nuestros contenedores desde las pruebas? Esta idea parece buena, y ya se est\u00e1 poniendo en pr\u00e1ctica. <a href=\"https:\/\/www.testcontainers.org\/\" rel=\"nofollow\">Contenedores de prueba<\/a>ya que estamos hablando de este proyecto, he aqu\u00ed una soluci\u00f3n para nuestros problemas. No es ideal, pero nadie es perfecto.<\/p>\n\n\n\n<p>Se trata de un <strong><a href=\"https:\/\/thecodest.co\/es\/blog\/top-programming-languages-to-build-e-commerce\/\">Java<\/a><\/strong> que es compatible con las pruebas de JUnit y Spock, lo que proporciona formas ligeras y sencillas de ejecutar las pruebas de <a href=\"https:\/\/thecodest.co\/es\/dictionary\/docker-developer\/\">Docker<\/a> contenedor. Ech\u00e9mosle un vistazo y escribamos algo de c\u00f3digo.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Requisitos previos y configuraci\u00f3n<\/h3>\n\n\n\n<p>Antes de empezar, tenemos que comprobar nuestra configuraci\u00f3n. <strong>Contenedores de prueba<\/strong> necesidad:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Docker en la versi\u00f3n v17.09,<\/li>\n\n\n\n<li>Java versi\u00f3n m\u00ednima 1.8,<\/li>\n\n\n\n<li>Acceso a la red, especialmente a docker.hub.<\/li>\n<\/ul>\n\n\n\n<p>Encontrar\u00e1 m\u00e1s informaci\u00f3n sobre los requisitos para sistemas operativos y CI espec\u00edficos en<br>en <a href=\"https:\/\/www.testcontainers.org\/supported_docker_environment\/\" rel=\"nofollow\">documentaci\u00f3n<\/a>.<\/p>\n\n\n\n<p>Ahora es el momento de a\u00f1adir algunas l\u00edneas a <code>pom.xml<\/code>.<\/p>\n\n\n\n<aside>Utilizo spring boot en el proyecto para reducir boilerplate. <strong>Contenedores de prueba<\/strong> son independientes de Spring Framework y se pueden utilizar sin \u00e9l.<\/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     runtime<\/s>\n   \n   \n     org.testcontainers\n     postgresql\n     prueba\n   \n   \n     org.testcontainers\n     junit-jupiter\n     prueba<\/code><\/pre>\n\n\n\n<p>Utilizo <strong>Contenedores de prueba<\/strong> versi\u00f3n <code>1.17.3<\/code>pero si\u00e9ntase libre de utilizar el m\u00e1s reciente.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Pruebas con el contenedor Postgres<\/h3>\n\n\n\n<p>El primer paso es preparar nuestra instancia de un contenedor. Puedes hacerlo directamente en la prueba, pero una clase independiente queda mejor.<\/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());\n   System.setProperty(\"DB_PASSWORD\", TC.getPassword());\n }\n\n @Override\n public void stop() {\n   \/\/ no hace nada. Esta es una instancia compartida. Deja que la JVM se encargue de esta operaci\u00f3n.\n }\n}\n<\/code><\/pre>\n\n\n\n<p>Al principio de las pruebas, crearemos una instancia de <code>Postgres13TC<\/code>. Esta clase puede manejar informaci\u00f3n sobre nuestro contenedor. Lo m\u00e1s importante aqu\u00ed son las cadenas de conexi\u00f3n a la base de datos y las credenciales. Ahora es el momento de escribir una prueba muy simple.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"java\" class=\"language-java\">@Contenedoresdepruebas\nclase SimpleDbTest {\n\n @Contenedor\n private static Postgres13TC = Postgres13TC.getInstance();\n\n @Prueba\n void testConnection() {\n   assumeThat(postgres13TC.isRunning());\n   var connectionProps = new Properties();\n   connectionProps.put(\"usuario\", postgres13TC.getUsername());\n   connectionProps.put(\"contrase\u00f1a\", 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>Aqu\u00ed utilizo JUnit 5. Anotaci\u00f3n <code>@Testcontainers<\/code> forma parte de las extensiones que controlan los contenedores en el entorno de prueba. Encuentran todos los campos con <code>@Contenedor<\/code> y los contenedores de inicio y parada, respectivamente.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Pruebas con Spring Boot<\/h3>\n\n\n\n<p>Como he mencionado antes, utilizo Spring Boot en el proyecto. En este caso, tenemos que escribir un poco m\u00e1s de c\u00f3digo. El primer paso es crear una clase de configuraci\u00f3n 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 static {\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 clase sustituye las propiedades existentes con valores de la clase <strong>contenedor de prueba<\/strong>. Las tres primeras propiedades son propiedades est\u00e1ndar de Spring. Las cinco siguientes son propiedades adicionales personalizadas que se pueden utilizar para configurar otros recursos y extensiones como liquibase, por ejemplo:<\/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>Ahora es el momento de definir una prueba de integraci\u00f3n sencilla.<\/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(inicializadores = ContainerInit.class)\n@ContenedoresDePrueba\nclase DummyRepositoryTest {\n\n @Autocableado\n privado DummyRepository;\n\n @Prueba\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>Aqu\u00ed tenemos algunas anotaciones adicionales.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>@SpringBootTest(webEnvironment = RANDOM_PORT)<\/code> - marca la prueba como una prueba de Spring Boot e inicia el contexto de Spring.<\/li>\n\n\n\n<li><code>@AutoConfigureTestDatabase(replace = NONE)<\/code> - estas anotaciones dicen que la extensi\u00f3n de prueba de spring no debe reemplazar la configuraci\u00f3n de la base de datos postgres con H2 en la configuraci\u00f3n de memoria.<\/li>\n\n\n\n<li><code>@ContextConfiguration(inicializadores = ContainerInit.class)<\/code> - un contexto primaveral adicional<br>donde establecemos las propiedades de <strong>Contenedores de prueba<\/strong>.<\/li>\n\n\n\n<li><code>@Testcontainers<\/code> - como se ha mencionado anteriormente, esta anotaci\u00f3n controla el ciclo de vida del contenedor.<\/li>\n<\/ul>\n\n\n\n<p>En este ejemplo, utilizo repositorios reactivos, pero funciona igual con repositorios JDBC y JPA comunes.<\/p>\n\n\n\n<p>Ahora podemos ejecutar esta prueba. Si es la primera vez que se ejecuta, el motor necesita extraer im\u00e1genes de docker.hub. Esto puede tardar un momento. Despu\u00e9s de eso, veremos que dos contenedores se han ejecutado. Uno es postgres y el otro es el controlador Testcontainers. Ese segundo contenedor gestiona los contenedores en ejecuci\u00f3n e incluso si la JVM se detiene inesperadamente, entonces apaga los contenedores y limpia el entorno.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Resumamos<\/h2>\n\n\n\n<p><strong>Contenedores de prueba<\/strong> son herramientas muy f\u00e1ciles de usar que nos ayudan a crear pruebas de integraci\u00f3n que utilizan contenedores Docker. Eso nos da m\u00e1s flexibilidad y aumenta la velocidad de desarrollo. La configuraci\u00f3n adecuada de las pruebas reduce el tiempo necesario para embarcar a los nuevos desarrolladores. No necesitan configurar todas las dependencias, solo ejecutar las pruebas escritas con los archivos de configuraci\u00f3n seleccionados.<\/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=\"bandera de cooperaci\u00f3n\"\/><\/a><\/figure>","protected":false},"excerpt":{"rendered":"<p>\u00bfBuscas una manera de hacer tests de forma m\u00e1s sencilla? \u00a1Te hemos pillado! Consulta el siguiente art\u00edculo y aprende c\u00f3mo hacerlo posible.<\/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\/es\/blog\/contenedores-de-pruebas-como-facilitar-las-pruebas\/\" \/>\n<meta property=\"og:locale\" content=\"es_ES\" \/>\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\/es\/blog\/contenedores-de-pruebas-como-facilitar-las-pruebas\/\" \/>\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\":\"es-ES\",\"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\":\"es-ES\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/thecodest.co\\\/blog\\\/test-containers-how-to-make-tests-easier\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"es-ES\",\"@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\":\"es-ES\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/thecodest.co\\\/#organization\",\"name\":\"The Codest\",\"url\":\"https:\\\/\\\/thecodest.co\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"es-ES\",\"@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\":\"es-ES\",\"@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\\\/es\\\/author\\\/thecodest\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Contenedores de pruebas - \u00bfC\u00f3mo facilitar las pruebas? - 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\/es\/blog\/contenedores-de-pruebas-como-facilitar-las-pruebas\/","og_locale":"es_ES","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\/es\/blog\/contenedores-de-pruebas-como-facilitar-las-pruebas\/","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":"es-ES","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":"Contenedores de pruebas - \u00bfC\u00f3mo facilitar las pruebas? - 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":"es-ES","potentialAction":[{"@type":"ReadAction","target":["https:\/\/thecodest.co\/blog\/test-containers-how-to-make-tests-easier\/"]}]},{"@type":"ImageObject","inLanguage":"es-ES","@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":"es-ES"},{"@type":"Organization","@id":"https:\/\/thecodest.co\/#organization","name":"The Codest","url":"https:\/\/thecodest.co\/","logo":{"@type":"ImageObject","inLanguage":"es-ES","@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":"es-ES","@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\/es\/author\/thecodest\/"}]}},"_links":{"self":[{"href":"https:\/\/thecodest.co\/es\/wp-json\/wp\/v2\/posts\/3631","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/thecodest.co\/es\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/thecodest.co\/es\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/thecodest.co\/es\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/thecodest.co\/es\/wp-json\/wp\/v2\/comments?post=3631"}],"version-history":[{"count":9,"href":"https:\/\/thecodest.co\/es\/wp-json\/wp\/v2\/posts\/3631\/revisions"}],"predecessor-version":[{"id":8016,"href":"https:\/\/thecodest.co\/es\/wp-json\/wp\/v2\/posts\/3631\/revisions\/8016"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/thecodest.co\/es\/wp-json\/wp\/v2\/media\/3632"}],"wp:attachment":[{"href":"https:\/\/thecodest.co\/es\/wp-json\/wp\/v2\/media?parent=3631"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/thecodest.co\/es\/wp-json\/wp\/v2\/categories?post=3631"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/thecodest.co\/es\/wp-json\/wp\/v2\/tags?post=3631"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}