{"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":"testcontainere-hvordan-gjore-tester-enklere","status":"publish","type":"post","link":"https:\/\/thecodest.co\/nb\/blog\/test-containers-how-to-make-tests-easier\/","title":{"rendered":"Testcontainere - Hvordan gj\u00f8re tester enklere?"},"content":{"rendered":"<p>Moderne applikasjonsutvikling er basert p\u00e5 \u00e9n enkel regel:<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p><b>Bruk sammensetning<\/b><\/p>\n<\/blockquote>\n\n\n\n<p>Vi setter sammen klasser, funksjoner og tjenester til st\u00f8rre deler av programvaren. Det siste elementet er grunnlaget for <a href=\"https:\/\/thecodest.co\/nb\/dictionary\/microservices\/\">mikrotjenester<\/a> og <a href=\"https:\/\/thecodest.co\/nb\/blog\/the-power-of-hexagonal-architecture\/\">sekskantet arkitektur<\/a>. Vi \u00f8nsker \u00e5 bruke eksisterende l\u00f8sninger, integrere dem med programvaren v\u00e5r og g\u00e5 rett p\u00e5 <a href=\"https:\/\/thecodest.co\/nb\/dictionary\/what-is-the-size-of-your-potential-reachable-market\/\">marked<\/a>.<\/p>\n\n\n\n<p>\u00d8nsker du \u00e5 h\u00e5ndtere kontoregistrering og lagre bruker <a href=\"https:\/\/thecodest.co\/nb\/blog\/app-data-collection-security-risks-value-and-types-explored\/\">data<\/a>? Du kan velge en av OAuth-tjenestene. Kanskje applikasjonen din tilbyr en form for abonnement eller betaling? Det finnes mange tjenester som kan hjelpe deg med \u00e5 h\u00e5ndtere dette. Trenger du noen analyser p\u00e5 nettstedet ditt, men forst\u00e5r ikke <a href=\"https:\/\/thecodest.co\/nb\/blog\/cyber-security-dilemmas-data-leaks\/\">GDPR<\/a>? Ta gjerne en av de ferdige l\u00f8sningene.<\/p>\n\n\n\n<p>Noe som gj\u00f8r utvikling s\u00e5 enkelt fra et forretningsmessig synspunkt, kan gi deg hodepine - n\u00e5r du skal skrive en enkel test.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">De fantastiske dyrene: K\u00f8er, databaser og hvordan du tester dem<\/h2>\n\n\n\n<p>Enhetstesting er ganske enkelt. Hvis du bare f\u00f8lger reglene, vil testmilj\u00f8et ditt og <a href=\"https:\/\/thecodest.co\/nb\/dictionary\/what-is-code-refactoring\/\">kode<\/a> er sunne. Hvilke regler er det?<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><b>Lett \u00e5 skrive<\/b> - en enhetstest skal v\u00e6re enkel \u00e5 skrive fordi du skriver mange av dem. Mindre innsats betyr at det skrives flere tester.<\/li>\n\n\n\n<li><b>Lesbar<\/b> - testkoden skal v\u00e6re lett \u00e5 lese. Testen er en historie. Den beskriver hvordan programvaren oppf\u00f8rer seg, og kan brukes som en snarvei til dokumentasjon. En god enhetstest hjelper deg med \u00e5 fikse feil uten \u00e5 feils\u00f8ke koden.<\/li>\n\n\n\n<li><b>P\u00e5litelig<\/b> - testen skal bare feile hvis det er en feil i systemet som testes. Er det \u00e5penbart? Ikke alltid. Noen ganger best\u00e5r tester hvis du kj\u00f8rer dem \u00e9n og \u00e9n, men feiler n\u00e5r du kj\u00f8rer dem som et sett. De best\u00e5r p\u00e5 din maskin, men feiler p\u00e5 CI (<a href=\"https:\/\/blog.codinghorror.com\/the-works-on-my-machine-certification-program\/\">Fungerer p\u00e5 min maskin<\/a>). En god enhetstest har bare \u00e9n \u00e5rsak til feil.<\/li>\n\n\n\n<li><b>Rask<\/b> - testene skal v\u00e6re raske. Forberedelse til kj\u00f8ring, start og selve testutf\u00f8relsen b\u00f8r g\u00e5 sv\u00e6rt raskt. Ellers vil du skrive dem, men ikke kj\u00f8re dem. Sakte tester betyr tapt fokus. Du venter og ser p\u00e5 fremdriftslinjen.<\/li>\n\n\n\n<li><b>Uavhengig<\/b> - Til slutt skal testen v\u00e6re uavhengig. Denne regelen stammer fra de foreg\u00e5ende. Bare virkelig uavhengige tester kan bli en enhet. De forstyrrer ikke hverandre, kan kj\u00f8res i hvilken som helst rekkef\u00f8lge, og potensielle feil avhenger ikke av resultatene fra andre tester. Uavhengige betyr ogs\u00e5 at de ikke er avhengige av eksterne ressurser som databaser, meldingstjenester eller filsystem. Hvis du trenger \u00e5 kommunisere med eksterne ressurser, kan du bruke mocks, stubber eller dummies.<\/li>\n<\/ul>\n\n\n\n<p>Alt blir komplisert n\u00e5r vi \u00f8nsker \u00e5 skrive noen integrasjonstester. Det er ikke s\u00e5 ille hvis vi \u00f8nsker \u00e5 teste noen f\u00e5 tjenester sammen. Men n\u00e5r vi skal teste tjenester som bruker eksterne ressurser, som databaser eller meldingstjenester, er vi ute p\u00e5 dypt vann.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">For \u00e5 kj\u00f8re testen m\u00e5 du installere...<\/h3>\n\n\n\n<p>For mange \u00e5r siden, da vi \u00f8nsket \u00e5 lage integrasjonstester og bruke f.eks. databaser, hadde vi to alternativer:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Vi kan installere en database lokalt. Sett opp et skjema og koble til fra testen v\u00e5r;<\/li>\n\n\n\n<li>Vi kan koble oss til en eksisterende instans \"et sted i verdensrommet\".<\/li>\n<\/ol>\n\n\n\n<p>Begge hadde fordeler, begge hadde ulemper. Men begge introduserer flere niv\u00e5er av kompleksitet. Noen ganger var det teknisk kompleksitet som f\u00f8lge av egenskapene til visse verkt\u00f8y, f.eks. installasjon og administrasjon av Oracle DB p\u00e5 din lokale host. Noen ganger var det en ulempe i prosessen, f.eks. at du m\u00e5 bli enig med test <a href=\"https:\/\/thecodest.co\/nb\/dictionary\/how-to-lead-software-development-team\/\">team<\/a> om JMS-bruk hver gang du vil kj\u00f8re tester.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Containere til unnsetning<\/h3>\n\n\n\n<p>I l\u00f8pet av de siste ti \u00e5rene har ideen om containerisering blitt anerkjent i bransjen. Derfor var det naturlig \u00e5 velge containere som l\u00f8sning p\u00e5 integrasjonstestproblemet v\u00e5rt. Dette er en enkel og ren l\u00f8sning. Du kj\u00f8rer bare prosessbyggingen, s\u00e5 fungerer alt! Kan du ikke tro det? Ta en titt p\u00e5 denne enkle konfigurasjonen av en maven-build:<\/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-kompilere\n         \n           opp\n         \n         \n           ${<a href=\"https:\/\/thecodest.co\/nb\/dictionary\/why-do-projects-fail\/\">prosjekt<\/a>.basedir}\/docker-compose.yml.\n           true\n         \n       \n       \n         down\n         post-integrasjonstest\n         \n           ned\n         \n         \n           ${project.basedir}\/docker-compose.yml true\n           true<\/code><\/pre>\n\n\n\n<p>Og <code>docker-compose.yml<\/code> filen ser ogs\u00e5 ganske fin ut!<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"yaml\" class=\"language-yaml\">versjon: \"3.5\"\n\ntjenester:\n\n postgres:\n   container_name: reactivedb\n   image: postgres:13.2\n   restart: alltid\n   environment:\n     - POSTGRES_USER=admin\n     - POSTGRES_PASSWORD=passord\n     - POSTGRES_DB=byer\n   ports:\n     - \"5432:5432\"\n   volumes:\n     - postgres_data:\/data\/db\n\n pgadmin:\n   container_name: pgadmin4\n   image: dpage\/pgadmin4\n   restart: alltid\n   environment:\n     PGADMIN_DEFAULT_EMAIL: admin@admin.com\n     PGADMIN_DEFAULT_PASSWORD: password\n   ports:\n     - \"15050:80\"\n   volumer\n     - pgadmin_data:\/data\/pgadmin\n\nvolumes:\n postgres_data:\n pgadmin_data:<\/code><\/pre>\n\n\n\n<p>Men kan du se problemet her?<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Et lasteskip som blokkerer alt<\/h3>\n\n\n\n<p>Eksemplet ovenfor er veldig enkelt. Bare \u00e9n postgres-database, pgAdmin og det er alt. N\u00e5r du kj\u00f8rer<\/p>\n\n\n\n<p><code>bash<br>\n$ mvn clean verify<br>\n<\/code><br>s\u00e5 starter maven-plugin-modulen containerne og sl\u00e5r dem av etter testene. Problemene oppst\u00e5r n\u00e5r prosjektet vokser, og Compose-filen v\u00e5r ogs\u00e5 vokser. Hver gang m\u00e5 du starte alle containerne, og de vil v\u00e6re i live gjennom hele byggingen. Du kan gj\u00f8re situasjonen litt bedre ved \u00e5 endre konfigurasjonen for kj\u00f8ring av plugin-modulen, men det er ikke nok. I verste fall bruker containerne opp systemressursene dine f\u00f8r testene starter!<\/p>\n\n\n\n<p>Og dette er ikke det eneste problemet. Du kan ikke kj\u00f8re en eneste integrasjonstest fra IDE-en din. F\u00f8r det m\u00e5 du starte containerne for h\u00e5nd. Dessuten vil neste maven-kj\u00f8ring rive ned disse containerne (ta en titt p\u00e5 <code>ned<\/code> utf\u00f8relse).<\/p>\n\n\n\n<p>S\u00e5 denne l\u00f8sningen er som et stort lasteskip. Hvis alt fungerer som det skal, er alt i orden. Enhver uventet eller uvanlig oppf\u00f8rsel f\u00f8rer til <a href=\"https:\/\/thecodest.co\/nb\/blog\/why-us-companies-are-opting-for-polish-developers\/\">oss<\/a> til en slags katastrofe.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Testcontainere - kj\u00f8r containere fra tester<\/h2>\n\n\n\n<p>Men hva om vi kunne kj\u00f8re containerne v\u00e5re fra tester? Denne ideen ser god ut, og den er allerede i ferd med \u00e5 bli implementert. <a href=\"https:\/\/www.testcontainers.org\/\" rel=\"nofollow\">Testcontainere<\/a>Siden vi snakker om dette prosjektet, her er en l\u00f8sning p\u00e5 problemene v\u00e5re. Ikke ideelt, men ingen er perfekt.<\/p>\n\n\n\n<p>Dette er en <strong><a href=\"https:\/\/thecodest.co\/nb\/blog\/top-programming-languages-to-build-e-commerce\/\">Java<\/a><\/strong> som st\u00f8tter JUnit- og Spock-tester, noe som gir lette og enkle m\u00e5ter \u00e5 kj\u00f8re <a href=\"https:\/\/thecodest.co\/nb\/dictionary\/docker-developer\/\">Docker<\/a> container. La oss ta en titt p\u00e5 den og skrive litt kode!<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Forutsetninger og konfigurasjon<\/h3>\n\n\n\n<p>F\u00f8r vi begynner, m\u00e5 vi sjekke konfigurasjonen v\u00e5r. <strong>Testbeholdere<\/strong> behov:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Docker i versjon v17.09,<\/li>\n\n\n\n<li>Java minimum versjon 1.8,<\/li>\n\n\n\n<li>Tilgang til nettverk, spesielt til docker.hub.<\/li>\n<\/ul>\n\n\n\n<p>Mer om kravene til spesifikke operativsystemer og CI finner du her<br>i <a href=\"https:\/\/www.testcontainers.org\/supported_docker_environment\/\" rel=\"nofollow\">dokumentasjon<\/a>.<\/p>\n\n\n\n<p>N\u00e5 er det p\u00e5 tide \u00e5 legge til noen linjer til <code>pom.xml<\/code>.<\/p>\n\n\n\n<aside>Jeg bruker Spring Boot i prosjektet for \u00e5 redusere boilerplate. <strong>Testbeholdere<\/strong> er uavhengige av Spring Framework, og du kan bruke dem uten det.<\/aside>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"xml\" class=\"language-xml\">org.testcontainers\n       testcontainers-bom $\n       ${testcontainers.versjon}\n       pom\n       import\n     \n   \n  \n \n   \n     org.postgresql\n     postgresql runtime&lt;\/s\/s\n     runtime\n   \n   \n     org.testcontainers\n     postgresql test\n     test\n   \n   \n     org.testcontainers\n     junit-jupiter test&lt;\/scope\n     test<\/code><\/pre>\n\n\n\n<p>Jeg bruker <strong>Testbeholdere<\/strong> versjon <code>1.17.3<\/code>men bruk gjerne den nyeste.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Tester med Postgres-container<\/h3>\n\n\n\n<p>Det f\u00f8rste trinnet er \u00e5 klargj\u00f8re en containerforekomst. Du kan gj\u00f8re det direkte i testen, men det ser bedre ut med en uavhengig klasse.<\/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   \/\/ gj\u00f8r ingenting. Dette er en delt instans. La JVM h\u00e5ndtere denne operasjonen.\n }\n}\n<\/code><\/pre>\n\n\n\n<p>I begynnelsen av testene oppretter vi en forekomst av <code>Postgres13TC<\/code>. Denne klassen kan h\u00e5ndtere informasjon om containeren v\u00e5r. Det viktigste her er databasens tilkoblingsstrenger og legitimasjon. N\u00e5 er det p\u00e5 tide \u00e5 skrive en veldig enkel test.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"java\" class=\"language-java\">@Testcontainere\nclass 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>Jeg bruker JUnit 5 her. Annotasjon <code>@Testcontainere<\/code> er en del av utvidelsene som kontrollerer containere i testmilj\u00f8et. De finner alle felt med <code>@Container<\/code> annotasjon og henholdsvis start- og stoppcontainere.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Tester med Spring Boot<\/h3>\n\n\n\n<p>Som jeg nevnte tidligere, bruker jeg Spring Boot i prosjektet. I dette tilfellet m\u00e5 vi skrive litt mer kode. Det f\u00f8rste trinnet er \u00e5 opprette en ekstra konfigurasjonsklasse.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"java\" class=\"language-java\">@Slf4j\npublic class ContainerInit implementerer\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>Denne klassen overstyrer de eksisterende egenskapene med verdier fra <strong>testbeholder<\/strong>. De tre f\u00f8rste egenskapene er standard Spring-egenskaper. De neste fem er ekstra, tilpassede egenskaper som kan brukes til \u00e5 konfigurere andre ressurser og utvidelser som f.eks. liquibase:<\/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>N\u00e5 er det p\u00e5 tide \u00e5 definere en enkel integrasjonstest.<\/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(initialisatorer = ContainerInit.class)\n@Testcontainere\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).completes().emitsCount(1).emits(expected);\n }\n}<\/code><\/pre>\n\n\n\n<p>Vi har noen ekstra kommentarer her.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>@SpringBootTest(webEnvironment = RANDOM_PORT)<\/code> - markerer testen som en Spring Boot-test og starter Spring-konteksten.<\/li>\n\n\n\n<li><code>@AutoConfigureTestDatabase(replace = NONE)<\/code> - disse merknadene sier at v\u00e5rens testutvidelse ikke skal erstatte postgres-databasekonfigurasjonen med H2 i minnekonfigurasjonen.<\/li>\n\n\n\n<li><code>@ContextConfiguration(initialisatorer = ContainerInit.class)<\/code> - en ekstra v\u00e5rkontekst<br>konfigurasjon der vi setter opp egenskaper fra <strong>Testbeholdere<\/strong>.<\/li>\n\n\n\n<li><code>@Testcontainere<\/code> - som tidligere nevnt, kontrollerer denne annotasjonen beholderens livssyklus.<\/li>\n<\/ul>\n\n\n\n<p>I dette eksempelet bruker jeg reaktive repositorier, men det fungerer p\u00e5 samme m\u00e5te med vanlige JDBC- og JPA-repositorier.<\/p>\n\n\n\n<p>N\u00e5 kan vi kj\u00f8re denne testen. Hvis det er f\u00f8rste gang, m\u00e5 motoren hente bilder fra docker.hub. Det kan ta et \u00f8yeblikk. Etter det vil vi se at to containere har kj\u00f8rt. Den ene er postgres og den andre er Testcontainers-kontrolleren. Den andre containeren administrerer containere som kj\u00f8rer, og selv om JVM uventet stopper, sl\u00e5r den av containerne og rydder opp i milj\u00f8et.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">La oss oppsummere<\/h2>\n\n\n\n<p><strong>Testbeholdere<\/strong> er sv\u00e6rt brukervennlige verkt\u00f8y som hjelper oss med \u00e5 lage integrasjonstester som bruker Docker-containere. Det gir oss mer fleksibilitet og \u00f8ker utviklingshastigheten. Riktig oppsett av testkonfigurasjon reduserer tiden det tar for nye utviklere \u00e5 g\u00e5 om bord. De trenger ikke \u00e5 sette opp alle avhengigheter, men kan bare kj\u00f8re de skrevne testene med utvalgte konfigurasjonsfiler.<\/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=\"samarbeidsbanner\"\/><\/a><\/figure>","protected":false},"excerpt":{"rendered":"<p>Leter du etter en m\u00e5te \u00e5 gj\u00f8re tester p\u00e5 en enklere m\u00e5te? Da har vi noe for deg! Sjekk f\u00f8lgende artikkel og l\u00e6r hvordan du kan gj\u00f8re det mulig.<\/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\/nb\/blogg\/testcontainere-hvordan-gjore-tester-enklere\/\" \/>\n<meta property=\"og:locale\" content=\"nb_NO\" \/>\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\/nb\/blogg\/testcontainere-hvordan-gjore-tester-enklere\/\" \/>\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\":\"nb-NO\",\"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\":\"nb-NO\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/thecodest.co\\\/blog\\\/test-containers-how-to-make-tests-easier\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"nb-NO\",\"@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\":\"nb-NO\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/thecodest.co\\\/#organization\",\"name\":\"The Codest\",\"url\":\"https:\\\/\\\/thecodest.co\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"nb-NO\",\"@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\":\"nb-NO\",\"@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\\\/nb\\\/author\\\/thecodest\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Testcontainere - Hvordan gj\u00f8re tester enklere? - 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\/nb\/blogg\/testcontainere-hvordan-gjore-tester-enklere\/","og_locale":"nb_NO","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\/nb\/blogg\/testcontainere-hvordan-gjore-tester-enklere\/","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":"nb-NO","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":"Testcontainere - Hvordan gj\u00f8re tester enklere? - 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":"nb-NO","potentialAction":[{"@type":"ReadAction","target":["https:\/\/thecodest.co\/blog\/test-containers-how-to-make-tests-easier\/"]}]},{"@type":"ImageObject","inLanguage":"nb-NO","@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":"nb-NO"},{"@type":"Organization","@id":"https:\/\/thecodest.co\/#organization","name":"The Codest","url":"https:\/\/thecodest.co\/","logo":{"@type":"ImageObject","inLanguage":"nb-NO","@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":"nb-NO","@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\/nb\/author\/thecodest\/"}]}},"_links":{"self":[{"href":"https:\/\/thecodest.co\/nb\/wp-json\/wp\/v2\/posts\/3631","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/thecodest.co\/nb\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/thecodest.co\/nb\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/thecodest.co\/nb\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/thecodest.co\/nb\/wp-json\/wp\/v2\/comments?post=3631"}],"version-history":[{"count":9,"href":"https:\/\/thecodest.co\/nb\/wp-json\/wp\/v2\/posts\/3631\/revisions"}],"predecessor-version":[{"id":8016,"href":"https:\/\/thecodest.co\/nb\/wp-json\/wp\/v2\/posts\/3631\/revisions\/8016"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/thecodest.co\/nb\/wp-json\/wp\/v2\/media\/3632"}],"wp:attachment":[{"href":"https:\/\/thecodest.co\/nb\/wp-json\/wp\/v2\/media?parent=3631"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/thecodest.co\/nb\/wp-json\/wp\/v2\/categories?post=3631"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/thecodest.co\/nb\/wp-json\/wp\/v2\/tags?post=3631"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}