{"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":"testu-konteineriai-kaip-palengvinti-testus","status":"publish","type":"post","link":"https:\/\/thecodest.co\/lt\/blog\/test-containers-how-to-make-tests-easier\/","title":{"rendered":"Test\u0173 konteineriai - kaip palengvinti testus?"},"content":{"rendered":"<p>\u0160iuolaikinis program\u0173 k\u016brimas grind\u017eiamas viena paprasta taisykle:<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p><b>Naudokite sud\u0117t\u012f<\/b><\/p>\n<\/blockquote>\n\n\n\n<p>Klases, funkcijas ir paslaugas sujungiame \u012f didesnius programin\u0117s \u012frangos vienetus. Pastarasis elementas yra <a href=\"https:\/\/thecodest.co\/lt\/dictionary\/microservices\/\">mikroservisai<\/a> ir <a href=\"https:\/\/thecodest.co\/lt\/blog\/the-power-of-hexagonal-architecture\/\">\u0161e\u0161iakamp\u0117 architekt\u016bra<\/a>. Nor\u0117tume naudoti esamus sprendimus, integruoti juos \u012f savo programin\u0119 \u012frang\u0105 ir i\u0161 karto pereiti prie <a href=\"https:\/\/thecodest.co\/lt\/dictionary\/what-is-the-size-of-your-potential-reachable-market\/\">rinka<\/a>.<\/p>\n\n\n\n<p>Ar norite tvarkyti paskyros registracij\u0105 ir saugoti naudotojo <a href=\"https:\/\/thecodest.co\/lt\/blog\/app-data-collection-security-risks-value-and-types-explored\/\">duomenys<\/a>? Galite pasirinkti vien\u0105 i\u0161 OAuth paslaug\u0173. Galb\u016bt j\u016bs\u0173 programa si\u016blo koki\u0105 nors prenumerat\u0105 ar mok\u0117jim\u0105? Yra daugyb\u0117 paslaug\u0173, kurios gali pad\u0117ti tai tvarkyti. Ar jums reikia tam tikros svetain\u0117s analiz\u0117s, bet nesuprantate, kaip j\u0105 atlikti? <a href=\"https:\/\/thecodest.co\/lt\/blog\/cyber-security-dilemmas-data-leaks\/\">BDAR<\/a>? Dr\u0105siai rinkit\u0117s vien\u0105 i\u0161 paruo\u0161t\u0173 sprendim\u0173.<\/p>\n\n\n\n<p>Tai, kas verslo po\u017ei\u016briu taip palengvina k\u016brim\u0105, gali sukelti galvos skausm\u0105, kai reikia para\u0161yti paprast\u0105 test\u0105.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Filmas \"Fantastiniai \u017ev\u0117rys: Eil\u0117s, duomen\u0173 baz\u0117s ir kaip jas i\u0161bandyti<\/h2>\n\n\n\n<p>Vieneto testavimas yra gana paprastas. Jei tik laikysit\u0117s taisykli\u0173, j\u016bs\u0173 testavimo aplinka ir <a href=\"https:\/\/thecodest.co\/lt\/dictionary\/what-is-code-refactoring\/\">kodas<\/a> yra sveiki. Kokios tai taisykl\u0117s?<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><b>Lengva ra\u0161yti<\/b> - vienetin\u012f test\u0105 tur\u0117t\u0173 b\u016bti lengva para\u0161yti, nes j\u0173 ra\u0161ote daug. Ma\u017eiau pastang\u0173 rei\u0161kia, kad para\u0161oma daugiau test\u0173.<\/li>\n\n\n\n<li><b>\u012eskaitomas<\/b> - testo kod\u0105 tur\u0117t\u0173 b\u016bti lengva perskaityti. Testas yra istorija. Jis apra\u0161o programin\u0117s \u012frangos elges\u012f ir gali b\u016bti naudojamas kaip dokumentacijos sutrumpinimas. Geras vieneto testas padeda i\u0161taisyti klaidas negadinant kodo.<\/li>\n\n\n\n<li><b>Patikimas<\/b> - testas tur\u0117t\u0173 b\u016bti nes\u0117kmingas tik tuo atveju, jei testuojamoje sistemoje yra klaida. Akivaizdu? Ne visada. Kartais testai b\u016bna s\u0117kmingi, jei juos paleid\u017eiate po vien\u0105, bet nes\u0117kmingi, jei juos paleid\u017eiate kaip rinkin\u012f. Jie praeina j\u016bs\u0173 kompiuteryje, bet nepavyksta CI (<a href=\"https:\/\/blog.codinghorror.com\/the-works-on-my-machine-certification-program\/\">Veikia mano kompiuteryje<\/a>). Geras vieneto testas turi tik vien\u0105 nes\u0117km\u0117s prie\u017east\u012f.<\/li>\n\n\n\n<li><b>Greitai<\/b> - testai tur\u0117t\u0173 b\u016bti greiti. Pasirengimas paleisti, paleidimas ir pats testo vykdymas tur\u0117t\u0173 b\u016bti labai greitas. Prie\u0161ingu atveju juos para\u0161ysite, bet ne\u012fvykdysite. L\u0117ti testai rei\u0161kia prarast\u0105 d\u0117mes\u012f. Lauksite ir \u017ei\u016br\u0117site \u012f pa\u017eangos juost\u0105.<\/li>\n\n\n\n<li><b>Nepriklausomas<\/b> - galiausiai testas tur\u0117t\u0173 b\u016bti nepriklausomas. \u0160i taisykl\u0117 i\u0161plaukia i\u0161 ankstesni\u0173. Tik tikrai nepriklausomi testai gali tapti vienetu. Jie vienas kitam netrukdo, gali b\u016bti vykdomi bet kokia tvarka, o galimos nes\u0117km\u0117s nepriklauso nuo kit\u0173 test\u0173 rezultat\u0173. Nepriklausomi testai taip pat rei\u0161kia, kad jie nepriklauso nuo joki\u0173 i\u0161orini\u0173 i\u0161tekli\u0173, pavyzd\u017eiui, duomen\u0173 bazi\u0173, prane\u0161im\u0173 perdavimo paslaug\u0173 ar fail\u0173 sistemos. Jei reikia bendrauti su i\u0161oriniais i\u0161tekliais, galite naudoti maketus, stubus arba manekenus.<\/li>\n<\/ul>\n\n\n\n<p>Viskas tampa sud\u0117tinga, kai norime para\u0161yti kelet\u0105 integracijos test\u0173. Neblogai, jei norime testuoti kelias paslaugas kartu. Ta\u010diau kai reikia testuoti paslaugas, kurios naudoja i\u0161orinius i\u0161teklius, pavyzd\u017eiui, duomen\u0173 bazes ar prane\u0161im\u0173 siuntimo paslaugas, tuomet pra\u0161om\u0117s problem\u0173.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Nor\u0117dami atlikti test\u0105, turite \u012fdiegti...<\/h3>\n\n\n\n<p>Prie\u0161 daugel\u012f met\u0173, kai nor\u0117jome atlikti tam tikrus integracijos testus ir naudoti, pavyzd\u017eiui, duomen\u0173 bazes, tur\u0117jome dvi galimybes:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Duomen\u0173 baz\u0119 galime \u012fdiegti vietoje. Nustatykite schem\u0105 ir prisijunkite i\u0161 m\u016bs\u0173 bandymo;<\/li>\n\n\n\n<li>Galime prisijungti prie esamo egzemplioriaus \"ka\u017ekur erdv\u0117je\".<\/li>\n<\/ol>\n\n\n\n<p>Abu tur\u0117jo privalum\u0173 ir tr\u016bkum\u0173. Ta\u010diau abiem atvejais atsiranda papildom\u0173 sud\u0117tingumo lygi\u0173. Kartais tai buvo techninis sud\u0117tingumas, atsirandantis d\u0117l tam tikr\u0173 \u012franki\u0173 savybi\u0173, pvz., \"Oracle\" DB diegimas ir valdymas vietiniame prieglobstyje. Kartais tai buvo proceso nepatogumai, pvz., reikia susitarti su testo <a href=\"https:\/\/thecodest.co\/lt\/dictionary\/how-to-lead-software-development-team\/\">komanda<\/a> apie JMS naudojim\u0105... kiekvien\u0105 kart\u0105, kai norite paleisti testus.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Konteineriai \u012f pagalb\u0105<\/h3>\n\n\n\n<p>Per pastaruosius 10 met\u0173 konteinerizavimo id\u0117ja sulauk\u0117 pripa\u017einimo pramon\u0117je. Tod\u0117l nat\u016bralu, kad m\u016bs\u0173 integracijos test\u0173 problemai spr\u0119sti pasirinksime konteinerius. Tai paprastas, \u0161varus sprendimas. Tiesiog paleid\u017eiate savo proceso k\u016brim\u0105 ir viskas veikia! Negalite tuo patik\u0117ti? Pa\u017evelkite \u012f \u0161i\u0105 paprast\u0105 \"Maven\" s\u0105rankos konfig\u016bracij\u0105:<\/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         \u012f vir\u0161\u0173\n         test-compile\n         \n           \u012f vir\u0161\u0173\n         \n         \n           ${<a href=\"https:\/\/thecodest.co\/lt\/dictionary\/why-do-projects-fail\/\">projektas<\/a>.basedir}\/docker-compose.yml\n           true\n         \n       \n       \n         \u012f apa\u010di\u0105\n         post-integration-test\n         \n           i\u0161jungimas\n         \n         \n           ${project.basedir}\/docker-compose.yml\n           true<\/code><\/pre>\n\n\n\n<p>Ir <code>docker-compose.yml<\/code> failas taip pat atrodo gana gra\u017eiai!<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"yaml\" class=\"language-yaml\">versija: \"3.5\"\n\npaslaugos:\n\n Postgres:\n   Konteinerio_vardas: reactivedb\n   vaizdas: postgres:13.2\n   restart: always\n   aplinka:\n     - POSTGRES_USER=admin\n     - POSTGRES_PASSWORD=password\n     - POSTGRES_DB=cities\n   portai:\n     - \"5432:5432\"\n   tomai:\n     - postgres_data:\/data\/db\n\n pgadmin:\n   konteinerio_vardas: pgadmin4\n   vaizdas: dpage\/pgadmin4\n   restart: always\n   aplinka:\n     PGADMIN_DEFAULT_EMAIL: admin@admin.com\n     PGADMIN_DEFAULT_PASSWORD: password\n   prievadai:\n     - \"15050:80\"\n   tomai:\n     - pgadmin_data:\/data\/pgadmin\n\ntomai:\n postgres_data:\n pgadmin_data:<\/code><\/pre>\n\n\n\n<p>Ta\u010diau ar galite pasteb\u0117ti problem\u0105?<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Visk\u0105 blokuojantis krovininis laivas<\/h3>\n\n\n\n<p>Pateiktas pavyzdys yra labai paprastas. Tik viena postgres duomen\u0173 baz\u0117, pgAdmin ir viskas. Kai paleid\u017eiate<\/p>\n\n\n\n<p><code>bash<br>\n$ mvn \u0161varus patikrinti<br>\n<\/code><br>tada \"maven\" \u012fskiepis paleid\u017eia konteinerius ir po test\u0173 juos i\u0161jungia. Problemos prasideda tada, kai projektas auga ir m\u016bs\u0173 sud\u0117tinis failas taip pat auga. Kiekvien\u0105 kart\u0105 reik\u0117s paleisti visus konteinerius, ir jie bus gyvi per vis\u0105 surinkim\u0105. Situacij\u0105 galite \u0161iek tiek pagerinti pakeisdami \u012fskiepio vykdymo konfig\u016bracij\u0105, ta\u010diau to nepakanka. Blogiausiu atveju j\u016bs\u0173 konteineriai i\u0161naudos sistemos i\u0161teklius dar prie\u0161 pradedant bandymus!<\/p>\n\n\n\n<p>Ir tai ne vienintel\u0117 problema. Negalite paleisti n\u0117 vieno integracijos testo i\u0161 savo IDE. Prie\u0161 tai konteinerius reikia paleisti rankiniu b\u016bdu. Be to, kitas \"maven\" paleidimas tuos konteinerius i\u0161ardys (\u017er. <code>\u017eemyn<\/code> vykdymas).<\/p>\n\n\n\n<p>Taigi \u0161is sprendimas yra tarsi didelis krovininis laivas. Jei viskas gerai veikia, viskas gerai. Bet koks netik\u0117tas ar ne\u012fprastas elgesys lemia <a href=\"https:\/\/thecodest.co\/lt\/blog\/why-us-companies-are-opting-for-polish-developers\/\">mus<\/a> \u012f koki\u0105 nors nelaim\u0119.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Testavimo konteineriai - paleiskite konteinerius i\u0161 test\u0173<\/h2>\n\n\n\n<p>O jei gal\u0117tume paleisti konteinerius i\u0161 test\u0173? \u0160i id\u0117ja atrodo gera, ir ji jau \u012fgyvendinama. <a href=\"https:\/\/www.testcontainers.org\/\" rel=\"nofollow\">Bandomosios talpyklos<\/a>Kadangi kalbame apie \u0161\u012f projekt\u0105, \u010dia pateikiamas m\u016bs\u0173 problem\u0173 sprendimas. Ne idealus, bet niekas n\u0117ra tobulas.<\/p>\n\n\n\n<p>Tai yra <strong><a href=\"https:\/\/thecodest.co\/lt\/blog\/top-programming-languages-to-build-e-commerce\/\">Java<\/a><\/strong> biblioteka, kuri palaiko \"JUnit\" ir \"Spock\" testus, suteikdama lengvus ir paprastus b\u016bdus paleisti <a href=\"https:\/\/thecodest.co\/lt\/dictionary\/docker-developer\/\">\"Docker\"<\/a> konteineris. Pa\u017evelkime \u012f j\u012f ir para\u0161ykime \u0161iek tiek kodo!<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">B\u016btinosios s\u0105lygos ir konfig\u016bracija<\/h3>\n\n\n\n<p>Prie\u0161 prad\u0117dami turime patikrinti savo konfig\u016bracij\u0105. <strong>Bandomosios talpyklos<\/strong> reikia:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\"Docker\" versija v17.09,<\/li>\n\n\n\n<li>Minimali \"Java\" versija 1.8,<\/li>\n\n\n\n<li>Prieiga prie tinklo, ypa\u010d prie docker.hub.<\/li>\n<\/ul>\n\n\n\n<p>Daugiau informacijos apie konkre\u010dios OS ir CI reikalavimus rasite<br>svetain\u0117je <a href=\"https:\/\/www.testcontainers.org\/supported_docker_environment\/\" rel=\"nofollow\">dokumentacija<\/a>.<\/p>\n\n\n\n<p>Dabar metas prid\u0117ti kelet\u0105 eilu\u010di\u0173 \u012f <code>pom.xml<\/code>.<\/p>\n\n\n\n<aside>Projekte naudoju spyruoklin\u0119 \u012fkrov\u0105, kad suma\u017eint\u0173 boilerplate. <strong>Bandomosios talpyklos<\/strong> yra nepriklausomi nuo \"Spring Framework\" ir galite juos naudoti be jo.<\/aside>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"xml\" class=\"language-xml\">org.testcontainers\n       testcontainers-bom\n       ${testcontaines.version}\n       pom\n       import\n     \n   \n \n \n   \n     org.postgresql\n     postgresql\n     runtime\n   \n   \n     org.testcontainers\n     postgresql\n     test\n   \n   \n     org.testcontainers\n     junit-jupiter\n     test<\/code><\/pre>\n\n\n\n<p>A\u0161 naudoju <strong>Bandomosios talpyklos<\/strong> versija <code>1.17.3<\/code>, ta\u010diau galite naudoti naujausi\u0105.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Bandymai su \"Postgres\" konteineriu<\/h3>\n\n\n\n<p>Pirmasis \u017eingsnis - paruo\u0161ti konteinerio egzempliori\u0173. Tai galite padaryti tiesiogiai teste, ta\u010diau geriau atrodo nepriklausoma klas\u0117.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"java\" class=\"language-java\">vie\u0161oji klas\u0117 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   \/\/ nieko nedaryti. Tai bendrinamas egzempliorius. Leiskite JVM atlikti \u0161i\u0105 operacij\u0105.\n }\n}\n<\/code><\/pre>\n\n\n\n<p>Test\u0173 prad\u017eioje sukursime egzempliori\u0173 <code>Postgres13TC<\/code>. \u0160ioje klas\u0117je galima tvarkyti informacij\u0105 apie konteiner\u012f. Svarbiausia \u010dia yra duomen\u0173 baz\u0117s ry\u0161io eilut\u0117s ir \u012fgaliojimai. Dabar metas para\u0161yti labai paprast\u0105 test\u0105.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"java\" class=\"language-java\">@Testcontainers\nklas\u0117 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   bandymas (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>\u010cia naudoju \"JUnit 5\". Anotacija <code>@Testcontainers<\/code> yra dalis pl\u0117tini\u0173, kurie valdo konteinerius bandym\u0173 aplinkoje. Jie randa visus laukus su <code>@Container<\/code> anotacija ir atitinkamai \"Start\" bei \"Stop\" konteineriai.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Testai su \"Spring Boot<\/h3>\n\n\n\n<p>Kaip jau min\u0117jau, projekte naudoju \"Spring Boot\". \u0160iuo atveju reikia para\u0161yti \u0161iek tiek daugiau kodo. Pirmasis \u017eingsnis - sukurti papildom\u0105 konfig\u016bracijos klas\u0119.<\/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>\u0160i klas\u0117 pakei\u010dia esamas savybes reik\u0161m\u0117mis i\u0161 <strong>bandomoji talpykla<\/strong>. Pirmosios trys savyb\u0117s yra standartin\u0117s \"Spring\" savyb\u0117s. Kitos penkios yra papildomos, pasirinktin\u0117s savyb\u0117s, kurias galima naudoti kitiems i\u0161tekliams ir pl\u0117tiniams, pvz., liquibase, konfig\u016bruoti:<\/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>Dabar laikas apibr\u0117\u017eti paprast\u0105 integracijos test\u0105.<\/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\nklas\u0117 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>\u010cia turime kelet\u0105 papildom\u0173 pastab\u0173.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>@SpringBootTest(webEnvironment = RANDOM_PORT)<\/code> - pa\u017eymi test\u0105 kaip \"Spring Boot\" test\u0105 ir paleid\u017eia \"Spring\" kontekst\u0105.<\/li>\n\n\n\n<li><code>@AutoConfigureTestDatabase(replace = NONE)<\/code> - \u0161iose anotacijose teigiama, kad spring testo pl\u0117tinys netur\u0117t\u0173 pakeisti postgres duomen\u0173 baz\u0117s konfig\u016bracijos H2 atminties konfig\u016bracija.<\/li>\n\n\n\n<li><code>@ContextConfiguration(initializers = ContainerInit.class)<\/code> - papildomas pavasario kontekstas<br>konfig\u016bracija, kurioje nustatome savybes i\u0161 <strong>Bandomosios talpyklos<\/strong>.<\/li>\n\n\n\n<li><code>@Testcontainers<\/code> - kaip jau min\u0117ta, \u0161i anotacija kontroliuoja konteinerio gyvavimo cikl\u0105.<\/li>\n<\/ul>\n\n\n\n<p>\u0160iame pavyzdyje naudojau reaktyvi\u0105sias saugyklas, bet tas pats veikia ir su \u012fprastomis JDBC ir JPA saugyklomis.<\/p>\n\n\n\n<p>Dabar galime atlikti \u0161\u012f test\u0105. Jei tai pirmas paleidimas, variklis turi i\u0161traukti atvaizdus i\u0161 docker.hub. Tai gali u\u017etrukti akimirk\u0105. Po to pamatysime, kad paleisti du konteineriai. Vienas i\u0161 j\u0173 yra postgres, o kitas - Testcontainers valdiklis. Tas antrasis konteineris valdo paleistus konteinerius ir net jei netik\u0117tai sustoja JVM, jis i\u0161jungia konteinerius ir sutvarko aplink\u0105.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Apibendrinkime<\/h2>\n\n\n\n<p><strong>Bandomosios talpyklos<\/strong> yra labai lengvai naudojami \u012frankiai, padedantys kurti integracijos testus, kuriuose naudojami \"Docker\" konteineriai. Tai suteikia mums daugiau lankstumo ir padidina k\u016brimo greit\u012f. Tinkamai nusta\u010dius test\u0173 konfig\u016bracij\u0105, sutrump\u0117ja nauj\u0173 k\u016br\u0117j\u0173 \u012flaipinimo laikas. Jiems nereikia nustatyti vis\u0173 priklausomybi\u0173, tereikia paleisti para\u0161ytus testus su pasirinktais konfig\u016bracijos failais.<\/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=\"bendradarbiavimo v\u0117liava\"\/><\/a><\/figure>","protected":false},"excerpt":{"rendered":"<p>Ie\u0161kote b\u016bdo, kaip papras\u010diau atlikti testus? Mes jums pad\u0117sime! Per\u017ei\u016br\u0117kite \u0161\u012f straipsn\u012f ir su\u017einokite, kaip tai padaryti.<\/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\/lt\/tinklarastis\/testu-konteineriai-kaip-palengvinti-testus\/\" \/>\n<meta property=\"og:locale\" content=\"lt_LT\" \/>\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\/lt\/tinklarastis\/testu-konteineriai-kaip-palengvinti-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\":\"lt-LT\",\"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\":\"lt-LT\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/thecodest.co\\\/blog\\\/test-containers-how-to-make-tests-easier\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"lt-LT\",\"@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\":\"lt-LT\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/thecodest.co\\\/#organization\",\"name\":\"The Codest\",\"url\":\"https:\\\/\\\/thecodest.co\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"lt-LT\",\"@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\":\"lt-LT\",\"@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\\\/lt\\\/author\\\/thecodest\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Test\u0173 konteineriai - kaip palengvinti 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\/lt\/tinklarastis\/testu-konteineriai-kaip-palengvinti-testus\/","og_locale":"lt_LT","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\/lt\/tinklarastis\/testu-konteineriai-kaip-palengvinti-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":"lt-LT","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\u0173 konteineriai - kaip palengvinti 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":"lt-LT","potentialAction":[{"@type":"ReadAction","target":["https:\/\/thecodest.co\/blog\/test-containers-how-to-make-tests-easier\/"]}]},{"@type":"ImageObject","inLanguage":"lt-LT","@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":"lt-LT"},{"@type":"Organization","@id":"https:\/\/thecodest.co\/#organization","name":"The Codest","url":"https:\/\/thecodest.co\/","logo":{"@type":"ImageObject","inLanguage":"lt-LT","@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":"lt-LT","@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\/lt\/author\/thecodest\/"}]}},"_links":{"self":[{"href":"https:\/\/thecodest.co\/lt\/wp-json\/wp\/v2\/posts\/3631","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/thecodest.co\/lt\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/thecodest.co\/lt\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/thecodest.co\/lt\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/thecodest.co\/lt\/wp-json\/wp\/v2\/comments?post=3631"}],"version-history":[{"count":9,"href":"https:\/\/thecodest.co\/lt\/wp-json\/wp\/v2\/posts\/3631\/revisions"}],"predecessor-version":[{"id":8016,"href":"https:\/\/thecodest.co\/lt\/wp-json\/wp\/v2\/posts\/3631\/revisions\/8016"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/thecodest.co\/lt\/wp-json\/wp\/v2\/media\/3632"}],"wp:attachment":[{"href":"https:\/\/thecodest.co\/lt\/wp-json\/wp\/v2\/media?parent=3631"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/thecodest.co\/lt\/wp-json\/wp\/v2\/categories?post=3631"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/thecodest.co\/lt\/wp-json\/wp\/v2\/tags?post=3631"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}