{"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":"kontenery-testowe-jak-ulatwic-testy","status":"publish","type":"post","link":"https:\/\/thecodest.co\/pl\/blog\/test-containers-how-to-make-tests-easier\/","title":{"rendered":"Kontenery testowe - jak u\u0142atwi\u0107 testy?"},"content":{"rendered":"<p>Nowoczesne tworzenie aplikacji opiera si\u0119 na jednej prostej zasadzie:<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p><b>U\u017cyj kompozycji<\/b><\/p>\n<\/blockquote>\n\n\n\n<p>\u0141\u0105czymy klasy, funkcje i us\u0142ugi w wi\u0119ksze fragmenty oprogramowania. Ten ostatni element jest podstaw\u0105 <a href=\"https:\/\/thecodest.co\/pl\/dictionary\/microservices\/\">mikrous\u0142ugi<\/a> i <a href=\"https:\/\/thecodest.co\/pl\/blog\/the-power-of-hexagonal-architecture\/\">architektura sze\u015bciok\u0105tna<\/a>. Chcieliby\u015bmy wykorzysta\u0107 istniej\u0105ce rozwi\u0105zania, zintegrowa\u0107 je z naszym oprogramowaniem i przej\u015b\u0107 bezpo\u015brednio do <a href=\"https:\/\/thecodest.co\/pl\/dictionary\/what-is-the-size-of-your-potential-reachable-market\/\">rynek<\/a>.<\/p>\n\n\n\n<p>Czy chcesz obs\u0142ugiwa\u0107 rejestracj\u0119 konta i przechowywa\u0107 u\u017cytkownik\u00f3w? <a href=\"https:\/\/thecodest.co\/pl\/blog\/app-data-collection-security-risks-value-and-types-explored\/\">dane<\/a>? Mo\u017cesz wybra\u0107 jedn\u0105 z us\u0142ug OAuth. Mo\u017ce Twoja aplikacja oferuje jaki\u015b rodzaj subskrypcji lub p\u0142atno\u015bci? Istnieje wiele us\u0142ug, kt\u00f3re mog\u0105 ci w tym pom\u00f3c. Potrzebujesz analityki na swojej stronie internetowej, ale nie rozumiesz <a href=\"https:\/\/thecodest.co\/pl\/blog\/cyber-security-dilemmas-data-leaks\/\">RODO<\/a>? Zapraszamy do skorzystania z jednego z gotowych rozwi\u0105za\u0144.<\/p>\n\n\n\n<p>Co\u015b, co sprawia, \u017ce rozw\u00f3j jest tak \u0142atwy z biznesowego punktu widzenia, mo\u017ce przyprawi\u0107 o b\u00f3l g\u0142owy - w momencie, gdy trzeba napisa\u0107 prosty test.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Fantastic Beasts: Kolejki, bazy danych i jak je testowa\u0107<\/h2>\n\n\n\n<p>Testowanie jednostkowe jest do\u015b\u0107 proste. Je\u015bli b\u0119dziesz przestrzega\u0107 tylko tych zasad, to twoje \u015brodowisko testowe i <a href=\"https:\/\/thecodest.co\/pl\/dictionary\/what-is-code-refactoring\/\">kod<\/a> s\u0105 zdrowe. Jakie to zasady?<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><b>\u0141atwo\u015b\u0107 pisania<\/b> - Testy jednostkowe powinny by\u0107 \u0142atwe do napisania, poniewa\u017c pisze si\u0119 ich du\u017co. Mniejszy wysi\u0142ek oznacza wi\u0119cej napisanych test\u00f3w.<\/li>\n\n\n\n<li><b>Czytelny<\/b> - kod testu powinien by\u0107 \u0142atwy do odczytania. Test jest histori\u0105. Opisuje zachowanie oprogramowania i mo\u017ce by\u0107 u\u017cywany jako skr\u00f3t dokumentacji. Dobry test jednostkowy pomaga naprawi\u0107 b\u0142\u0119dy bez debugowania kodu.<\/li>\n\n\n\n<li><b>Niezawodny<\/b> - test powinien zako\u0144czy\u0107 si\u0119 niepowodzeniem tylko wtedy, gdy w testowanym systemie wyst\u0119puje b\u0142\u0105d. Oczywiste? Nie zawsze. Czasami testy przechodz\u0105 pomy\u015blnie, je\u015bli uruchamiasz je pojedynczo, ale ko\u0144cz\u0105 si\u0119 niepowodzeniem, gdy uruchamiasz je jako zestaw. Przechodz\u0105 pomy\u015blnie na Twojej maszynie, ale ko\u0144cz\u0105 si\u0119 niepowodzeniem na CI (<a href=\"https:\/\/blog.codinghorror.com\/the-works-on-my-machine-certification-program\/\">Dzia\u0142a na moim komputerze<\/a>). Dobry test jednostkowy ma tylko jedn\u0105 przyczyn\u0119 niepowodzenia.<\/li>\n\n\n\n<li><b>Szybko<\/b> - testy powinny by\u0107 szybkie. Przygotowanie do uruchomienia, uruchomienie i samo wykonanie testu powinno by\u0107 bardzo szybkie. W przeciwnym razie b\u0119dziesz je pisa\u0107, ale nie uruchamia\u0107. Wolne testy oznaczaj\u0105 utrat\u0119 koncentracji. Czekasz i patrzysz na pasek post\u0119pu.<\/li>\n\n\n\n<li><b>Niezale\u017cny<\/b> - wreszcie, test powinien by\u0107 niezale\u017cny. Ta zasada wynika z poprzednich. Tylko prawdziwie niezale\u017cne testy mog\u0105 sta\u0107 si\u0119 jednostk\u0105. Nie koliduj\u0105 one ze sob\u0105, mog\u0105 by\u0107 uruchamiane w dowolnej kolejno\u015bci, a potencjalne awarie nie zale\u017c\u0105 od wynik\u00f3w innych test\u00f3w. Niezale\u017cno\u015b\u0107 oznacza r\u00f3wnie\u017c brak zale\u017cno\u015bci od jakichkolwiek zewn\u0119trznych zasob\u00f3w, takich jak bazy danych, us\u0142ugi przesy\u0142ania wiadomo\u015bci lub system plik\u00f3w. Je\u015bli musisz komunikowa\u0107 si\u0119 z zewn\u0119trznymi zasobami, mo\u017cesz u\u017cy\u0107 makiet, stub\u00f3w lub manekin\u00f3w.<\/li>\n<\/ul>\n\n\n\n<p>Wszystko staje si\u0119 skomplikowane, gdy chcemy napisa\u0107 testy integracyjne. Nie jest \u017ale, je\u015bli chcemy przetestowa\u0107 kilka us\u0142ug razem. Ale kiedy musimy przetestowa\u0107 us\u0142ugi, kt\u00f3re korzystaj\u0105 z zewn\u0119trznych zasob\u00f3w, takich jak bazy danych lub us\u0142ugi przesy\u0142ania wiadomo\u015bci, wtedy prosimy o k\u0142opoty.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Aby uruchomi\u0107 test, nale\u017cy zainstalowa\u0107...<\/h3>\n\n\n\n<p>Wiele lat temu, gdy chcieli\u015bmy wykona\u0107 testy integracyjne i wykorzysta\u0107 np. bazy danych, mieli\u015bmy dwie opcje:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Mo\u017cemy zainstalowa\u0107 baz\u0119 danych lokalnie. Skonfiguruj schemat i po\u0142\u0105cz si\u0119 z naszego testu;<\/li>\n\n\n\n<li>Mo\u017cemy po\u0142\u0105czy\u0107 si\u0119 z istniej\u0105c\u0105 instancj\u0105 \"gdzie\u015b w przestrzeni\".<\/li>\n<\/ol>\n\n\n\n<p>Oba rozwi\u0105zania maj\u0105 swoje plusy i minusy. Ale oba wprowadzaj\u0105 dodatkowe poziomy z\u0142o\u017cono\u015bci. Czasami by\u0142a to z\u0142o\u017cono\u015b\u0107 techniczna wynikaj\u0105ca z charakterystyki niekt\u00f3rych narz\u0119dzi, np. instalacja i zarz\u0105dzanie Oracle DB na lokalnym ho\u015bcie. Czasami by\u0142a to niedogodno\u015b\u0107 w procesie, np. konieczno\u015b\u0107 uzgodnienia z testerem <a href=\"https:\/\/thecodest.co\/pl\/dictionary\/how-to-lead-software-development-team\/\">zesp\u00f3\u0142<\/a> o wykorzystaniu JMS... za ka\u017cdym razem, gdy chcesz uruchomi\u0107 testy.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Kontenery na ratunek<\/h3>\n\n\n\n<p>W ci\u0105gu ostatnich 10 lat idea konteneryzacji zyska\u0142a uznanie w bran\u017cy. Naturaln\u0105 decyzj\u0105 by\u0142o wi\u0119c wybranie kontener\u00f3w jako rozwi\u0105zania dla naszej kwestii test\u00f3w integracyjnych. Jest to proste, czyste rozwi\u0105zanie. Wystarczy uruchomi\u0107 kompilacj\u0119 procesu i wszystko dzia\u0142a! Nie mo\u017cesz w to uwierzy\u0107? Sp\u00f3jrz na t\u0119 prost\u0105 konfiguracj\u0119 kompilacji maven:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"xml\" class=\"language-xml\">com.dkanejs.maven.plugins\n     docker-compose-maven-plugin\n     4.0.0\n     \n       \n         up\n         test-compile\n         \n           up\n         \n         \n           ${<a href=\"https:\/\/thecodest.co\/pl\/dictionary\/why-do-projects-fail\/\">projekt<\/a>.basedir}\/docker-compose.yml\n           true.\n         \n       \n       \n         down\n         post-integration-test\n         \n           down\n         \n         \n           ${project.basedir}\/docker-compose.yml\n           true.<\/code><\/pre>\n\n\n\n<p>I <code>docker-compose.yml<\/code> Plik te\u017c wygl\u0105da ca\u0142kiem nie\u017ale!<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"yaml\" class=\"language-yaml\">wersja: \"3.5\"\n\nus\u0142ugi:\n\n postgres:\n   container_name: reactivedb\n   image: postgres:13.2\n   restart: zawsze\n   environment:\n     - POSTGRES_USER=admin\n     - POSTGRES_PASSWORD=has\u0142o\n     - POSTGRES_DB=miasta\n   porty:\n     - \"5432:5432\"\n   wolumeny:\n     - postgres_data:\/data\/db\n\n pgadmin:\n   container_name: pgadmin4\n   image: dpage\/pgadmin4\n   restart: zawsze\n   environment:\n     PGADMIN_DEFAULT_EMAIL: admin@admin.com\n     PGADMIN_DEFAULT_PASSWORD: has\u0142o\n   porty:\n     - \"15050:80\"\n   wolumeny:\n     - pgadmin_data:\/data\/pgadmin\n\nwolumeny:\n postgres_data:\n pgadmin_data:<\/code><\/pre>\n\n\n\n<p>Ale czy dostrzegasz tutaj problem?<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Statek towarowy, kt\u00f3ry blokuje wszystko<\/h3>\n\n\n\n<p>Powy\u017cszy przyk\u0142ad jest bardzo prosty. Tylko jedna baza danych postgres, pgAdmin i to wszystko. Po uruchomieniu<\/p>\n\n\n\n<p><code>bash<br>\n$ mvn clean verify<br>\n<\/code><br>nast\u0119pnie wtyczka maven uruchamia kontenery, a po testach je wy\u0142\u0105cza. Problemy zaczynaj\u0105 si\u0119, gdy projekt si\u0119 rozrasta, a nasz plik compose r\u00f3wnie\u017c ro\u015bnie. Za ka\u017cdym razem trzeba b\u0119dzie uruchamia\u0107 wszystkie kontenery i b\u0119d\u0105 one \u017cy\u0142y przez ca\u0142y czas trwania kompilacji. Mo\u017cna nieco poprawi\u0107 sytuacj\u0119 zmieniaj\u0105c konfiguracj\u0119 wykonywania plugin\u00f3w, ale to nie wystarczy. W najgorszym przypadku kontenery wyczerpi\u0105 zasoby systemowe przed rozpocz\u0119ciem test\u00f3w!<\/p>\n\n\n\n<p>I nie jest to jedyny problem. Nie mo\u017cna uruchomi\u0107 pojedynczego testu integracyjnego z IDE. Wcze\u015bniej trzeba r\u0119cznie uruchomi\u0107 kontenery. Co wi\u0119cej, nast\u0119pne uruchomienie mavena zburzy te kontenery (sp\u00f3jrz na <code>w d\u00f3\u0142<\/code> wykonanie).<\/p>\n\n\n\n<p>Wi\u0119c to rozwi\u0105zanie jest jak du\u017cy statek towarowy. Je\u015bli wszystko dzia\u0142a dobrze, to jest w porz\u0105dku. Ka\u017cde nieoczekiwane lub nietypowe zachowanie prowadzi do <a href=\"https:\/\/thecodest.co\/pl\/blog\/why-us-companies-are-opting-for-polish-developers\/\">my<\/a> do jakiej\u015b katastrofy.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Kontenery testowe - uruchamianie kontener\u00f3w z test\u00f3w<\/h2>\n\n\n\n<p>Ale co by by\u0142o, gdyby\u015bmy mogli uruchamia\u0107 nasze kontenery z test\u00f3w? Ten pomys\u0142 wygl\u0105da dobrze i jest ju\u017c wdra\u017cany. <a href=\"https:\/\/www.testcontainers.org\/\" rel=\"nofollow\">Pojemniki testowe<\/a>Poniewa\u017c m\u00f3wimy o tym projekcie, oto rozwi\u0105zanie naszych problem\u00f3w. Nie jest idealne, ale nikt nie jest idealny.<\/p>\n\n\n\n<p>To jest <strong><a href=\"https:\/\/thecodest.co\/pl\/blog\/top-programming-languages-to-build-e-commerce\/\">Java<\/a><\/strong> kt\u00f3ra obs\u0142uguje testy JUnit i Spock, zapewniaj\u0105c lekkie i \u0142atwe sposoby uruchamiania <a href=\"https:\/\/thecodest.co\/pl\/dictionary\/docker-developer\/\">Docker<\/a> kontener. Przyjrzyjmy si\u0119 temu i napiszmy troch\u0119 kodu!<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Wymagania wst\u0119pne i konfiguracja<\/h3>\n\n\n\n<p>Zanim zaczniemy, musimy sprawdzi\u0107 nasz\u0105 konfiguracj\u0119. <strong>Pojemniki testowe<\/strong> potrzeba:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Docker w wersji v17.09,<\/li>\n\n\n\n<li>Java w wersji minimum 1.8,<\/li>\n\n\n\n<li>Dost\u0119p do sieci, zw\u0142aszcza do docker.hub.<\/li>\n<\/ul>\n\n\n\n<p>Wi\u0119cej informacji na temat wymaga\u0144 dla okre\u015blonego systemu operacyjnego i CI mo\u017cna znale\u017a\u0107 na stronie<br>w <a href=\"https:\/\/www.testcontainers.org\/supported_docker_environment\/\" rel=\"nofollow\">dokumentacja<\/a>.<\/p>\n\n\n\n<p>Teraz nadszed\u0142 czas, aby doda\u0107 kilka linii do <code>pom.xml<\/code>.<\/p>\n\n\n\n<aside>U\u017cywam Spring Boot w projekcie, aby zredukowa\u0107 boilerplate. <strong>Pojemniki testowe<\/strong> s\u0105 niezale\u017cne od Spring Framework i mo\u017cna ich u\u017cywa\u0107 bez niego.<\/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\n   \n .<\/code><\/pre>\n\n\n\n<p>U\u017cywam <strong>Pojemniki testowe<\/strong> wersja <code>1.17.3<\/code>, ale nie kr\u0119puj si\u0119 u\u017cy\u0107 najnowszego.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Testy z kontenerem Postgres<\/h3>\n\n\n\n<p>Pierwszym krokiem jest przygotowanie instancji kontenera. Mo\u017cna to zrobi\u0107 bezpo\u015brednio w te\u015bcie, ale lepiej wygl\u0105da niezale\u017cna klasa.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"java\" class=\"language-java\">public class Postgres13TC extends PostgreSQLContainer {\n\n private static final Postgres13TC TC = new Postgres13TC();\n\n private Postgres13TC() {\n   super(\"postgres:13.2\");\n }\n\n public static Postgres13TC getInstance() {\n   return TC;\n }\n\n @Override\n public void start() {\n   super.start();\n   System.setProperty(\"DB_URL\", TC.getJdbcUrl());\n   System.setProperty(\"DB_USERNAME\", TC.getUsername());\n   System.setProperty(\"DB_PASSWORD\", TC.getPassword());\n }\n\n @Override\n public void stop() {\n   \/\/ nic nie r\u00f3b. To jest wsp\u00f3\u0142dzielona instancja. Niech JVM zajmie si\u0119 t\u0105 operacj\u0105.\n }\n}\n<\/code><\/pre>\n\n\n\n<p>Na pocz\u0105tku test\u00f3w utworzymy instancj\u0119 klasy <code>Postgres13TC<\/code>. Ta klasa mo\u017ce obs\u0142ugiwa\u0107 informacje o naszym kontenerze. Najwa\u017cniejsze s\u0105 tutaj ci\u0105gi po\u0142\u0105czenia z baz\u0105 danych i dane uwierzytelniaj\u0105ce. Teraz nadszed\u0142 czas na napisanie bardzo prostego testu.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"java\" class=\"language-java\">@Testcontainers\nclass SimpleDbTest {\n\n @Container\n private static Postgres13TC = Postgres13TC.getInstance();\n\n @Test\n void testConnection() {\n   assumeThat(postgres13TC.isRunning());\n   var connectionProps = new Properties();\n   connectionProps.put(\"user\", postgres13TC.getUsername());\n   connectionProps.put(\"password\", postgres13TC.getPassword());\n\n   try (Connection = DriverManager.getConnection(postgres13TC.getJdbcUrl(),\n       connectionProps) {\n     var resultSet = connection.prepareStatement(\"Select 1\").executeQuery();\n     resultSet.next();\n     assertThat(resultSet.getInt(1)).isEqualTo(1);\n   } catch (wyj\u0105tek SQLException sqlException) {\n     assertThat((Exception) sqlException).doesNotThrowAnyException();\n   }\n }\n}<\/code><\/pre>\n\n\n\n<p>U\u017cywam tutaj JUnit 5. Adnotacja <code>@Testcontainers<\/code> jest cz\u0119\u015bci\u0105 rozszerze\u0144, kt\u00f3re kontroluj\u0105 kontenery w \u015brodowisku testowym. Znajduj\u0105 one wszystkie pola z <code>@Kontener<\/code> adnotacja i odpowiednio kontenery start i stop.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Testy z u\u017cyciem Spring Boot<\/h3>\n\n\n\n<p>Jak wspomnia\u0142em wcze\u015bniej, w projekcie wykorzystuj\u0119 Spring Boot. W tym przypadku musimy napisa\u0107 troch\u0119 wi\u0119cej kodu. Pierwszym krokiem jest stworzenie dodatkowej klasy konfiguracyjnej.<\/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>Klasa ta zast\u0119puje istniej\u0105ce w\u0142a\u015bciwo\u015bci warto\u015bciami z klasy <strong>pojemnik testowy<\/strong>. Pierwsze trzy w\u0142a\u015bciwo\u015bci s\u0105 standardowymi w\u0142a\u015bciwo\u015bciami Spring. Kolejne pi\u0119\u0107 to dodatkowe, niestandardowe w\u0142a\u015bciwo\u015bci, kt\u00f3re mog\u0105 by\u0107 u\u017cywane do konfigurowania innych zasob\u00f3w i rozszerze\u0144, takich jak np. 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>Teraz nadszed\u0142 czas na zdefiniowanie prostego testu integracyjnego.<\/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>Mamy tutaj kilka dodatkowych adnotacji.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>@SpringBootTest(webEnvironment = RANDOM_PORT)<\/code> - oznacza test jako test Spring Boot i uruchamia kontekst Spring.<\/li>\n\n\n\n<li><code>@AutoConfigureTestDatabase(replace = NONE)<\/code> - te adnotacje m\u00f3wi\u0105, \u017ce rozszerzenie testu wiosennego nie powinno zast\u0119powa\u0107 konfiguracji bazy danych postgres konfiguracj\u0105 H2 w konfiguracji pami\u0119ci.<\/li>\n\n\n\n<li><code>@ContextConfiguration(initializers = ContainerInit.class)<\/code> - dodatkowy kontekst wiosenny<br>konfiguracja, w kt\u00f3rej ustawiamy w\u0142a\u015bciwo\u015bci z <strong>Pojemniki testowe<\/strong>.<\/li>\n\n\n\n<li><code>@Testcontainers<\/code> - Jak wspomniano wcze\u015bniej, adnotacja ta kontroluje cykl \u017cycia kontenera.<\/li>\n<\/ul>\n\n\n\n<p>W tym przyk\u0142adzie u\u017cywam repozytori\u00f3w reaktywnych, ale dzia\u0142a to tak samo ze zwyk\u0142ymi repozytoriami JDBC i JPA.<\/p>\n\n\n\n<p>Teraz mo\u017cemy uruchomi\u0107 ten test. Je\u015bli jest to pierwsze uruchomienie, silnik musi pobra\u0107 obrazy z docker.hub. To mo\u017ce chwil\u0119 potrwa\u0107. Nast\u0119pnie zobaczymy, \u017ce uruchomione zosta\u0142y dwa kontenery. Jednym z nich jest postgres, a drugim kontroler Testcontainers. Ten drugi kontener zarz\u0105dza uruchomionymi kontenerami i nawet je\u015bli JVM nieoczekiwanie si\u0119 zatrzyma, wy\u0142\u0105cza kontenery i czy\u015bci \u015brodowisko.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Podsumujmy<\/h2>\n\n\n\n<p><strong>Pojemniki testowe<\/strong> to bardzo \u0142atwe w u\u017cyciu narz\u0119dzia, kt\u00f3re pomagaj\u0105 nam tworzy\u0107 testy integracyjne wykorzystuj\u0105ce kontenery Docker. Daje nam to wi\u0119ksz\u0105 elastyczno\u015b\u0107 i zwi\u0119ksza szybko\u015b\u0107 rozwoju. Odpowiednia konfiguracja test\u00f3w skraca czas potrzebny na wdro\u017cenie nowych programist\u00f3w. Nie musz\u0105 oni ustawia\u0107 wszystkich zale\u017cno\u015bci, wystarczy, \u017ce uruchomi\u0105 napisane testy z wybranymi plikami konfiguracyjnymi.<\/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=\"baner wsp\u00f3\u0142pracy\"\/><\/a><\/figure>","protected":false},"excerpt":{"rendered":"<p>Szukasz sposobu na tworzenie test\u00f3w w \u0142atwiejszy spos\u00f3b? Mamy dla Ciebie rozwi\u0105zanie! Sprawd\u017a poni\u017cszy artyku\u0142 i dowiedz si\u0119, jak to zrobi\u0107.<\/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\/pl\/blog\/kontenery-testowe-jak-ulatwic-testy\/\" \/>\n<meta property=\"og:locale\" content=\"pl_PL\" \/>\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\/pl\/blog\/kontenery-testowe-jak-ulatwic-testy\/\" \/>\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 minut\" \/>\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\":\"pl-PL\",\"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\":\"pl-PL\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/thecodest.co\\\/blog\\\/test-containers-how-to-make-tests-easier\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"pl-PL\",\"@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\":\"pl-PL\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/thecodest.co\\\/#organization\",\"name\":\"The Codest\",\"url\":\"https:\\\/\\\/thecodest.co\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"pl-PL\",\"@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\":\"pl-PL\",\"@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\\\/pl\\\/author\\\/thecodest\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Kontenery testowe - jak u\u0142atwi\u0107 testy? - 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\/pl\/blog\/kontenery-testowe-jak-ulatwic-testy\/","og_locale":"pl_PL","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\/pl\/blog\/kontenery-testowe-jak-ulatwic-testy\/","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 minut"},"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":"pl-PL","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":"Kontenery testowe - jak u\u0142atwi\u0107 testy? - 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":"pl-PL","potentialAction":[{"@type":"ReadAction","target":["https:\/\/thecodest.co\/blog\/test-containers-how-to-make-tests-easier\/"]}]},{"@type":"ImageObject","inLanguage":"pl-PL","@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":"pl-PL"},{"@type":"Organization","@id":"https:\/\/thecodest.co\/#organization","name":"The Codest","url":"https:\/\/thecodest.co\/","logo":{"@type":"ImageObject","inLanguage":"pl-PL","@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":"pl-PL","@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\/pl\/author\/thecodest\/"}]}},"_links":{"self":[{"href":"https:\/\/thecodest.co\/pl\/wp-json\/wp\/v2\/posts\/3631","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/thecodest.co\/pl\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/thecodest.co\/pl\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/thecodest.co\/pl\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/thecodest.co\/pl\/wp-json\/wp\/v2\/comments?post=3631"}],"version-history":[{"count":9,"href":"https:\/\/thecodest.co\/pl\/wp-json\/wp\/v2\/posts\/3631\/revisions"}],"predecessor-version":[{"id":8016,"href":"https:\/\/thecodest.co\/pl\/wp-json\/wp\/v2\/posts\/3631\/revisions\/8016"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/thecodest.co\/pl\/wp-json\/wp\/v2\/media\/3632"}],"wp:attachment":[{"href":"https:\/\/thecodest.co\/pl\/wp-json\/wp\/v2\/media?parent=3631"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/thecodest.co\/pl\/wp-json\/wp\/v2\/categories?post=3631"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/thecodest.co\/pl\/wp-json\/wp\/v2\/tags?post=3631"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}