{"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":"testcontainrar-hur-man-gor-tester-enklare","status":"publish","type":"post","link":"https:\/\/thecodest.co\/sv\/blog\/test-containers-how-to-make-tests-easier\/","title":{"rendered":"Testbeh\u00e5llare - Hur g\u00f6r man tester enklare?"},"content":{"rendered":"<p>Modern applikationsutveckling bygger p\u00e5 en enkel regel:<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p><b>Anv\u00e4nd sammans\u00e4ttning<\/b><\/p>\n<\/blockquote>\n\n\n\n<p>Vi s\u00e4tter samman klasser, funktioner och tj\u00e4nster till st\u00f6rre programvarubitar. Det sista elementet \u00e4r grunden f\u00f6r <a href=\"https:\/\/thecodest.co\/sv\/dictionary\/microservices\/\">mikrotj\u00e4nster<\/a> och <a href=\"https:\/\/thecodest.co\/sv\/blog\/the-power-of-hexagonal-architecture\/\">hexagonal arkitektur<\/a>. Vi skulle vilja anv\u00e4nda befintliga l\u00f6sningar, integrera dem med v\u00e5r programvara och g\u00e5 direkt till <a href=\"https:\/\/thecodest.co\/sv\/dictionary\/what-is-the-size-of-your-potential-reachable-market\/\">marknad<\/a>.<\/p>\n\n\n\n<p>Vill du hantera kontoregistrering och lagra anv\u00e4ndaruppgifter <a href=\"https:\/\/thecodest.co\/sv\/blog\/app-data-collection-security-risks-value-and-types-explored\/\">data<\/a>? Du kan v\u00e4lja en av OAuth-tj\u00e4nsterna. Kanske erbjuder din applikation n\u00e5gon form av prenumeration eller betalning? Det finns m\u00e5nga tj\u00e4nster som kan hj\u00e4lpa dig att hantera detta. Beh\u00f6ver du n\u00e5gon form av analys p\u00e5 din webbplats, men f\u00f6rst\u00e5r inte <a href=\"https:\/\/thecodest.co\/sv\/blog\/cyber-security-dilemmas-data-leaks\/\">GDPR<\/a>? K\u00e4nn dig fri och ta en av de f\u00e4rdiga l\u00f6sningarna.<\/p>\n\n\n\n<p>N\u00e5got som g\u00f6r utvecklingen s\u00e5 enkel ur aff\u00e4rssynpunkt kan ge dig huvudv\u00e4rk - i det \u00f6gonblick du beh\u00f6ver skriva ett enkelt test.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">De fantastiska djuren: K\u00f6er, databaser och hur man testar dem<\/h2>\n\n\n\n<p>Enhetstestning \u00e4r ganska enkelt. Om du bara f\u00f6ljer reglerna, s\u00e5 kommer din testmilj\u00f6 och <a href=\"https:\/\/thecodest.co\/sv\/dictionary\/what-is-code-refactoring\/\">kod<\/a> \u00e4r h\u00e4lsosamma. Vilka regler \u00e4r det?<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><b>L\u00e4tt att skriva<\/b> - ett enhetstest ska vara l\u00e4tt att skriva eftersom du skriver m\u00e5nga av dem. Mindre anstr\u00e4ngning inneb\u00e4r att fler tester skrivs.<\/li>\n\n\n\n<li><b>L\u00e4sbar<\/b> - testkoden ska vara l\u00e4ttl\u00e4st. Testet \u00e4r en ber\u00e4ttelse. Det beskriver programvarans beteende och kan anv\u00e4ndas som en genv\u00e4g till dokumentation. Ett bra enhetstest hj\u00e4lper dig att \u00e5tg\u00e4rda buggar utan att fels\u00f6ka koden.<\/li>\n\n\n\n<li><b>P\u00e5litlig<\/b> - testet ska bara misslyckas om det finns en bugg i det system som testas. Sj\u00e4lvklart? Inte alltid. Ibland godk\u00e4nns tester om du k\u00f6r dem en och en, men misslyckas n\u00e4r du k\u00f6r dem som en upps\u00e4ttning. De godk\u00e4nns p\u00e5 din maskin, men misslyckas p\u00e5 CI (<a href=\"https:\/\/blog.codinghorror.com\/the-works-on-my-machine-certification-program\/\">Fungerar p\u00e5 min maskin<\/a>). Ett bra enhetstest har bara en anledning till att misslyckas.<\/li>\n\n\n\n<li><b>Snabb<\/b> - Testerna ska vara snabba. F\u00f6rberedelser f\u00f6r att k\u00f6ra, starta och sj\u00e4lva testk\u00f6rningen b\u00f6r vara mycket snabb. Annars kommer du att skriva dem, men inte k\u00f6ra dem. L\u00e5ngsamma tester inneb\u00e4r f\u00f6rlorat fokus. Du v\u00e4ntar och tittar p\u00e5 f\u00f6rloppsindikatorn.<\/li>\n\n\n\n<li><b>Oberoende<\/b> - Slutligen ska testet vara oberoende. Denna regel h\u00e4rr\u00f6r fr\u00e5n de f\u00f6reg\u00e5ende. Endast verkligt oberoende tester kan bli en enhet. De st\u00f6r inte varandra, kan k\u00f6ras i vilken ordning som helst och eventuella fel beror inte p\u00e5 resultaten fr\u00e5n andra tester. Oberoende inneb\u00e4r ocks\u00e5 att det inte finns n\u00e5got beroende av externa resurser som databaser, meddelandetj\u00e4nster eller filsystem. Om du beh\u00f6ver kommunicera med externa resurser kan du anv\u00e4nda mocks, stubbar eller dummies.<\/li>\n<\/ul>\n\n\n\n<p>Allt blir komplicerat n\u00e4r vi vill skriva n\u00e5gra integrationstester. Det \u00e4r inte s\u00e5 illa om vi vill testa n\u00e5gra tj\u00e4nster tillsammans. Men n\u00e4r vi beh\u00f6ver testa tj\u00e4nster som anv\u00e4nder externa resurser som databaser eller meddelandetj\u00e4nster, d\u00e5 \u00e4r vi ute p\u00e5 hal is.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">F\u00f6r att k\u00f6ra testet m\u00e5ste du installera...<\/h3>\n\n\n\n<p>F\u00f6r m\u00e5nga \u00e5r sedan, n\u00e4r vi ville g\u00f6ra n\u00e5gra integrationstester och anv\u00e4nda t.ex. databaser, hade vi tv\u00e5 alternativ:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Vi kan installera en databas lokalt. St\u00e4ll in ett schema och anslut fr\u00e5n v\u00e5rt test;<\/li>\n\n\n\n<li>Vi kan koppla upp oss mot en befintlig instans \"n\u00e5gonstans i rymden\".<\/li>\n<\/ol>\n\n\n\n<p>B\u00e5da hade f\u00f6rdelar, b\u00e5da hade nackdelar. Men b\u00e5da introducerar ytterligare niv\u00e5er av komplexitet. Ibland var det teknisk komplexitet som uppstod p\u00e5 grund av egenskaperna hos vissa verktyg, t.ex. installation och hantering av Oracle DB p\u00e5 ditt lokala webbhotell. Ibland var det en ol\u00e4genhet i processen, t.ex. att du m\u00e5ste h\u00e5lla med om testet <a href=\"https:\/\/thecodest.co\/sv\/dictionary\/how-to-lead-software-development-team\/\">Team<\/a> om JMS-anv\u00e4ndning ... varje g\u00e5ng du vill k\u00f6ra tester.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Containrar till unds\u00e4ttning<\/h3>\n\n\n\n<p>Under de senaste 10 \u00e5ren har id\u00e9n om containerisering f\u00e5tt ett erk\u00e4nnande i branschen. S\u00e5 ett naturligt beslut \u00e4r att v\u00e4lja containrar som en l\u00f6sning p\u00e5 v\u00e5rt integrationstestproblem. Det h\u00e4r \u00e4r en enkel och ren l\u00f6sning. Du k\u00f6r bara din process build och allt fungerar! Kan du inte tro det? Ta en titt p\u00e5 den h\u00e4r enkla konfigurationen 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         upp\n         test-kompilera\n         \n           upp\n          &lt;\/goals\n         \n           ${<a href=\"https:\/\/thecodest.co\/sv\/dictionary\/why-do-projects-fail\/\">projekt<\/a>.basedir}\/docker-compose.yml\n           troligt\n         \n       \n       \n         ned\n         test efter integration\n         \n           nedg\u00e5ng\n         \n         \n           ${project.basedir}\/docker-compose.yml\n           troget\n         \n       \n     \n    &lt;\/plugin\n  &lt;\/plugins<\/code><\/pre>\n\n\n\n<p>Och <code>docker-compose.yml<\/code> filen ser ocks\u00e5 ganska bra ut!<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"yaml\" class=\"language-yaml\">version: \"3.5\"\n\ntj\u00e4nster:\n\n postgres:\n   container_namn: reactivedb\n   image: postgres:13.2\n   omstart: alltid\n   milj\u00f6:\n     - POSTGRES_USER=admin\n     - POSTGRES_PASSWORD=password\n     - POSTGRES_DB=st\u00e4der\n   portar:\n     - \"5432:5432\"\n   volymer:\n     - postgres_data:\/data\/db\n\n pgadmin:\n   beh\u00e5llarens_namn: pgadmin4\n   avbildning: dpage\/pgadmin4\n   omstart: alltid\n   milj\u00f6:\n     PGADMIN_DEFAULT_EMAIL: admin@admin.com\n     PGADMIN_DEFAULT_PASSWORD: l\u00f6senord\n   portar:\n     - \"15050:80\"\n   volymer:\n     - pgadmin_data:\/data\/pgadmin\n\nvolymer:\n postgres_data:\n pgadmin_data:<\/code><\/pre>\n\n\n\n<p>Men kan du se problemet h\u00e4r?<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Ett lastfartyg som blockerar allt<\/h3>\n\n\n\n<p>Exemplet ovan \u00e4r mycket enkelt. Bara en postgres-databas, pgAdmin och det \u00e4r allt. N\u00e4r du k\u00f6r<\/p>\n\n\n\n<p><code>bash<br>\n$ mvn ren verifiera<br>\n<\/code><br>sedan startar maven-plugin containrarna och st\u00e4nger av dem efter testerna. Problemen b\u00f6rjar n\u00e4r projektet v\u00e4xer och v\u00e5r compose-fil ocks\u00e5 v\u00e4xer. Varje g\u00e5ng m\u00e5ste du starta alla beh\u00e5llare, och de kommer att vara vid liv genom hela byggandet. Du kan g\u00f6ra situationen lite b\u00e4ttre genom att \u00e4ndra plugin-k\u00f6rningskonfigurationen, men det r\u00e4cker inte. I v\u00e4rsta fall t\u00f6mmer dina containrar systemresurserna innan testerna startar!<\/p>\n\n\n\n<p>Och detta \u00e4r inte det enda problemet. Du kan inte k\u00f6ra ett enda integrationstest fr\u00e5n din IDE. Innan dess m\u00e5ste du starta beh\u00e5llarna f\u00f6r hand. Dessutom kommer n\u00e4sta maven-k\u00f6rning att riva ner dessa beh\u00e5llare (ta en titt p\u00e5 <code>ner<\/code> avr\u00e4ttning).<\/p>\n\n\n\n<p>S\u00e5 den h\u00e4r l\u00f6sningen \u00e4r som ett stort lastfartyg. Om allt fungerar bra \u00e4r det ok. Alla ov\u00e4ntade eller ovanliga beteenden leder till <a href=\"https:\/\/thecodest.co\/sv\/blog\/why-us-companies-are-opting-for-polish-developers\/\">oss<\/a> till n\u00e5gon form av katastrof.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Testcontainrar - k\u00f6r containrar fr\u00e5n tester<\/h2>\n\n\n\n<p>Men t\u00e4nk om vi kunde k\u00f6ra v\u00e5ra containrar fr\u00e5n tester? Den h\u00e4r id\u00e9n ser bra ut, och den h\u00e5ller redan p\u00e5 att implementeras. <a href=\"https:\/\/www.testcontainers.org\/\" rel=\"nofollow\">Testbeh\u00e5llare<\/a>Eftersom vi talar om det h\u00e4r projektet, h\u00e4r \u00e4r en l\u00f6sning p\u00e5 v\u00e5ra problem. Den \u00e4r inte idealisk, men ingen \u00e4r perfekt.<\/p>\n\n\n\n<p>Detta \u00e4r en <strong><a href=\"https:\/\/thecodest.co\/sv\/blog\/top-programming-languages-to-build-e-commerce\/\">Java<\/a><\/strong> biblioteket, som st\u00f6der JUnit- och Spock-tester, vilket ger l\u00e4tta och enkla s\u00e4tt att k\u00f6ra <a href=\"https:\/\/thecodest.co\/sv\/dictionary\/docker-developer\/\">Docka<\/a> container. L\u00e5t oss ta en titt p\u00e5 den och skriva lite kod!<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">F\u00f6ruts\u00e4ttningar och konfiguration<\/h3>\n\n\n\n<p>Innan vi b\u00f6rjar m\u00e5ste vi kontrollera v\u00e5r konfiguration. <strong>Testbeh\u00e5llare<\/strong> behov:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Docker i version v17.09,<\/li>\n\n\n\n<li>Java minst version 1.8,<\/li>\n\n\n\n<li>Tillg\u00e5ng till n\u00e4tverk, s\u00e4rskilt till docker.hub.<\/li>\n<\/ul>\n\n\n\n<p>Mer information om kraven f\u00f6r specifika operativsystem och CI finns i<br>i <a href=\"https:\/\/www.testcontainers.org\/supported_docker_environment\/\" rel=\"nofollow\">dokumentation<\/a>.<\/p>\n\n\n\n<p>Nu \u00e4r det dags att l\u00e4gga till n\u00e5gra rader till <code>pom.xml<\/code>.<\/p>\n\n\n\n<aside>Jag anv\u00e4nder Spring Boot i projektet f\u00f6r att reducera boilerplate. <strong>Testbeh\u00e5llare<\/strong> \u00e4r oberoende av Spring Framework och du kan anv\u00e4nda dem utan det.<\/aside>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"xml\" class=\"language-xml\">org.testcontainers\n       testcontainers-bom\n       ${testcontainers.version}\n       pom\n       importera\n     \n    .\n  Beroendehantering\n \n   \n     org.postgresql\n     postgresql\n     k\u00f6rtid Beroende\n   \n   \n     org.testcontainers\n     postgresql\n     test\n    \n   \n     org.testcontainers\n     junit-jupiter\n     test\n    &lt;\/dependency\n  .<\/code><\/pre>\n\n\n\n<p>Jag anv\u00e4nder <strong>Testbeh\u00e5llare<\/strong> version <code>1.17.3<\/code>men anv\u00e4nd g\u00e4rna den nyaste.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Tester med Postgres-beh\u00e5llare<\/h3>\n\n\n\n<p>Det f\u00f6rsta steget \u00e4r att f\u00f6rbereda v\u00e5r instans av en container. Du kan g\u00f6ra det direkt i testet, men en oberoende klass ser b\u00e4ttre ut.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"java\" class=\"language-java\">public class Postgres13TC ut\u00f6kar PostgreSQLContainer {\n\n privat statisk slutlig Postgres13TC TC = new Postgres13TC();\n\n privat Postgres13TC() {\n   super(\"postgres:13.2\");\n }\n\n public static Postgres13TC getInstance() {\n   return TC;\n }\n\n @\u00d6verstyrning\n offentligt ogiltigt 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 @\u00d6vertr\u00e4delse\n public void stop() {\n   \/\/ g\u00f6r ingenting. Detta \u00e4r en delad instans. L\u00e5t JVM hantera denna operation.\n }\n}\n<\/code><\/pre>\n\n\n\n<p>I b\u00f6rjan av testerna kommer vi att skapa en instans av <code>Postgres13TC<\/code>. Den h\u00e4r klassen kan hantera information om v\u00e5r container. Det viktigaste h\u00e4r \u00e4r databasens anslutningsstr\u00e4ngar och referenser. Nu \u00e4r det dags att skriva ett mycket enkelt test.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"java\" class=\"language-java\">@Testbeh\u00e5llare\nklass 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>Jag anv\u00e4nder JUnit 5 h\u00e4r. Annotation <code>@Testbeh\u00e5llare<\/code> \u00e4r en del av de till\u00e4gg som styr containrar i testmilj\u00f6n. De hittar alla f\u00e4lt med <code>@Container<\/code> annotation och start- respektive stoppbeh\u00e5llare.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Tester med Spring Boot<\/h3>\n\n\n\n<p>Som jag n\u00e4mnde tidigare anv\u00e4nder jag Spring Boot i projektet. I det h\u00e4r fallet beh\u00f6ver vi skriva lite mer kod. Det f\u00f6rsta steget \u00e4r att skapa en ytterligare konfigurationsklass.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"java\" class=\"language-java\">@Slf4j\npublic class ContainerInit implementerar\n   ApplicationContextInitializer {\n\n public static Postgres13TC;\n\n static {\n   postgres13TC = Postgres13TC.getInstance();\n   postgres13TC.start();\n }\n\n @Overrid\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>Denna klass \u00e5sidos\u00e4tter de befintliga egenskaperna med v\u00e4rden fr\u00e5n <strong>testbeh\u00e5llare<\/strong>. De tre f\u00f6rsta egenskaperna \u00e4r standard Spring-egenskaper. De f\u00f6ljande fem \u00e4r ytterligare, anpassade egenskaper som kan anv\u00e4ndas f\u00f6r att konfigurera andra resurser och till\u00e4gg som liquibase, t.ex:<\/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.anv\u00e4ndarnamn:admin}\nspring.liquibase.password=${db.password:l\u00f6senord}\nspring.liquibase.enabled=true<\/code><\/pre>\n\n\n\n<p>Nu \u00e4r det dags att definiera ett enkelt integrationstest.<\/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(initialiserare = ContainerInit.class)\n@Testcontainers\nklass DummyRepositoryTest {\n\n @Autowired\n privat DummyRepository;\n\n @Test\n void shouldReturnDummy() {\n   var byId = dummyRepository.getById(10L);\n   var expected = ny Dummy();\n   expected.setId(10L);\n   assertThat(byId).completes().emitsCount(1).emits(expected);\n }\n}<\/code><\/pre>\n\n\n\n<p>Vi har n\u00e5gra extra anteckningar h\u00e4r.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>@SpringBootTest(webEnvironment = RANDOM_PORT)<\/code> - markerar testet som ett Spring Boot-test och startar Spring-kontexten.<\/li>\n\n\n\n<li><code>@AutoConfigureTestDatabase(replace = NONE)<\/code> - dessa anteckningar s\u00e4ger att v\u00e5rtesttill\u00e4gget inte ska ers\u00e4tta postgres-databasens konfiguration med H2 i minneskonfigurationen.<\/li>\n\n\n\n<li><code>@ContextConfiguration(initialiserare = ContainerInit.class)<\/code> - ytterligare ett v\u00e5rsammanhang<br>konfiguration d\u00e4r vi s\u00e4tter upp egenskaper fr\u00e5n <strong>Testbeh\u00e5llare<\/strong>.<\/li>\n\n\n\n<li><code>@Testbeh\u00e5llare<\/code> - som tidigare n\u00e4mnts styr denna annotation beh\u00e5llarens livscykel.<\/li>\n<\/ul>\n\n\n\n<p>I det h\u00e4r exemplet anv\u00e4nder jag reaktiva repositories, men det fungerar p\u00e5 samma s\u00e4tt med vanliga JDBC- och JPA-repositories.<\/p>\n\n\n\n<p>Nu kan vi k\u00f6ra det h\u00e4r testet. Om det \u00e4r f\u00f6rsta g\u00e5ngen beh\u00f6ver motorn h\u00e4mta bilder fr\u00e5n docker.hub. Det kan ta en stund. Efter det kommer vi att se att tv\u00e5 containrar har k\u00f6rts. Den ena \u00e4r postgres och den andra \u00e4r Testcontainers controller. Den andra containern hanterar containrar som k\u00f6rs och \u00e4ven om JVM ov\u00e4ntat stannar, st\u00e4nger den av containrarna och rensar upp milj\u00f6n.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">L\u00e5t oss sammanfatta<\/h2>\n\n\n\n<p><strong>Testbeh\u00e5llare<\/strong> \u00e4r mycket l\u00e4ttanv\u00e4nda verktyg som hj\u00e4lper oss att skapa integrationstester som anv\u00e4nder Docker-containrar. Det ger oss mer flexibilitet och \u00f6kar utvecklingshastigheten. Korrekt inst\u00e4llning av testkonfigurationen minskar den tid som kr\u00e4vs f\u00f6r att introducera nya utvecklare. De beh\u00f6ver inte konfigurera alla beroenden, utan bara k\u00f6ra de skrivna testerna med utvalda konfigurationsfiler.<\/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=\"samarbetsbanner\"\/><\/a><\/figure>","protected":false},"excerpt":{"rendered":"<p>Letar du efter ett s\u00e4tt att g\u00f6ra tester p\u00e5 ett enklare s\u00e4tt? Vi har hittat dig! L\u00e4s f\u00f6ljande artikel och l\u00e4r dig hur du g\u00f6r det m\u00f6jligt.<\/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\/sv\/blogg\/testcontainrar-hur-man-gor-tester-enklare\/\" \/>\n<meta property=\"og:locale\" content=\"sv_SE\" \/>\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\/sv\/blogg\/testcontainrar-hur-man-gor-tester-enklare\/\" \/>\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\":\"sv-SE\",\"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\":\"sv-SE\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/thecodest.co\\\/blog\\\/test-containers-how-to-make-tests-easier\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"sv-SE\",\"@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\":\"sv-SE\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/thecodest.co\\\/#organization\",\"name\":\"The Codest\",\"url\":\"https:\\\/\\\/thecodest.co\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"sv-SE\",\"@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\":\"sv-SE\",\"@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\\\/sv\\\/author\\\/thecodest\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Testbeh\u00e5llare - Hur g\u00f6r man tester enklare? - 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\/sv\/blogg\/testcontainrar-hur-man-gor-tester-enklare\/","og_locale":"sv_SE","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\/sv\/blogg\/testcontainrar-hur-man-gor-tester-enklare\/","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":"sv-SE","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":"Testbeh\u00e5llare - Hur g\u00f6r man tester enklare? - 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":"sv-SE","potentialAction":[{"@type":"ReadAction","target":["https:\/\/thecodest.co\/blog\/test-containers-how-to-make-tests-easier\/"]}]},{"@type":"ImageObject","inLanguage":"sv-SE","@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":"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":"sv-SE"},{"@type":"Organization","@id":"https:\/\/thecodest.co\/#organization","name":"Codest","url":"https:\/\/thecodest.co\/","logo":{"@type":"ImageObject","inLanguage":"sv-SE","@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":"sv-SE","@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\/sv\/author\/thecodest\/"}]}},"_links":{"self":[{"href":"https:\/\/thecodest.co\/sv\/wp-json\/wp\/v2\/posts\/3631","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/thecodest.co\/sv\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/thecodest.co\/sv\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/thecodest.co\/sv\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/thecodest.co\/sv\/wp-json\/wp\/v2\/comments?post=3631"}],"version-history":[{"count":9,"href":"https:\/\/thecodest.co\/sv\/wp-json\/wp\/v2\/posts\/3631\/revisions"}],"predecessor-version":[{"id":8016,"href":"https:\/\/thecodest.co\/sv\/wp-json\/wp\/v2\/posts\/3631\/revisions\/8016"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/thecodest.co\/sv\/wp-json\/wp\/v2\/media\/3632"}],"wp:attachment":[{"href":"https:\/\/thecodest.co\/sv\/wp-json\/wp\/v2\/media?parent=3631"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/thecodest.co\/sv\/wp-json\/wp\/v2\/categories?post=3631"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/thecodest.co\/sv\/wp-json\/wp\/v2\/tags?post=3631"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}