{"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":"testesanas-konteineri-ka-atvieglot-testus","status":"publish","type":"post","link":"https:\/\/thecodest.co\/lv\/blog\/test-containers-how-to-make-tests-easier\/","title":{"rendered":"Testu konteineri - k\u0101 atvieglot testus?"},"content":{"rendered":"<p>M\u016bsdienu lietojumprogrammu izstr\u0101des pamat\u0101 ir viens vienk\u0101r\u0161s noteikums:<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p><b>Izmantojiet sast\u0101vu<\/b><\/p>\n<\/blockquote>\n\n\n\n<p>M\u0113s veidojam klases, funkcijas un pakalpojumus liel\u0101kos programmat\u016bras blokos. \u0160is p\u0113d\u0113jais elements ir pamats <a href=\"https:\/\/thecodest.co\/lv\/dictionary\/microservices\/\">mikroservisi<\/a> un <a href=\"https:\/\/thecodest.co\/lv\/blog\/the-power-of-hexagonal-architecture\/\">se\u0161st\u016bra formas arhitekt\u016bra<\/a>. M\u0113s v\u0113lamies izmantot eso\u0161os risin\u0101jumus, integr\u0113t tos ar m\u016bsu programmat\u016bru un uzreiz p\u0101riet uz m\u016bsu programmat\u016bru. <a href=\"https:\/\/thecodest.co\/lv\/dictionary\/what-is-the-size-of-your-potential-reachable-market\/\">tirgus<\/a>.<\/p>\n\n\n\n<p>Vai v\u0113laties apstr\u0101d\u0101t konta re\u0123istr\u0101ciju un saglab\u0101t lietot\u0101ja <a href=\"https:\/\/thecodest.co\/lv\/blog\/app-data-collection-security-risks-value-and-types-explored\/\">dati<\/a>? Varat izv\u0113l\u0113ties k\u0101du no OAuth pakalpojumiem. Varb\u016bt j\u016bsu lietojumprogramma pied\u0101v\u0101 k\u0101du abon\u0113\u0161anu vai maks\u0101jumu? Ir daudzi pakalpojumi, kas var pal\u012bdz\u0113t to apstr\u0101d\u0101t. Vai jums ir nepiecie\u0161ama t\u012bmek\u013ca vietnes anal\u012bze, bet nesaprotat, k\u0101 to dar\u012bt? <a href=\"https:\/\/thecodest.co\/lv\/blog\/cyber-security-dilemmas-data-leaks\/\">GDPR<\/a>? Dro\u0161i izv\u0113lieties k\u0101du no gatavajiem risin\u0101jumiem.<\/p>\n\n\n\n<p>Tas, kas no biznesa viedok\u013ca padara izstr\u0101di tik vienk\u0101r\u0161u, var sag\u0101d\u0101t galvass\u0101pes - br\u012bd\u012b, kad nepiecie\u0161ams uzrakst\u012bt vienk\u0101r\u0161u testu.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Fantastiskie zv\u0113ri: rindas, datub\u0101zes un to test\u0113\u0161ana<\/h2>\n\n\n\n<p>Vien\u012bbas test\u0113\u0161ana ir diezgan vienk\u0101r\u0161a. Ja j\u016bs iev\u0113rojat tikai \u0161os noteikumus, tad j\u016bsu test\u0113\u0161anas vide un <a href=\"https:\/\/thecodest.co\/lv\/dictionary\/what-is-code-refactoring\/\">kods<\/a> ir vesel\u012bgi. K\u0101di ir \u0161ie noteikumi?<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><b>Viegli rakst\u012bt<\/b> - vien\u012bbas testu vajadz\u0113tu b\u016bt viegli uzrakst\u012bt, jo j\u016bs rakst\u0101t daudz testu. Maz\u0101k p\u016b\u013cu noz\u012bm\u0113, ka tiek uzrakst\u012bts vair\u0101k testu.<\/li>\n\n\n\n<li><b>Las\u0101ms<\/b> - testa kodam j\u0101b\u016bt viegli las\u0101mam. Tests ir st\u0101sts. Tas apraksta programmat\u016bras uzved\u012bbu, un to var izmantot k\u0101 dokument\u0101cijas sa\u012bsin\u0101jumu. Labs vien\u012bbas tests pal\u012bdz nov\u0113rst k\u013c\u016bdas bez koda atk\u013c\u016bdo\u0161anas.<\/li>\n\n\n\n<li><b>Uzticams<\/b> - testam j\u0101b\u016bt neveiksm\u012bgam tikai tad, ja test\u0113jam\u0101 sist\u0113m\u0101 ir k\u013c\u016bda. Ac\u012bmredzami? Ne vienm\u0113r. Da\u017ereiz testi ir veiksm\u012bgi, ja tos izpilda pa vienam, bet neizdodas, ja tos izpilda k\u0101 kopumu. Tie ir veiksm\u012bgi j\u016bsu dator\u0101, bet neizdodas CI (<a href=\"https:\/\/blog.codinghorror.com\/the-works-on-my-machine-certification-program\/\">Darbojas man\u0101 dator\u0101<\/a>). Labam vien\u012bbas testam ir tikai viens neveiksmes iemesls.<\/li>\n\n\n\n<li><b>Fast<\/b> - testiem j\u0101b\u016bt \u0101triem. Sagatavo\u0161anai, palai\u0161anai, palai\u0161anai un pa\u0161ai testu izpildei j\u0101b\u016bt \u013coti \u0101trai. Pret\u0113j\u0101 gad\u012bjum\u0101 j\u016bs tos uzrakst\u012bsiet, bet neizpild\u012bsiet. L\u0113ni testi noz\u012bm\u0113 zaud\u0113tu uzman\u012bbu. J\u016bs gaid\u0101t un skat\u0101ties uz progresa joslu.<\/li>\n\n\n\n<li><b>Neatkar\u012bga<\/b> - visbeidzot, testam j\u0101b\u016bt neatkar\u012bgam. \u0160is noteikums izriet no iepriek\u0161\u0113jiem. Tikai patiesi neatkar\u012bgi testi var k\u013c\u016bt par vien\u012bbu. Tie netrauc\u0113 cits citam, tos var izpild\u012bt jebkur\u0101 sec\u012bb\u0101, un iesp\u0113jam\u0101s k\u013c\u016bdas nav atkar\u012bgas no citu testu rezult\u0101tiem. Neatkar\u012bgi noz\u012bm\u0113 ar\u012b to, ka nav atkar\u012bgi no \u0101r\u0113jiem resursiem, piem\u0113ram, datu b\u0101z\u0113m, zi\u0146ojumapmai\u0146as pakalpojumiem vai failu sist\u0113mas. Ja jums ir nepiecie\u0161ama sazi\u0146a ar \u0101r\u0113jiem resursiem, varat izmantot mocks, stubs vai dummy.<\/li>\n<\/ul>\n\n\n\n<p>Viss k\u013c\u016bst sare\u017e\u0123\u012bti, kad v\u0113lamies uzrakst\u012bt integr\u0101cijas testus. Tas nav slikti, ja v\u0113lamies test\u0113t vair\u0101kus pakalpojumus kop\u0101. Ta\u010du, ja mums ir nepiecie\u0161ams test\u0113t pakalpojumus, kas izmanto \u0101r\u0113jos resursus, piem\u0113ram, datub\u0101zes vai zi\u0146ojumapmai\u0146as pakalpojumus, tad m\u0113s sag\u0101d\u0101jam probl\u0113mas.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Lai palaistu testu, ir j\u0101instal\u0113...<\/h3>\n\n\n\n<p>Pirms daudziem gadiem, kad m\u0113s v\u0113l\u0113j\u0101mies veikt integr\u0101cijas testus un izmantot, piem\u0113ram, datub\u0101zes, mums bija divas iesp\u0113jas:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Datu b\u0101zi varam instal\u0113t lok\u0101li. Iestatiet sh\u0113mu un izveidojiet savienojumu no m\u016bsu testa;<\/li>\n\n\n\n<li>Varam izveidot savienojumu ar eso\u0161o gad\u012bjumu \"kaut kur kosmos\u0101\".<\/li>\n<\/ol>\n\n\n\n<p>Abiem bija gan plusi, gan m\u012bnusi. Ta\u010du abas ievie\u0161 papildu sare\u017e\u0123\u012bt\u012bbas pak\u0101pes. Da\u017ereiz t\u0101 bija tehniska sare\u017e\u0123\u012bt\u012bba, ko rad\u012bja konkr\u0113tu r\u012bku \u012bpa\u0161\u012bbas, piem\u0113ram, Oracle DB instal\u0113\u0161ana un p\u0101rvald\u012bba lok\u0101laj\u0101 host\u012b. Da\u017ereiz t\u0101s bija ne\u0113rt\u012bbas proces\u0101, piem\u0113ram, jums ir j\u0101vienojas ar testu. <a href=\"https:\/\/thecodest.co\/lv\/dictionary\/how-to-lead-software-development-team\/\">komanda<\/a> par JMS izmanto\u0161anu... katru reizi, kad v\u0113laties palaist testus.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Konteineri pal\u012bg\u0101<\/h3>\n\n\n\n<p>P\u0113d\u0113jo 10 gadu laik\u0101 konteineriz\u0101cijas ideja ir guvusi atzin\u012bbu nozar\u0113. T\u0101p\u0113c likumsakar\u012bgs l\u0113mums ir izv\u0113l\u0113ties konteinerus k\u0101 risin\u0101jumu m\u016bsu integr\u0101cijas testu probl\u0113mai. Tas ir vienk\u0101r\u0161s un t\u012brs risin\u0101jums. J\u016bs vienk\u0101r\u0161i palai\u017eat sava procesa izveidi, un viss darbojas! J\u016bs nevarat tam notic\u0113t? Apl\u016bkojiet \u0161o vienk\u0101r\u0161o maven kompil\u0101cijas konfigur\u0101ciju:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"xml\" class=\"language-xml\"><b>\n \n   \n     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\/lv\/dictionary\/why-do-projects-fail\/\">projekts<\/a>.basedir}\/docker-compose.yml\n           true\n         \n       \n       \n         uz leju\n         p\u0113c integr\u0101cijas testa\n         \n           nosl\u0113g\u0161an\u0101s\n         \n         \n           ${project.basedir}\/docker-compose.yml\n           true<\/code><\/pre>\n\n\n\n<p>Un <code>docker-compose.yml<\/code> fails ar\u012b izskat\u0101s diezgan jauki!<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"yaml\" class=\"language-yaml\">versija: \"3.5\"\n\npakalpojumi:\n\n postgres:\n   konteinera_nosaukums: reactivedb\n   att\u0113ls: postgres:13.2\n   restart: vienm\u0113r\n   vide:\n     - POSTGRES_USER=admin\n     - POSTGRES_PASSWORD=password\n     - POSTGRES_DB=cities\n   ostas:\n     - \"5432:5432\"\n   apjomi:\n     - postgres_data:\/data\/db\n\n pgadmin:\n   konteinera_nosaukums: pgadmin4\n   att\u0113ls: dpage\/pgadmin4\n   restart: vienm\u0113r\n   vide:\n     PGADMIN_DEFAULT_EMAIL: admin@admin.com\n     PGADMIN_DEFAULT_PASSWORD: password\n   portus:\n     - \"15050:80\"\n   apjomi:\n     - pgadmin_data:\/data\/pgadmin\n\ns\u0113jumi:\n postgres_data:\n pgadmin_data:<\/code><\/pre>\n\n\n\n<p>Bet vai varat paman\u012bt probl\u0113mu?<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Kravas ku\u0123is, kas blo\u0137\u0113 visu<\/h3>\n\n\n\n<p>Iepriek\u0161 min\u0113tais piem\u0113rs ir \u013coti vienk\u0101r\u0161s. Tikai viena postgres datub\u0101ze, pgAdmin un viss. Kad palai\u017eat<\/p>\n\n\n\n<p><code>bash<br>\n$ mvn t\u012brs p\u0101rbaud\u012bt<br>\n<\/code><br>tad maven spraudnis iedarbina konteinerus un p\u0113c testu veik\u0161anas tos izsl\u0113dz. Probl\u0113mas s\u0101kas, kad projekts pieaug un pieaug ar\u012b m\u016bsu compose fails. Katru reizi b\u016bs nepiecie\u0161ams iedarbin\u0101t visus konteinerus, un tie b\u016bs dz\u012bvi visas kompil\u0101cijas laik\u0101. Situ\u0101ciju var nedaudz uzlabot, mainot spraud\u0146a izpildes konfigur\u0101ciju, ta\u010du ar to nepietiek. Slikt\u0101kaj\u0101 gad\u012bjum\u0101 j\u016bsu konteineri izsmeltu sist\u0113mas resursus, pirms s\u0101kas testi!<\/p>\n\n\n\n<p>Un tas nav vien\u012bgais jaut\u0101jums. J\u016bs nevarat palaist vienu integr\u0101cijas testu no savas IDE. Pirms tam konteineri ir j\u0101palai\u017e ar rok\u0101m. Turkl\u0101t n\u0101kamais maven palaidums nojauks \u0161os konteinerus (skat. <code>uz leju<\/code> izpilde).<\/p>\n\n\n\n<p>T\u0101tad \u0161is risin\u0101jums ir k\u0101 liels kravas ku\u0123is. Ja viss darbojas labi, tad viss ir k\u0101rt\u012bb\u0101. Jebk\u0101da neparedz\u0113ta vai neparasta uzved\u012bba noved pie t\u0101, ka <a href=\"https:\/\/thecodest.co\/lv\/blog\/why-us-companies-are-opting-for-polish-developers\/\">mums<\/a> l\u012bdz k\u0101dai katastrofai.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Test\u0113\u0161anas konteineri - palaist konteinerus no testiem<\/h2>\n\n\n\n<p>Bet ko tad, ja m\u0113s var\u0113tu palaist savus konteinerus no testiem? \u0160\u012b ideja izskat\u0101s laba, un t\u0101 jau tiek \u012bstenota. <a href=\"https:\/\/www.testcontainers.org\/\" rel=\"nofollow\">Testkonteineri<\/a>, jo m\u0113s run\u0101jam par \u0161o projektu, \u0161eit ir m\u016bsu probl\u0113mu risin\u0101jums. Nav ide\u0101ls, bet neviens nav ide\u0101ls.<\/p>\n\n\n\n<p>Tas ir <strong><a href=\"https:\/\/thecodest.co\/lv\/blog\/top-programming-languages-to-build-e-commerce\/\">Java<\/a><\/strong> bibliot\u0113ka, kas atbalsta JUnit un Spock testus, nodro\u0161inot vieglus un vienk\u0101r\u0161us veidus, k\u0101 palaist <a href=\"https:\/\/thecodest.co\/lv\/dictionary\/docker-developer\/\">Docker<\/a> konteiners. Apl\u016bkosim to un uzrakst\u012bsim k\u0101du kodu!<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Priek\u0161nosac\u012bjumi un konfigur\u0101cija<\/h3>\n\n\n\n<p>Pirms s\u0101kam darbu, j\u0101p\u0101rbauda konfigur\u0101cija. <strong>Testa konteineri<\/strong> nepiecie\u0161ams:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Docker versij\u0101 v17.09,<\/li>\n\n\n\n<li>Java minim\u0101l\u0101 versija 1.8,<\/li>\n\n\n\n<li>Piek\u013cuve t\u012bklam, \u012bpa\u0161i docker.hub.<\/li>\n<\/ul>\n\n\n\n<p>S\u012bk\u0101ku inform\u0101ciju par pras\u012bb\u0101m konkr\u0113t\u0101m OS un CI var atrast<br>vietn\u0113 <a href=\"https:\/\/www.testcontainers.org\/supported_docker_environment\/\" rel=\"nofollow\">dokument\u0101cija<\/a>.<\/p>\n\n\n\n<p>Tagad ir pien\u0101cis laiks pievienot da\u017eas rindas uz <code>pom.xml<\/code>.<\/p>\n\n\n\n<aside>Es projekt\u0101 izmantoju pavasara boot, lai samazin\u0101tu boilerplate. <strong>Testa konteineri<\/strong> ir neatkar\u012bgas no Spring Framework, un j\u016bs varat t\u0101s izmantot bez t\u0101.<\/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\u0113t\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>Es izmantoju <strong>Testa konteineri<\/strong> versija <code>1.17.3<\/code>, bet izmantojiet jaun\u0101ko.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Testi ar Postgres konteineru<\/h3>\n\n\n\n<p>Pirmais solis ir sagatavot konteinera gad\u012bjumu. To var izdar\u012bt tie\u0161i test\u0101, bet neatkar\u012bga klase izskat\u0101s lab\u0101k.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"java\" class=\"language-java\">public klase 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   \/\/ neko nedara. \u0160\u012b ir koplietojam\u0101 instance. \u013baujiet JVM apstr\u0101d\u0101t \u0161o oper\u0101ciju.\n }\n}\n<\/code><\/pre>\n\n\n\n<p>Testu s\u0101kum\u0101 m\u0113s izveidosim instance of <code>Postgres13TC<\/code>. \u0160aj\u0101 klas\u0113 var apstr\u0101d\u0101t inform\u0101ciju par m\u016bsu konteineru. Vissvar\u012bg\u0101k\u0101s ir datu b\u0101zes savienojuma virknes un akredit\u0101cijas dati. Tagad ir pien\u0101cis laiks uzrakst\u012bt \u013coti vienk\u0101r\u0161u testu.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"java\" class=\"language-java\">@Testcontainers\nklase 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>Es \u0161eit izmantoju JUnit 5. Anot\u0101cija <code>@Testcontainers<\/code> ir da\u013ca no papla\u0161in\u0101jumiem, kas kontrol\u0113 konteinerus testa vid\u0113. Tie atrod visus laukus ar <code>@Container<\/code> anot\u0101ciju un attiec\u012bgi start un stop konteinerus.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Testi ar Spring Boot<\/h3>\n\n\n\n<p>K\u0101 jau iepriek\u0161 min\u0113ju, projekt\u0101 izmantoju Spring Boot. \u0160aj\u0101 gad\u012bjum\u0101 mums ir j\u0101uzraksta nedaudz vair\u0101k koda. Pirmais solis ir izveidot papildu konfigur\u0101cijas klasi.<\/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>\u0160\u012b klase aizst\u0101j eso\u0161\u0101s \u012bpa\u0161\u012bbas ar v\u0113rt\u012bb\u0101m no klases <strong>testa konteiners<\/strong>. Pirm\u0101s tr\u012bs \u012bpa\u0161\u012bbas ir standarta Spring \u012bpa\u0161\u012bbas. N\u0101kam\u0101s piecas ir papildu, piel\u0101gotas \u012bpa\u0161\u012bbas, kuras var izmantot, lai konfigur\u0113tu citus resursus un papla\u0161in\u0101jumus, piem\u0113ram, 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>Tagad ir pien\u0101cis laiks defin\u0113t vienk\u0101r\u0161u integr\u0101cijas testu.<\/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@Testcontainers\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>\u0160eit ir da\u017eas papildu anot\u0101cijas.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>@SpringBootTest(webEnvironment = RANDOM_PORT)<\/code> - atz\u012bm\u0113 testu k\u0101 Spring Boot testu un uzs\u0101k spring kontekstu.<\/li>\n\n\n\n<li><code>@AutoConfigureTestDatabase(aizst\u0101t = NAV)<\/code> - \u0161\u012bs anot\u0101cijas nor\u0101da, ka pavasara testa papla\u0161in\u0101jumam nevajadz\u0113tu aizst\u0101t postgres datub\u0101zes konfigur\u0101ciju ar H2 atmi\u0146as konfigur\u0101cij\u0101.<\/li>\n\n\n\n<li><code>@ContextConfiguration(initializers = ContainerInit.class)<\/code> - papildu pavasara konteksts<br>konfigur\u0101cija, kur\u0101 m\u0113s iestat\u0101m \u012bpa\u0161\u012bbas no <strong>Testa konteineri<\/strong>.<\/li>\n\n\n\n<li><code>@Testcontainers<\/code> - k\u0101 min\u0113ts iepriek\u0161, \u0161\u012b anot\u0101cija kontrol\u0113 konteinera dz\u012bves ciklu.<\/li>\n<\/ul>\n\n\n\n<p>\u0160aj\u0101 piem\u0113r\u0101 es izmantoju reakt\u012bvos repozitorijus, bet tas darbojas t\u0101pat ar\u012b ar parastajiem JDBC un JPA repozitorijiem.<\/p>\n\n\n\n<p>Tagad varam palaist \u0161o testu. Ja tas ir pirmais palaidums, dzin\u0113jam ir j\u0101velk att\u0113li no docker.hub. Tas var aiz\u0146emt br\u012bdi. P\u0113c tam m\u0113s redz\u0113sim, ka ir palaisti divi konteineri. Viens no tiem ir postgres, bet otrs ir Testcontainers kontrolieris. \u0160is otrais konteiners p\u0101rvalda darbojo\u0161os konteinerus, un, pat ja JVM negaid\u012bti apst\u0101jas, tas izsl\u0113dz konteinerus un sakopj vidi.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Apkoposim<\/h2>\n\n\n\n<p><strong>Testa konteineri<\/strong> ir \u013coti \u0113rti lietojami r\u012bki, kas pal\u012bdz mums izveidot integr\u0101cijas testus, kuros tiek izmantoti Docker konteineri. Tas mums sniedz liel\u0101ku elast\u012bbu un palielina izstr\u0101des \u0101trumu. Pareiza testu konfigur\u0101cijas iestat\u012b\u0161ana samazina laiku, kas nepiecie\u0161ams, lai uz\u0146emtu jaunus izstr\u0101d\u0101t\u0101jus. Vi\u0146iem nav j\u0101konfigur\u0113 visas atkar\u012bbas, vienk\u0101r\u0161i j\u0101palai\u017e uzrakst\u012btie testi ar izv\u0113l\u0113tiem konfigur\u0101cijas failiem.<\/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=\"sadarb\u012bbas baneris\"\/><\/a><\/figure>","protected":false},"excerpt":{"rendered":"<p>Vai mekl\u0113jat veidu, k\u0101 viegl\u0101k veikt testus? M\u0113s jums pal\u012bdz\u0113sim! Skatiet \u0161o rakstu un uzziniet, k\u0101 to izdar\u012bt.<\/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\/lv\/emuars\/testesanas-konteineri-ka-atvieglot-testus\/\" \/>\n<meta property=\"og:locale\" content=\"lv_LV\" \/>\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\/lv\/emuars\/testesanas-konteineri-ka-atvieglot-testus\/\" \/>\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\":\"lv\",\"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\":\"lv\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/thecodest.co\\\/blog\\\/test-containers-how-to-make-tests-easier\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"lv\",\"@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\":\"lv\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/thecodest.co\\\/#organization\",\"name\":\"The Codest\",\"url\":\"https:\\\/\\\/thecodest.co\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"lv\",\"@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\":\"lv\",\"@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\\\/lv\\\/author\\\/thecodest\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Testu konteineri - k\u0101 atvieglot testus? - 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\/lv\/emuars\/testesanas-konteineri-ka-atvieglot-testus\/","og_locale":"lv_LV","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\/lv\/emuars\/testesanas-konteineri-ka-atvieglot-testus\/","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":"lv","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":"Testu konteineri - k\u0101 atvieglot testus? - 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":"lv","potentialAction":[{"@type":"ReadAction","target":["https:\/\/thecodest.co\/blog\/test-containers-how-to-make-tests-easier\/"]}]},{"@type":"ImageObject","inLanguage":"lv","@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":"lv"},{"@type":"Organization","@id":"https:\/\/thecodest.co\/#organization","name":"The Codest","url":"https:\/\/thecodest.co\/","logo":{"@type":"ImageObject","inLanguage":"lv","@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":"lv","@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\/lv\/author\/thecodest\/"}]}},"_links":{"self":[{"href":"https:\/\/thecodest.co\/lv\/wp-json\/wp\/v2\/posts\/3631","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/thecodest.co\/lv\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/thecodest.co\/lv\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/thecodest.co\/lv\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/thecodest.co\/lv\/wp-json\/wp\/v2\/comments?post=3631"}],"version-history":[{"count":9,"href":"https:\/\/thecodest.co\/lv\/wp-json\/wp\/v2\/posts\/3631\/revisions"}],"predecessor-version":[{"id":8016,"href":"https:\/\/thecodest.co\/lv\/wp-json\/wp\/v2\/posts\/3631\/revisions\/8016"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/thecodest.co\/lv\/wp-json\/wp\/v2\/media\/3632"}],"wp:attachment":[{"href":"https:\/\/thecodest.co\/lv\/wp-json\/wp\/v2\/media?parent=3631"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/thecodest.co\/lv\/wp-json\/wp\/v2\/categories?post=3631"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/thecodest.co\/lv\/wp-json\/wp\/v2\/tags?post=3631"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}