{"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":"testisailiot-miten-tehda-testeista-helpompia","status":"publish","type":"post","link":"https:\/\/thecodest.co\/fi\/blog\/test-containers-how-to-make-tests-easier\/","title":{"rendered":"Testikontit - miten tehd\u00e4 testeist\u00e4 helpompia?"},"content":{"rendered":"<p>Nykyaikainen sovelluskehitys perustuu yhteen yksinkertaiseen s\u00e4\u00e4nt\u00f6\u00f6n:<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p><b>K\u00e4yt\u00e4 koostumusta<\/b><\/p>\n<\/blockquote>\n\n\n\n<p>Kokoonpanemme luokkia, funktioita ja palveluita suuremmiksi ohjelmistokokonaisuuksiksi. T\u00e4m\u00e4 viimeinen elementti on perusta <a href=\"https:\/\/thecodest.co\/fi\/dictionary\/microservices\/\">mikropalvelut<\/a> ja <a href=\"https:\/\/thecodest.co\/fi\/blog\/the-power-of-hexagonal-architecture\/\">kuusikulmainen arkkitehtuuri<\/a>. Haluaisimme k\u00e4ytt\u00e4\u00e4 olemassa olevia ratkaisuja, integroida ne ohjelmistoomme ja siirty\u00e4 suoraan markkinoille. <a href=\"https:\/\/thecodest.co\/fi\/dictionary\/what-is-the-size-of-your-potential-reachable-market\/\">markkinat<\/a>.<\/p>\n\n\n\n<p>Haluatko k\u00e4sitell\u00e4 tilin rekister\u00f6inti\u00e4 ja tallentaa k\u00e4ytt\u00e4j\u00e4n tietoja? <a href=\"https:\/\/thecodest.co\/fi\/blog\/app-data-collection-security-risks-value-and-types-explored\/\">tiedot<\/a>? Voit valita jonkin OAuth-palveluista. Ehk\u00e4 sovelluksesi tarjoaa jonkinlaisen tilauksen tai maksun? On monia palveluja, jotka voivat auttaa sinua k\u00e4sittelem\u00e4\u00e4n t\u00e4m\u00e4n. Tarvitsetko sivustollesi analytiikkaa, mutta et ymm\u00e4rr\u00e4 <a href=\"https:\/\/thecodest.co\/fi\/blog\/cyber-security-dilemmas-data-leaks\/\">GDPR<\/a>? Ota rohkeasti jokin valmiista ratkaisuista.<\/p>\n\n\n\n<p>Jokin, joka tekee kehitt\u00e4misest\u00e4 liiketoiminnan kannalta niin helppoa, voi aiheuttaa p\u00e4\u00e4ns\u00e4rky\u00e4 - silloin kun sinun on kirjoitettava yksinkertainen testi.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Fantastic Beasts: Jonot, tietokannat ja niiden testaaminen: Jonot, tietokannat ja niiden testaaminen<\/h2>\n\n\n\n<p>Yksikk\u00f6testaus on melko yksinkertaista. Jos noudatat vain s\u00e4\u00e4nt\u00f6j\u00e4, testausymp\u00e4rist\u00f6si ja <a href=\"https:\/\/thecodest.co\/fi\/dictionary\/what-is-code-refactoring\/\">koodi<\/a> ovat terveit\u00e4. Mit\u00e4 s\u00e4\u00e4nt\u00f6j\u00e4 nuo ovat?<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><b>Helppo kirjoittaa<\/b> - yksikk\u00f6testin pit\u00e4isi olla helppo kirjoittaa, koska niit\u00e4 kirjoitetaan paljon. V\u00e4hemm\u00e4n vaivaa tarkoittaa, ett\u00e4 testej\u00e4 kirjoitetaan enemm\u00e4n.<\/li>\n\n\n\n<li><b>Luettavissa<\/b> - testikoodin pit\u00e4isi olla helppolukuista. Testi on tarina. Se kuvaa ohjelmiston k\u00e4ytt\u00e4ytymist\u00e4, ja sit\u00e4 voidaan k\u00e4ytt\u00e4\u00e4 dokumentoinnin oikotien\u00e4. Hyv\u00e4 yksikk\u00f6testi auttaa korjaamaan virheet ilman koodin virheenkorjausta.<\/li>\n\n\n\n<li><b>Luotettava<\/b> - testin pit\u00e4isi ep\u00e4onnistua vain, jos testattavassa j\u00e4rjestelm\u00e4ss\u00e4 on virhe. Ilmeist\u00e4? Ei aina. Joskus testit menev\u00e4t l\u00e4pi, jos ne ajetaan yksitellen, mutta ep\u00e4onnistuvat, kun ne ajetaan kokonaisuutena. Ne menev\u00e4t l\u00e4pi omalla koneellasi, mutta ep\u00e4onnistuvat CI:ss\u00e4 (<a href=\"https:\/\/blog.codinghorror.com\/the-works-on-my-machine-certification-program\/\">Toimii koneessani<\/a>). Hyv\u00e4ll\u00e4 yksikk\u00f6testill\u00e4 on vain yksi syy ep\u00e4onnistumiseen.<\/li>\n\n\n\n<li><b>Nopea<\/b> - testien pit\u00e4isi olla nopeita. Testien valmistelun, k\u00e4ynnistyksen ja itse testin suorittamisen pit\u00e4isi olla eritt\u00e4in nopeaa. Muuten testit kirjoitetaan, mutta niit\u00e4 ei ajeta. Hitaat testit merkitsev\u00e4t keskittymisen menetyst\u00e4. Odotat ja katsot edistymispalkkia.<\/li>\n\n\n\n<li><b>Itsen\u00e4inen<\/b> - Lopuksi testin on oltava riippumaton. T\u00e4m\u00e4 s\u00e4\u00e4nt\u00f6 perustuu edellisiin s\u00e4\u00e4nt\u00f6ihin. Vain todella itsen\u00e4isist\u00e4 testeist\u00e4 voi tulla yksikk\u00f6. Ne eiv\u00e4t h\u00e4iritse toisiaan, ne voidaan suorittaa miss\u00e4 tahansa j\u00e4rjestyksess\u00e4, eiv\u00e4tk\u00e4 mahdolliset virheet riipu muiden testien tuloksista. Riippumattomuus tarkoittaa my\u00f6s sit\u00e4, ett\u00e4 testit eiv\u00e4t ole riippuvaisia ulkoisista resursseista, kuten tietokannoista, viestipalveluista tai tiedostoj\u00e4rjestelm\u00e4st\u00e4. Jos sinun on kommunikoitava ulkoisten j\u00e4rjestelmien kanssa, voit k\u00e4ytt\u00e4\u00e4 mockeja, stubeja tai dummyja.<\/li>\n<\/ul>\n\n\n\n<p>Kaikki muuttuu monimutkaiseksi, kun haluamme kirjoittaa integrointitestej\u00e4. Se ei ole paha asia, jos haluamme testata muutaman palvelun yhdess\u00e4. Mutta kun meid\u00e4n on testattava palveluita, jotka k\u00e4ytt\u00e4v\u00e4t ulkoisia resursseja, kuten tietokantoja tai sanomanv\u00e4lityspalveluita, joudumme vaikeuksiin.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Testin suorittamiseksi sinun on asennettava...<\/h3>\n\n\n\n<p>Kun vuosia sitten halusimme tehd\u00e4 integrointitestej\u00e4 ja k\u00e4ytt\u00e4\u00e4 esimerkiksi tietokantoja, meill\u00e4 oli kaksi vaihtoehtoa:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Voimme asentaa tietokannan paikallisesti. Aseta skeema ja muodosta yhteys testist\u00e4mme;<\/li>\n\n\n\n<li>Voimme muodostaa yhteyden olemassa olevaan instanssiin \"jossain avaruudessa\".<\/li>\n<\/ol>\n\n\n\n<p>Molemmilla oli hyv\u00e4t ja huonot puolensa. Molemmat tuovat kuitenkin lis\u00e4\u00e4 monimutkaisuutta. Joskus kyse oli tiettyjen v\u00e4lineiden ominaisuuksista johtuvasta teknisest\u00e4 monimutkaisuudesta, esimerkiksi Oracle DB:n asentaminen ja hallinta localhostilla. Joskus kyse oli prosessin hankaluudesta, esimerkiksi siit\u00e4, ett\u00e4 sinun on sovittava testin kanssa. <a href=\"https:\/\/thecodest.co\/fi\/dictionary\/how-to-lead-software-development-team\/\">joukkue<\/a> JMS:n k\u00e4yt\u00f6st\u00e4... joka kerta, kun haluat suorittaa testej\u00e4.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Kontit pelastavat<\/h3>\n\n\n\n<p>Viimeisten 10 vuoden aikana konttitoiminnan ajatus on saanut alalla tunnustusta. Luonnollinen p\u00e4\u00e4t\u00f6s on siis valita kontit ratkaisuksi integraatiotestausongelmaamme. T\u00e4m\u00e4 on yksinkertainen ja siisti ratkaisu. Suoritat vain prosessin rakentamisen ja kaikki toimii! Etk\u00f6 voi uskoa sit\u00e4? Katso t\u00e4t\u00e4 yksinkertaista maven-buildin konfigurointia:<\/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\/fi\/dictionary\/why-do-projects-fail\/\">projekti<\/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>Ja <code>docker-compose.yml<\/code> tiedosto n\u00e4ytt\u00e4\u00e4 my\u00f6s aika hyv\u00e4lt\u00e4!<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"yaml\" class=\"language-yaml\">versio: \"3.5\"\n\npalvelut:\n\n postgres:\n   reactivedb: attribuutti: postgresst: container_name: reactivedb\n   image: postgres:13.2\n   restart: always\n   environment:\n     - POSTGRES_USER=admin\n     - POSTGRES_PASSWORD=salasana\n     - POSTGRES_DB=cities\n   portit:\n     - \"5432:5432\"\n   volumes:\n     - postgres_data:\/data\/db\n\n pgadmin:\n   container_name: pgadmin4\n   image: dpage\/pgadmin4\n   restart: aina\n   environment:\n     PGADMIN_DEFAULT_EMAIL: admin@admin.com\n     PGADMIN_DEFAULT_PASSWORD: salasana: password\n   portit:\n     - \"15050:80\"\n   volumes:\n     - pgadmin_data:\/data\/pgadmin\n\nvolumes:\n postgres_data: Pgmd_data: Pgmd_data: postgres_data:\n pgadmin_data:<\/code><\/pre>\n\n\n\n<p>Mutta huomaatko, mist\u00e4 t\u00e4ss\u00e4 on kysymys?<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Rahtialus, joka est\u00e4\u00e4 kaiken<\/h3>\n\n\n\n<p>Yll\u00e4 oleva esimerkki on hyvin yksinkertainen. Vain yksi postgres-tietokanta, pgAdmin ja siin\u00e4 kaikki. Kun suoritat<\/p>\n\n\n\n<p><code>bash<br>\n$ mvn clean verify<br>\n<\/code><br>maven-lis\u00e4osa k\u00e4ynnist\u00e4\u00e4 s\u00e4ili\u00f6t ja sammuttaa ne testien j\u00e4lkeen. Ongelmat alkavat, kun projekti kasvaa ja my\u00f6s koostetiedostomme kasvaa. Joka kerta on k\u00e4ynnistett\u00e4v\u00e4 kaikki kontit, ja ne ovat elossa koko buildin ajan. Voit parantaa tilannetta hieman muuttamalla pluginin suoritusasetuksia, mutta se ei riit\u00e4. Pahimmassa tapauksessa konttiesi kuluttavat j\u00e4rjestelm\u00e4resurssit loppuun ennen kuin testit alkavat!<\/p>\n\n\n\n<p>Eik\u00e4 t\u00e4m\u00e4 ole ainoa ongelma. Et voi suorittaa yksitt\u00e4ist\u00e4 integrointitesti\u00e4 IDE:st\u00e4. Sit\u00e4 ennen sinun on k\u00e4ynnistett\u00e4v\u00e4 kontit k\u00e4sin. Lis\u00e4ksi seuraava maven-ajo purkaa n\u00e4m\u00e4 kontit (katso esim. <code>alas<\/code> suorittaminen).<\/p>\n\n\n\n<p>T\u00e4m\u00e4 ratkaisu on siis kuin iso rahtilaiva. Jos kaikki toimii hyvin, niin se on ok. Mik\u00e4 tahansa odottamaton tai ep\u00e4tavallinen k\u00e4ytt\u00e4ytyminen johtaa <a href=\"https:\/\/thecodest.co\/fi\/blog\/why-us-companies-are-opting-for-polish-developers\/\">us<\/a> jonkinlaiseen katastrofiin.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Testis\u00e4ili\u00f6t - aja s\u00e4ili\u00f6it\u00e4 testeist\u00e4<\/h2>\n\n\n\n<p>Mutta ent\u00e4 jos voisimme k\u00e4ytt\u00e4\u00e4 konttejamme testeist\u00e4 k\u00e4sin? T\u00e4m\u00e4 idea n\u00e4ytt\u00e4\u00e4 hyv\u00e4lt\u00e4, ja sit\u00e4 toteutetaan jo. <a href=\"https:\/\/www.testcontainers.org\/\" rel=\"nofollow\">Testikontit<\/a>, koska puhumme t\u00e4st\u00e4 hankkeesta, t\u00e4ss\u00e4 on ratkaisu ongelmiin. Ei ihanteellinen, mutta kukaan ei ole t\u00e4ydellinen.<\/p>\n\n\n\n<p>T\u00e4m\u00e4 on <strong><a href=\"https:\/\/thecodest.co\/fi\/blog\/top-programming-languages-to-build-e-commerce\/\">Java<\/a><\/strong> kirjasto, joka tukee JUnit- ja Spock-testej\u00e4, tarjoten kevyit\u00e4 ja helppoja tapoja ajaa <a href=\"https:\/\/thecodest.co\/fi\/dictionary\/docker-developer\/\">Docker<\/a> kontti. Katsotaanpa sit\u00e4 ja kirjoitetaan koodia!<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Edellytykset ja kokoonpano<\/h3>\n\n\n\n<p>Ennen kuin aloitamme, meid\u00e4n on tarkistettava kokoonpanomme. <strong>Testiastiat<\/strong> tarvitsevat:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Docker versiossa v17.09,<\/li>\n\n\n\n<li>Javan v\u00e4himm\u00e4isversio 1.8,<\/li>\n\n\n\n<li>P\u00e4\u00e4sy verkkoon, erityisesti docker.hubiin.<\/li>\n<\/ul>\n\n\n\n<p>Lis\u00e4tietoja tietyn k\u00e4ytt\u00f6j\u00e4rjestelm\u00e4n ja CI:n vaatimuksista on saatavilla osoitteessa<br>osoitteessa <a href=\"https:\/\/www.testcontainers.org\/supported_docker_environment\/\" rel=\"nofollow\">dokumentaatio<\/a>.<\/p>\n\n\n\n<p>Nyt on aika lis\u00e4t\u00e4 muutamia rivej\u00e4 kohtaan <code>pom.xml<\/code>.<\/p>\n\n\n\n<aside>K\u00e4yt\u00e4n Spring Bootia projektissa v\u00e4hent\u00e4\u00e4kseni boilerplatea. <strong>Testiastiat<\/strong> ovat riippumattomia Spring Frameworkista, ja voit k\u00e4ytt\u00e4\u00e4 niit\u00e4 ilman sit\u00e4.<\/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>K\u00e4yt\u00e4n <strong>Testiastiat<\/strong> versio <code>1.17.3<\/code>, mutta voit vapaasti k\u00e4ytt\u00e4\u00e4 uusinta.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Testit Postgres-s\u00e4ili\u00f6n kanssa<\/h3>\n\n\n\n<p>Ensimm\u00e4inen vaihe on valmistella kontti-instanssimme. Voit tehd\u00e4 sen suoraan testiss\u00e4, mutta itsen\u00e4inen luokka n\u00e4ytt\u00e4\u00e4 paremmalta.<\/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   \/\/ ei tee mit\u00e4\u00e4n. T\u00e4m\u00e4 on jaettu instanssi. Anna JVM:n hoitaa t\u00e4m\u00e4 toiminto.\n }\n}\n<\/code><\/pre>\n\n\n\n<p>Testien alussa luomme instanssin luokasta <code>Postgres13TC<\/code>. T\u00e4m\u00e4 luokka voi k\u00e4sitell\u00e4 konttiamme koskevia tietoja. T\u00e4rkeimpi\u00e4 ovat tietokantayhteysmerkkijonot ja tunnistetiedot. Nyt on aika kirjoittaa hyvin yksinkertainen testi.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"java\" class=\"language-java\">@Testikontit\nclass SimpleDbTest {\n\n @Container\n private static Postgres13TC = Postgres13TC.getInstance();\n\n @Test\n void testConnection() {\n   assumeThat(postgres13TC.isRunning());\n   var connectionProps = new Properties();\n   connectionProps.put(\"user\", postgres13TC.getUsername());\n   connectionProps.put(\"password\", postgres13TC.getPassword());\n\n   try (Connection = DriverManager.getConnection(postgres13TC.getJdbcUrl(),\n       connectionProps)) {\n     var resultSet = connection.prepareStatement(\"Select 1\").executeQuery();\n     resultSet.next();\n     assertThat(resultSet.getInt(1)).isEqualTo(1);\n   } catch (SQLException sqlException) {\n     assertThat((Exception) sqlException).doesNotThrowAnyException();\n   }\n }\n}<\/code><\/pre>\n\n\n\n<p>K\u00e4yt\u00e4n t\u00e4ss\u00e4 JUnit 5:t\u00e4. Merkint\u00e4 <code>@Testikontit<\/code> on osa laajennuksia, jotka ohjaavat kontteja testiymp\u00e4rist\u00f6ss\u00e4. Ne l\u00f6yt\u00e4v\u00e4t kaikki kent\u00e4t, joissa on <code>@Container<\/code> merkint\u00e4 ja vastaavasti start- ja stop-s\u00e4ili\u00f6t.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Testit Spring Bootilla<\/h3>\n\n\n\n<p>Kuten aiemmin mainitsin, k\u00e4yt\u00e4n projektissa Spring Bootia. T\u00e4ss\u00e4 tapauksessa meid\u00e4n on kirjoitettava hieman enemm\u00e4n koodia. Ensimm\u00e4inen askel on luoda ylim\u00e4\u00e4r\u00e4inen konfiguraatioluokka.<\/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>T\u00e4m\u00e4 luokka korvaa olemassa olevat ominaisuudet arvoilla luokasta <strong>testis\u00e4ili\u00f6<\/strong>. Kolme ensimm\u00e4ist\u00e4 ominaisuutta ovat tavallisia Spring-ominaisuuksia. Seuraavat viisi ovat ylim\u00e4\u00e4r\u00e4isi\u00e4, mukautettuja ominaisuuksia, joita voidaan k\u00e4ytt\u00e4\u00e4 muiden resurssien ja laajennusten, kuten liquibasen, konfigurointiin, esim:<\/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>Nyt on aika m\u00e4\u00e4ritell\u00e4 yksinkertainen integrointitesti.<\/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@Testikontit\nclass DummyRepositoryTest {\n\n @Autowired\n private DummyRepository;\n\n @Test\n void shouldReturnDummy() { 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>T\u00e4ss\u00e4 on joitakin lis\u00e4merkint\u00f6j\u00e4.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>@SpringBootTest(webEnvironment = RANDOM_PORT)<\/code> - merkitsee testin Spring Boot -testiksi ja k\u00e4ynnist\u00e4\u00e4 spring-kontekstin.<\/li>\n\n\n\n<li><code>@AutoConfigureTestDatabase(replace = NONE)<\/code> - n\u00e4m\u00e4 huomautukset sanovat, ett\u00e4 spring test -laajennuksen ei pit\u00e4isi korvata postgres-tietokannan konfiguraatiota H2:lla muistin konfiguraatiossa.<\/li>\n\n\n\n<li><code>@ContextConfiguration(initializers = ContainerInit.class)<\/code> - ylim\u00e4\u00e4r\u00e4inen kev\u00e4tkonteksti<br>konfiguraatio, jossa asetamme ominaisuuksia <strong>Testiastiat<\/strong>.<\/li>\n\n\n\n<li><code>@Testikontit<\/code> - kuten aiemmin mainittiin, t\u00e4m\u00e4 merkint\u00e4 ohjaa s\u00e4ili\u00f6n elinkaarta.<\/li>\n<\/ul>\n\n\n\n<p>T\u00e4ss\u00e4 esimerkiss\u00e4 k\u00e4yt\u00e4n reaktiivisia arkistoja, mutta se toimii samalla tavalla my\u00f6s tavallisilla JDBC- ja JPA-arkistoilla.<\/p>\n\n\n\n<p>Nyt voimme suorittaa t\u00e4m\u00e4n testin. Jos kyseess\u00e4 on ensimm\u00e4inen ajo, moottorin on haettava kuvat docker.hubista. Se voi kest\u00e4\u00e4 hetken. Sen j\u00e4lkeen n\u00e4emme, ett\u00e4 kaksi konttia on ajettu. Toinen on postgres ja toinen on Testcontainers-ohjain. Tuo toinen kontti hallinnoi k\u00e4ynniss\u00e4 olevia kontteja, ja vaikka JVM pys\u00e4htyisi yll\u00e4tt\u00e4en, se sammuttaa kontit ja siivoaa ymp\u00e4rist\u00f6n.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Yhteenveto<\/h2>\n\n\n\n<p><strong>Testiastiat<\/strong> ovat eritt\u00e4in helppok\u00e4ytt\u00f6isi\u00e4 ty\u00f6kaluja, joiden avulla voimme luoda Docker-astioita k\u00e4ytt\u00e4vi\u00e4 integrointitestej\u00e4. T\u00e4m\u00e4 antaa meille enemm\u00e4n joustavuutta ja lis\u00e4\u00e4 kehitysnopeutta. Testikokoonpanon oikeaoppinen asettaminen v\u00e4hent\u00e4\u00e4 uusien kehitt\u00e4jien alustusaikaa. Heid\u00e4n ei tarvitse m\u00e4\u00e4ritt\u00e4\u00e4 kaikkia riippuvuuksia, vaan ajaa vain kirjoitetut testit valituilla konfiguraatiotiedostoilla.<\/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=\"yhteisty\u00f6banneri\"\/><\/a><\/figure>","protected":false},"excerpt":{"rendered":"<p>Etsitk\u00f6 tapaa tehd\u00e4 testej\u00e4 helpommin? Me saimme sinut! Tutustu seuraavaan artikkeliin ja opi, miten se on mahdollista.<\/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\/fi\/blogi\/testisailiot-miten-tehda-testeista-helpompia\/\" \/>\n<meta property=\"og:locale\" content=\"fi_FI\" \/>\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\/fi\/blogi\/testisailiot-miten-tehda-testeista-helpompia\/\" \/>\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\":\"fi\",\"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\":\"fi\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/thecodest.co\\\/blog\\\/test-containers-how-to-make-tests-easier\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"fi\",\"@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\":\"fi\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/thecodest.co\\\/#organization\",\"name\":\"The Codest\",\"url\":\"https:\\\/\\\/thecodest.co\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"fi\",\"@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\":\"fi\",\"@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\\\/fi\\\/author\\\/thecodest\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Testis\u00e4ili\u00f6t - miten testeist\u00e4 tehd\u00e4\u00e4n helpompia? - 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\/fi\/blogi\/testisailiot-miten-tehda-testeista-helpompia\/","og_locale":"fi_FI","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\/fi\/blogi\/testisailiot-miten-tehda-testeista-helpompia\/","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":"fi","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":"Testis\u00e4ili\u00f6t - miten testeist\u00e4 tehd\u00e4\u00e4n helpompia? - 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":"fi","potentialAction":[{"@type":"ReadAction","target":["https:\/\/thecodest.co\/blog\/test-containers-how-to-make-tests-easier\/"]}]},{"@type":"ImageObject","inLanguage":"fi","@id":"https:\/\/thecodest.co\/blog\/test-containers-how-to-make-tests-easier\/#primaryimage","url":"https:\/\/thecodest.co\/app\/uploads\/2024\/05\/test_containers_-_how_to_make_tests_easier_.png","contentUrl":"https:\/\/thecodest.co\/app\/uploads\/2024\/05\/test_containers_-_how_to_make_tests_easier_.png","width":960,"height":540},{"@type":"BreadcrumbList","@id":"https:\/\/thecodest.co\/blog\/test-containers-how-to-make-tests-easier\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/thecodest.co\/"},{"@type":"ListItem","position":2,"name":"Test Containers \u2013 How to Make Tests Easier?"}]},{"@type":"WebSite","@id":"https:\/\/thecodest.co\/#website","url":"https:\/\/thecodest.co\/","name":"Codest","description":"","publisher":{"@id":"https:\/\/thecodest.co\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/thecodest.co\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"fi"},{"@type":"Organization","@id":"https:\/\/thecodest.co\/#organization","name":"Codest","url":"https:\/\/thecodest.co\/","logo":{"@type":"ImageObject","inLanguage":"fi","@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":"fi","@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\/fi\/author\/thecodest\/"}]}},"_links":{"self":[{"href":"https:\/\/thecodest.co\/fi\/wp-json\/wp\/v2\/posts\/3631","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/thecodest.co\/fi\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/thecodest.co\/fi\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/thecodest.co\/fi\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/thecodest.co\/fi\/wp-json\/wp\/v2\/comments?post=3631"}],"version-history":[{"count":9,"href":"https:\/\/thecodest.co\/fi\/wp-json\/wp\/v2\/posts\/3631\/revisions"}],"predecessor-version":[{"id":8016,"href":"https:\/\/thecodest.co\/fi\/wp-json\/wp\/v2\/posts\/3631\/revisions\/8016"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/thecodest.co\/fi\/wp-json\/wp\/v2\/media\/3632"}],"wp:attachment":[{"href":"https:\/\/thecodest.co\/fi\/wp-json\/wp\/v2\/media?parent=3631"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/thecodest.co\/fi\/wp-json\/wp\/v2\/categories?post=3631"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/thecodest.co\/fi\/wp-json\/wp\/v2\/tags?post=3631"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}