{"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":"contenitori-di-test-come-semplificare-i-test","status":"publish","type":"post","link":"https:\/\/thecodest.co\/it\/blog\/test-containers-how-to-make-tests-easier\/","title":{"rendered":"Contenitori di test - Come semplificare i test?"},"content":{"rendered":"<p>Lo sviluppo di applicazioni moderne si basa su una semplice regola:<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p><b>Utilizzare la composizione<\/b><\/p>\n<\/blockquote>\n\n\n\n<p>Componiamo classi, funzioni e servizi in pezzi di software pi\u00f9 grandi. Quest'ultimo elemento \u00e8 il fondamento di <a href=\"https:\/\/thecodest.co\/it\/dictionary\/microservices\/\">microservizi<\/a> e <a href=\"https:\/\/thecodest.co\/it\/blog\/the-power-of-hexagonal-architecture\/\">architettura esagonale<\/a>. Vorremmo utilizzare le soluzioni esistenti, integrarle con il nostro software e passare direttamente alla <a href=\"https:\/\/thecodest.co\/it\/dictionary\/what-is-the-size-of-your-potential-reachable-market\/\">mercato<\/a>.<\/p>\n\n\n\n<p>Si vuole gestire la registrazione dell'account e memorizzare gli utenti <a href=\"https:\/\/thecodest.co\/it\/blog\/app-data-collection-security-risks-value-and-types-explored\/\">dati<\/a>? Potete scegliere uno dei servizi OAuth. Forse la vostra applicazione offre un qualche tipo di abbonamento o di pagamento? Ci sono molti servizi che possono aiutarvi a gestire questo aspetto. Avete bisogno di analisi per il vostro sito web, ma non capite <a href=\"https:\/\/thecodest.co\/it\/blog\/cyber-security-dilemmas-data-leaks\/\">GDPR<\/a>? Non esitate a scegliere una delle soluzioni pronte all'uso.<\/p>\n\n\n\n<p>Qualcosa che rende lo sviluppo cos\u00ec facile da un punto di vista commerciale potrebbe farvi venire il mal di testa nel momento in cui dovete scrivere un semplice test.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Le bestie fantastiche: Code, database e come testarli<\/h2>\n\n\n\n<p>I test unitari sono piuttosto semplici. Se ci si attiene solo alle regole, l'ambiente di test e il <a href=\"https:\/\/thecodest.co\/it\/dictionary\/what-is-code-refactoring\/\">codice<\/a> sono sane. Quali sono le regole?<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><b>Facile da scrivere<\/b> - un test unitario dovrebbe essere facile da scrivere, perch\u00e9 se ne scrivono molti. Meno sforzo significa scrivere pi\u00f9 test.<\/li>\n\n\n\n<li><b>Leggibile<\/b> - il codice di test deve essere facile da leggere. Il test \u00e8 una storia. Descrive il comportamento del software e pu\u00f2 essere usato come scorciatoia per la documentazione. Un buon test unitario aiuta a risolvere i bug senza dover eseguire il debug del codice.<\/li>\n\n\n\n<li><b>Affidabile<\/b> - il test dovrebbe fallire solo se c'\u00e8 un bug nel sistema che si sta testando. \u00c8 ovvio? Non sempre. A volte i test passano se li si esegue uno per uno, ma falliscono quando li si esegue come un insieme. Passano sulla vostra macchina, ma falliscono sul CI (<a href=\"https:\/\/blog.codinghorror.com\/the-works-on-my-machine-certification-program\/\">Funziona sul mio computer<\/a>). Un buon test unitario ha un solo motivo di fallimento.<\/li>\n\n\n\n<li><b>Veloce<\/b> - i test devono essere veloci. La preparazione all'esecuzione, l'avvio e l'esecuzione stessa dei test devono essere molto rapidi. Altrimenti li scriverete, ma non li eseguirete. Test lenti significano perdita di concentrazione. Si aspetta e si guarda la barra di avanzamento.<\/li>\n\n\n\n<li><b>Indipendente<\/b> - infine, il test deve essere indipendente. Questa regola deriva dalle precedenti. Solo i test veramente indipendenti possono diventare un'unit\u00e0. Non interferiscono tra loro, possono essere eseguiti in qualsiasi ordine e i potenziali fallimenti non dipendono dai risultati di altri test. Indipendente significa anche nessuna dipendenza da risorse esterne come database, servizi di messaggistica o file system. Se \u00e8 necessario comunicare con gli esterni, si possono usare mock, stub o dummies.<\/li>\n<\/ul>\n\n\n\n<p>Tutto si complica quando vogliamo scrivere dei test di integrazione. Non \u00e8 male se vogliamo testare alcuni servizi insieme. Ma quando dobbiamo testare servizi che utilizzano risorse esterne, come database o servizi di messaggistica, allora ci troviamo in difficolt\u00e0.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Per eseguire il test, \u00e8 necessario installare...<\/h3>\n\n\n\n<p>Molti anni fa, quando volevamo realizzare alcuni test di integrazione e utilizzare, ad esempio, i database, avevamo due opzioni:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Possiamo installare un database in locale. Impostare uno schema e connettersi dal nostro test;<\/li>\n\n\n\n<li>Possiamo collegarci a un'istanza esistente \"da qualche parte nello spazio\".<\/li>\n<\/ol>\n\n\n\n<p>Entrambi hanno dei pro, entrambi hanno dei contro. Ma entrambi introducono ulteriori livelli di complessit\u00e0. A volte si trattava di complessit\u00e0 tecnica derivante dalle caratteristiche di alcuni strumenti, ad esempio l'installazione e la gestione di un DB Oracle su localhost. A volte si trattava di un inconveniente nel processo, ad esempio la necessit\u00e0 di accordarsi con il test <a href=\"https:\/\/thecodest.co\/it\/dictionary\/how-to-lead-software-development-team\/\">squadra<\/a> sull'uso di JMS... ogni volta che si vogliono eseguire i test.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Contenitori in soccorso<\/h3>\n\n\n\n<p>Negli ultimi 10 anni, l'idea della containerizzazione si \u00e8 affermata nel settore. Quindi, la decisione naturale \u00e8 quella di scegliere i container come soluzione per il nostro problema di test di integrazione. Si tratta di una soluzione semplice e pulita. Basta eseguire la build del processo e tutto funziona! Non ci credete? Date un'occhiata a questa semplice configurazione di una build di 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         test-compile\n         \n           up\n         \n         \n           ${<a href=\"https:\/\/thecodest.co\/it\/dictionary\/why-do-projects-fail\/\">progetto<\/a>.basedir}\/docker-compose.yml\n           true\n         \n       \n       \n         down\n         post-integrazione-test\n         \n           down\n         \n         \n           ${project.basedir}\/docker-compose.yml\n           true<\/code><\/pre>\n\n\n\n<p>E il <code>docker-compose.yml<\/code> Anche il file \u00e8 molto bello!<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"yaml\" class=\"language-yaml\">versione: \"3.5\"\n\nservizi:\n\n postgres:\n   nome_contenitore: reactivedb\n   immagine: postgres:13.2\n   riavvio: sempre\n   ambiente:\n     - UTENTE_POSTGRES=admin\n     - POSTGRES_PASSWORD=password\n     - POSTGRES_DB=citt\u00e0\n   porte:\n     - \"5432:5432\"\n   volumi:\n     - postgres_data:\/data\/db\n\n pgadmin:\n   nome_contenitore: pgadmin4\n   immagine: dpage\/pgadmin4\n   riavvio: sempre\n   ambiente:\n     PGADMIN_DEFAULT_EMAIL: admin@admin.com\n     PGADMIN_DEFAULT_PASSWORD: password\n   porte:\n     - \"15050:80\"\n   volumi:\n     - pgadmin_data:\/data\/pgadmin\n\nvolumi:\n postgres_data:\n pgadmin_data:<\/code><\/pre>\n\n\n\n<p>Ma riuscite a individuare il problema?<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Una nave da carico che blocca tutto<\/h3>\n\n\n\n<p>L'esempio precedente \u00e8 molto semplice. Solo un database postgres, pgAdmin e tutto il resto. Quando si esegue<\/p>\n\n\n\n<p><code>bash<br>\n$ mvn clean verify<br>\n<\/code><br>poi il plugin di maven avvia i contenitori e dopo i test li spegne. I problemi iniziano quando il progetto cresce e anche il nostro file di composizione cresce. Ogni volta \u00e8 necessario avviare tutti i contenitori, che rimarranno in vita per l'intera compilazione. Si pu\u00f2 migliorare un po' la situazione modificando la configurazione di esecuzione dei plugin, ma non \u00e8 sufficiente. Nel peggiore dei casi, i contenitori esauriscono le risorse del sistema prima dell'avvio dei test!<\/p>\n\n\n\n<p>E questo non \u00e8 l'unico problema. Non \u00e8 possibile eseguire un singolo test di integrazione dall'IDE. Prima di ci\u00f2, \u00e8 necessario avviare i contenitori a mano. Inoltre, l'esecuzione successiva di maven distrugger\u00e0 i contenitori (si veda la sezione <code>gi\u00f9<\/code> esecuzione).<\/p>\n\n\n\n<p>Quindi questa soluzione \u00e8 come una grande nave da carico. Se tutto funziona bene, allora \u00e8 tutto ok. Qualsiasi comportamento inaspettato o insolito porta <a href=\"https:\/\/thecodest.co\/it\/blog\/why-us-companies-are-opting-for-polish-developers\/\">noi<\/a> a un qualche tipo di disastro.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Contenitori di test: eseguire i contenitori dai test<\/h2>\n\n\n\n<p>Ma cosa succederebbe se potessimo eseguire i nostri container dai test? L'idea sembra buona e viene gi\u00e0 implementata. <a href=\"https:\/\/www.testcontainers.org\/\" rel=\"nofollow\">Contenitori di prova<\/a>Poich\u00e9 stiamo parlando di questo progetto, ecco una soluzione per i nostri problemi. Non \u00e8 l'ideale, ma nessuno \u00e8 perfetto.<\/p>\n\n\n\n<p>Questo \u00e8 un <strong><a href=\"https:\/\/thecodest.co\/it\/blog\/top-programming-languages-to-build-e-commerce\/\">Java<\/a><\/strong> che supporta i test JUnit e Spock, fornendo modi leggeri e semplici per eseguire il programma <a href=\"https:\/\/thecodest.co\/it\/dictionary\/docker-developer\/\">Docker<\/a> contenitore. Diamo un'occhiata e scriviamo un po' di codice!<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Prerequisiti e configurazione<\/h3>\n\n\n\n<p>Prima di iniziare, dobbiamo verificare la nostra configurazione. <strong>Contenitori di prova<\/strong> necessit\u00e0:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Docker nella versione v17.09,<\/li>\n\n\n\n<li>Java versione minima 1.8,<\/li>\n\n\n\n<li>Accesso alla rete, in particolare a docker.hub.<\/li>\n<\/ul>\n\n\n\n<p>Per maggiori informazioni sui requisiti per i sistemi operativi e gli IC specifici, consultare la sezione<br>in <a href=\"https:\/\/www.testcontainers.org\/supported_docker_environment\/\" rel=\"nofollow\">documentazione<\/a>.<\/p>\n\n\n\n<p>Ora \u00e8 il momento di aggiungere alcune righe a <code>pom.xml<\/code>.<\/p>\n\n\n\n<aside>Uso Spring Boot nel progetto per ridurre il boilerplate. <strong>Contenitori di prova<\/strong> sono indipendenti da Spring Framework e si possono usare anche senza.<\/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       import\n     \n   \n \n \n   \n     org.postgresql\n     postgresql\n     runtime\n   \n   \n     org.testcontainers\n     postgresql\n     test\n   \n   \n     org.testcontainers\n     junit-jupiter\n     test<\/code><\/pre>\n\n\n\n<p>Uso <strong>Contenitori di prova<\/strong> versione <code>1.17.3<\/code>, ma sentitevi liberi di usare quello pi\u00f9 recente.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Test con il contenitore Postgres<\/h3>\n\n\n\n<p>Il primo passo \u00e8 preparare l'istanza di un contenitore. \u00c8 possibile farlo direttamente nel test, ma \u00e8 meglio utilizzare una classe indipendente.<\/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   \/\/ non fa nulla. Questa \u00e8 un'istanza condivisa. Lasciamo che sia la JVM a gestire questa operazione.\n }\n}\n<\/code><\/pre>\n\n\n\n<p>All'inizio dei test, creeremo un'istanza di <code>Postgres13TC<\/code>. Questa classe pu\u00f2 gestire le informazioni sul nostro contenitore. Le pi\u00f9 importanti sono le stringhe di connessione al database e le credenziali. Ora \u00e8 il momento di scrivere un test molto semplice.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"java\" class=\"language-java\">@Contenitori di test\nclasse SimpleDbTest {\n\n @Container\n private static Postgres13TC = Postgres13TC.getInstance();\n\n @Test\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>Qui uso JUnit 5. Annotazione <code>@Testcontainers<\/code> fa parte delle estensioni che controllano i contenitori nell'ambiente di test. Trovano tutti i campi con <code>@Contenitore<\/code> e i contenitori start e stop, rispettivamente.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Test con Spring Boot<\/h3>\n\n\n\n<p>Come ho gi\u00e0 detto, nel progetto utilizzo Spring Boot. In questo caso, dobbiamo scrivere un po' di codice in pi\u00f9. Il primo passo \u00e8 creare una classe di configurazione aggiuntiva.<\/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>Questa classe sovrascrive le propriet\u00e0 esistenti con i valori della classe <strong>contenitore di prova<\/strong>. Le prime tre propriet\u00e0 sono propriet\u00e0 standard di Spring. Le cinque successive sono propriet\u00e0 aggiuntive e personalizzate, che possono essere utilizzate per configurare altre risorse ed estensioni come liquibase, ad esempio:<\/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>Ora \u00e8 il momento di definire un semplice test di integrazione.<\/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@Contenitori di test\nclass DummyRepositoryTest {\n\n @Autowired\n private DummyRepository;\n\n @Test\n void shouldReturnDummy() {\n   var byId = dummyRepository.getById(10L);\n   var expected = new Dummy();\n   expected.setId(10L);\n   assertThat(byId).complet().emitsCount(1).emits(expected);\n }\n}<\/code><\/pre>\n\n\n\n<p>Qui abbiamo alcune annotazioni aggiuntive.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>@SpringBootTest(webEnvironment = RANDOM_PORT)<\/code> - contrassegna il test come test Spring Boot e avvia il contesto Spring.<\/li>\n\n\n\n<li><code>@AutoConfigureTestDatabase(replace = NONE)<\/code> - queste annotazioni dicono che l'estensione Spring Test non deve sostituire la configurazione del database postgres con H2 nella configurazione della memoria.<\/li>\n\n\n\n<li><code>@ContextConfiguration(initializers = ContainerInit.class)<\/code> - un ulteriore contesto di primavera<br>in cui si impostano le propriet\u00e0 da <strong>Contenitori di prova<\/strong>.<\/li>\n\n\n\n<li><code>@Testcontainers<\/code> - come gi\u00e0 detto, questa annotazione controlla il ciclo di vita del contenitore.<\/li>\n<\/ul>\n\n\n\n<p>In questo esempio, utilizzo repository reattivi, ma funziona allo stesso modo con i comuni repository JDBC e JPA.<\/p>\n\n\n\n<p>Ora possiamo eseguire il test. Se \u00e8 la prima esecuzione, il motore deve prelevare le immagini da docker.hub. Potrebbe volerci un attimo. Dopodich\u00e9, vedremo che sono stati eseguiti due contenitori. Uno \u00e8 postgres e l'altro \u00e8 il controller Testcontainers. Il secondo contenitore gestisce i contenitori in esecuzione e, anche se la JVM si arresta inaspettatamente, spegne i contenitori e pulisce l'ambiente.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Riassumiamo<\/h2>\n\n\n\n<p><strong>Contenitori di prova<\/strong> sono strumenti molto semplici da usare che ci aiutano a creare test di integrazione che utilizzano i container Docker. Questo ci offre maggiore flessibilit\u00e0 e aumenta la velocit\u00e0 di sviluppo. L'impostazione corretta della configurazione dei test riduce il tempo necessario per i nuovi sviluppatori. Non devono impostare tutte le dipendenze, ma solo eseguire i test scritti con i file di configurazione selezionati.<\/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=\"banner di cooperazione\"\/><\/a><\/figure>","protected":false},"excerpt":{"rendered":"<p>Siete alla ricerca di un modo per realizzare i test in modo pi\u00f9 semplice? Abbiamo trovato il modo! Consultate il seguente articolo e scoprite come renderlo possibile.<\/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\/it\/blog\/contenitori-di-test-come-semplificare-i-test\/\" \/>\n<meta property=\"og:locale\" content=\"it_IT\" \/>\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\/it\/blog\/contenitori-di-test-come-semplificare-i-test\/\" \/>\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\":\"it-IT\",\"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\":\"it-IT\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/thecodest.co\\\/blog\\\/test-containers-how-to-make-tests-easier\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"it-IT\",\"@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\":\"it-IT\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/thecodest.co\\\/#organization\",\"name\":\"The Codest\",\"url\":\"https:\\\/\\\/thecodest.co\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"it-IT\",\"@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\":\"it-IT\",\"@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\\\/it\\\/author\\\/thecodest\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Contenitori di test - Come semplificare i test? - 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\/it\/blog\/contenitori-di-test-come-semplificare-i-test\/","og_locale":"it_IT","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\/it\/blog\/contenitori-di-test-come-semplificare-i-test\/","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":"it-IT","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":"Contenitori di test - Come semplificare i test? - 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":"it-IT","potentialAction":[{"@type":"ReadAction","target":["https:\/\/thecodest.co\/blog\/test-containers-how-to-make-tests-easier\/"]}]},{"@type":"ImageObject","inLanguage":"it-IT","@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":"it-IT"},{"@type":"Organization","@id":"https:\/\/thecodest.co\/#organization","name":"The Codest","url":"https:\/\/thecodest.co\/","logo":{"@type":"ImageObject","inLanguage":"it-IT","@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":"it-IT","@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\/it\/author\/thecodest\/"}]}},"_links":{"self":[{"href":"https:\/\/thecodest.co\/it\/wp-json\/wp\/v2\/posts\/3631","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/thecodest.co\/it\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/thecodest.co\/it\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/thecodest.co\/it\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/thecodest.co\/it\/wp-json\/wp\/v2\/comments?post=3631"}],"version-history":[{"count":9,"href":"https:\/\/thecodest.co\/it\/wp-json\/wp\/v2\/posts\/3631\/revisions"}],"predecessor-version":[{"id":8016,"href":"https:\/\/thecodest.co\/it\/wp-json\/wp\/v2\/posts\/3631\/revisions\/8016"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/thecodest.co\/it\/wp-json\/wp\/v2\/media\/3632"}],"wp:attachment":[{"href":"https:\/\/thecodest.co\/it\/wp-json\/wp\/v2\/media?parent=3631"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/thecodest.co\/it\/wp-json\/wp\/v2\/categories?post=3631"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/thecodest.co\/it\/wp-json\/wp\/v2\/tags?post=3631"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}