{"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":"profunarilat-hvernig-a-ad-gera-profanir-audveldari","status":"publish","type":"post","link":"https:\/\/thecodest.co\/is\/blog\/test-containers-how-to-make-tests-easier\/","title":{"rendered":"Pr\u00f3funar\u00edl\u00e1t \u2013 Hvernig m\u00e1 einfalda pr\u00f3fanir?"},"content":{"rendered":"<p>N\u00fat\u00edma forritunar\u00fer\u00f3un byggir \u00e1 einni einfaldri reglu:<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p><b>Nota\u00f0u samsetningu<\/b><\/p>\n<\/blockquote>\n\n\n\n<p>Vi\u00f0 setjum klasa, fall og \u00fej\u00f3nustur saman \u00ed st\u00e6rri hugb\u00fana\u00f0areiningar. \u00deessi s\u00ed\u00f0asti \u00fe\u00e1ttur er undirsta\u00f0a <a href=\"https:\/\/thecodest.co\/is\/dictionary\/microservices\/\">\u00f6r\u00fej\u00f3nustur<\/a> og <a href=\"https:\/\/thecodest.co\/is\/blog\/the-power-of-hexagonal-architecture\/\">sexhyrnd byggingarlist<\/a>. Vi\u00f0 viljum nota n\u00faverandi lausnir, sam\u00fe\u00e6tta \u00fe\u00e6r vi\u00f0 hugb\u00fana\u00f0inn okkar og fara beint \u00e1 <a href=\"https:\/\/thecodest.co\/is\/dictionary\/what-is-the-size-of-your-potential-reachable-market\/\">marka\u00f0ur<\/a>.<\/p>\n\n\n\n<p>Viltu sj\u00e1 um notendaskr\u00e1ningu og vista notendur? <a href=\"https:\/\/thecodest.co\/is\/blog\/app-data-collection-security-risks-value-and-types-explored\/\">g\u00f6gn<\/a>? \u00de\u00fa getur vali\u00f0 einn af OAuth-\u00fej\u00f3nustunum. Kannski b\u00fd\u00f0ur forriti\u00f0 \u00feitt upp \u00e1 \u00e1skrift e\u00f0a grei\u00f0slu? \u00dea\u00f0 eru margar \u00fej\u00f3nustur sem geta hj\u00e1lpa\u00f0 \u00fe\u00e9r a\u00f0 takast \u00e1 vi\u00f0 \u00feetta. Vantar \u00feig greiningu \u00e1 vefs\u00ed\u00f0unni \u00feinni en \u00fe\u00fa skilur ekki <a href=\"https:\/\/thecodest.co\/is\/blog\/cyber-security-dilemmas-data-leaks\/\">Pers\u00f3nuverndarregluger\u00f0 ESB<\/a>? Endilega taktu eina af tilb\u00fanum lausnum.<\/p>\n\n\n\n<p>Eitthva\u00f0 sem gerir \u00fer\u00f3un svo au\u00f0velda \u00far vi\u00f0skiptalegu sj\u00f3narhorni getur gefi\u00f0 \u00fe\u00e9r h\u00f6fu\u00f0verk \u2013 augnabliki\u00f0 \u00feegar \u00fe\u00fa \u00fearft a\u00f0 skrifa einfalt pr\u00f3f.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Fr\u00e1b\u00e6ru d\u00fdrin: bi\u00f0ra\u00f0ir, gagnagrunnar og hvernig \u00e1 a\u00f0 pr\u00f3fa \u00fe\u00e6r<\/h2>\n\n\n\n<p>Einingapr\u00f3fanir eru nokku\u00f0 einfaldar. Ef \u00fe\u00fa fylgir bara reglum, \u00fe\u00e1 ver\u00f0ur pr\u00f3funarumhverfi \u00feitt og <a href=\"https:\/\/thecodest.co\/is\/dictionary\/what-is-code-refactoring\/\">k\u00f3\u00f0i<\/a> eru heilbrig\u00f0ir. Hva\u00f0a reglur eru \u00fea\u00f0?<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><b>Au\u00f0velt a\u00f0 skrifa<\/b> \u2013 einingapr\u00f3f \u00e6tti a\u00f0 vera au\u00f0velt a\u00f0 skrifa \u00fev\u00ed \u00fe\u00fa skrifar m\u00f6rg \u00feeirra. Minni fyrirh\u00f6fn \u00fe\u00fd\u00f0ir a\u00f0 fleiri pr\u00f3f eru skrifu\u00f0.<\/li>\n\n\n\n<li><b>L\u00e6silegt<\/b> \u2013 Pr\u00f3funark\u00f3\u00f0inn \u00e6tti a\u00f0 vera au\u00f0lesinn. Pr\u00f3fi\u00f0 er saga. \u00dea\u00f0 l\u00fdsir heg\u00f0un hugb\u00fana\u00f0arins og m\u00e1 nota sem skammlei\u00f0ingu \u00ed skj\u00f6lun. G\u00f3\u00f0 einingapr\u00f3f hj\u00e1lpar \u00fe\u00e9r a\u00f0 laga villur \u00e1n \u00feess a\u00f0 \u00feurfa a\u00f0 rekja k\u00f3\u00f0ann.<\/li>\n\n\n\n<li><b>\u00c1rei\u00f0anlegur<\/b> \u2013 pr\u00f3fi\u00f0 \u00e6tti a\u00f0 mistakast a\u00f0eins ef villa er \u00ed kerfinu sem veri\u00f0 er a\u00f0 pr\u00f3fa. Auglj\u00f3st? Ekki alltaf. Stundum standast pr\u00f3f ef \u00fe\u00fa keyrir \u00feau eitt og eitt en mistakast \u00feegar \u00feau eru keyr\u00f0 sem heild. \u00deau standast \u00e1 \u00feinni v\u00e9l en mistakast \u00e1 CI (<a href=\"https:\/\/blog.codinghorror.com\/the-works-on-my-machine-certification-program\/\">Virkar \u00e1 t\u00f6lvunni minni<\/a>). G\u00f3\u00f0 einingapr\u00f3f hefur a\u00f0eins eina ors\u00f6k misheppnunar.<\/li>\n\n\n\n<li><b>hratt<\/b> \u2013 Pr\u00f3fanir \u00e6ttu a\u00f0 vera hra\u00f0ar. Undirb\u00faningur til a\u00f0 keyra, r\u00e6sa og framkv\u00e6ma pr\u00f3fanir sj\u00e1lfar \u00e6tti a\u00f0 vera mj\u00f6g sn\u00f6ggur. Annars munt \u00fe\u00fa skrifa \u00fe\u00e6r en ekki keyra. H\u00e6gar pr\u00f3fanir \u00fe\u00fd\u00f0a tapa\u00f0a einbeitingu. \u00de\u00fa b\u00ed\u00f0ur og horfir \u00e1 framvindul\u00ednuna.<\/li>\n\n\n\n<li><b>Sj\u00e1lfst\u00e6\u00f0ur<\/b> \u2013 a\u00f0 lokum \u00e6tti pr\u00f3fi\u00f0 a\u00f0 vera sj\u00e1lfst\u00e6tt. \u00deessi regla lei\u00f0ir af hinum fyrri. Einungis sannarlega sj\u00e1lfst\u00e6\u00f0 pr\u00f3f geta or\u00f0i\u00f0 eining. \u00deau trufla ekki hvert anna\u00f0, m\u00e1 keyra \u00feau \u00ed hva\u00f0a r\u00f6\u00f0 sem er og hugsanleg mist\u00f6k r\u00e1\u00f0ast ekki af ni\u00f0urst\u00f6\u00f0um annarra pr\u00f3fa. Sj\u00e1lfst\u00e6tt \u00fe\u00fd\u00f0ir einnig a\u00f0 ekki s\u00e9 h\u00e1\u00f0 neinum utana\u00f0komandi au\u00f0lindum, svo sem gagnagrunnum, skilabo\u00f0akerfum e\u00f0a skr\u00e1arkerfi. Ef \u00fe\u00fa \u00fearft a\u00f0 eiga samskipti vi\u00f0 utana\u00f0komandi hluti getur\u00f0u nota\u00f0 mock-hluti, stubba e\u00f0a dummy-hluti.<\/li>\n<\/ul>\n\n\n\n<p>Allt ver\u00f0ur fl\u00f3ki\u00f0 \u00feegar vi\u00f0 viljum skrifa einhverjar sam\u00fe\u00e6ttingapr\u00f3fanir. \u00dea\u00f0 er ekki sl\u00e6mt ef vi\u00f0 viljum pr\u00f3fa nokkur \u00fej\u00f3nustu saman. En \u00feegar vi\u00f0 \u00feurfum a\u00f0 pr\u00f3fa \u00fej\u00f3nustu sem nota utana\u00f0komandi au\u00f0lindir eins og gagnagrunna e\u00f0a skilabo\u00f0\u00fej\u00f3nustu, \u00fe\u00e1 erum vi\u00f0 a\u00f0 leita \u00ed vandr\u00e6\u00f0i.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Til a\u00f0 keyra pr\u00f3fi\u00f0 \u00fearftu a\u00f0 setja upp\u2026<\/h3>\n\n\n\n<p>Fyrir m\u00f6rgum \u00e1rum, \u00feegar vi\u00f0 vildum b\u00faa til sam\u00fe\u00e6ttingartest og nota t.d. gagnagrunna, h\u00f6f\u00f0um vi\u00f0 tvo valkosti:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Vi\u00f0 getum sett upp gagnagrunn sta\u00f0bundi\u00f0. Stillum upp skema og tengjumst \u00fev\u00ed \u00far pr\u00f3finu okkar;<\/li>\n\n\n\n<li>Vi\u00f0 getum tengst n\u00faverandi eintaki \u201eeinhvers sta\u00f0ar \u00ed geimnum\u201d.<\/li>\n<\/ol>\n\n\n\n<p>B\u00e6\u00f0i voru kostir og gallar. En b\u00e6\u00f0i b\u00e6ta vi\u00f0 auknum fl\u00e6kjustigi. Stundum var um t\u00e6knilega fl\u00e6kju a\u00f0 r\u00e6\u00f0a sem stafa\u00f0i af eiginleikum \u00e1kve\u00f0inna verkf\u00e6ra, t.d. uppsetningu og stj\u00f3rnun Oracle gagnagrunns \u00e1 \u00fe\u00ednum eigin t\u00f6lvu (localhost). Stundum var um \u00f3\u00fe\u00e6gindi \u00ed ferlinu a\u00f0 r\u00e6\u00f0a, t.d. \u00fe\u00fa \u00fearft a\u00f0 sam\u00feykkja pr\u00f3fi\u00f0. <a href=\"https:\/\/thecodest.co\/is\/dictionary\/how-to-lead-software-development-team\/\">li\u00f0<\/a> um notkun JMS\u2026 \u00ed hvert skipti sem \u00fe\u00fa vilt keyra pr\u00f3fanir.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">\u00cdl\u00e1tin til bjargar<\/h3>\n\n\n\n<p>\u00c1 s\u00ed\u00f0ustu t\u00edu \u00e1rum hefur hugmyndin um \u00edl\u00e1tav\u00e6\u00f0ingu \u00f6\u00f0last vi\u00f0urkenningu \u00ed greininni. \u00dev\u00ed er e\u00f0lileg \u00e1kv\u00f6r\u00f0un a\u00f0 velja \u00edl\u00e1t sem lausn \u00e1 sam\u00fe\u00e6ttingartestvandam\u00e1linu okkar. \u00deetta er einf\u00f6ld, hrein lausn. \u00de\u00fa keyrir bara ferli\u00f0 \u00feitt og allt virkar! Getur\u00f0u ekki tr\u00faa\u00f0 \u00fev\u00ed? Sko\u00f0a\u00f0u \u00feessa einf\u00f6ldu uppsetningu \u00e1 Maven-sm\u00ed\u00f0i:<\/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\/is\/dictionary\/why-do-projects-fail\/\">verkefni<\/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>Og hinn <code>docker-compose.yml<\/code> Skr\u00e1in l\u00edtur l\u00edka ansi vel \u00fat!<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"yaml\" class=\"language-yaml\">version: \"3.5\"\n\nservices:\n\n postgres:\n   container_name: reactivedb\n   image: postgres:13.2\n   restart: always\n   environment:\n - POSTGRES_USER=admin\n - POSTGRES_PASSWORD=password\n - POSTGRES_DB=cities\n   ports:\n - \"5432:5432\"\n   volumes:\n - postgres_data:\/data\/db\n\n pgadmin:\n   container_name: pgadmin4\n   image: dpage\/pgadmin4\n   restart: always\n   environment:\n PGADMIN_DEFAULT_EMAIL: admin@admin.com\n     PGADMIN_DEFAULT_PASSWORD: password\n   ports:\n - \"15050:80\"\n   volumes:\n - pgadmin_data:\/data\/pgadmin\n\nvolumes:\n postgres_data:\n pgadmin_data:<\/code><\/pre>\n\n\n\n<p>En getur\u00f0u greint vandam\u00e1li\u00f0 h\u00e9r?<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Eignarhaldsskip sem lokar fyrir allt<\/h3>\n\n\n\n<p>D\u00e6mi\u00f0 h\u00e9r a\u00f0 ofan er mj\u00f6g einfalt. A\u00f0eins ein PostgreSQL-gagnagrunnur, pgAdmin og \u00fea\u00f0 er allt. \u00deegar \u00fe\u00fa keyrir<\/p>\n\n\n\n<p><code>bash<br>\n$ mvn clean verify<br>\n<\/code><br>\u00de\u00e1 r\u00e6sir Maven-vi\u00f0b\u00f3tin g\u00e1mana og sl\u00f6kkvir \u00e1 \u00feeim eftir pr\u00f3fin. Vandam\u00e1lin hefjast \u00feegar verkefni\u00f0 vex og compose-skr\u00e1in okkar vex l\u00edka. \u00cd hvert sinn \u00fearftu a\u00f0 r\u00e6sa alla g\u00e1ma og \u00feeir ver\u00f0a virkir allan byggingarferilinn. \u00de\u00fa getur b\u00e6tt a\u00f0eins \u00far \u00e1standinu me\u00f0 \u00fev\u00ed a\u00f0 breyta stillingum \u00e1 keyrslu vi\u00f0b\u00f3tarinnar, en \u00fea\u00f0 dugar ekki. \u00cd versta falli t\u00e6ma g\u00e1marnir kerfisstau\u00f0u au\u00f0lindir \u00e1\u00f0ur en pr\u00f3fin hefjast!<\/p>\n\n\n\n<p>Og \u00feetta er ekki eina vandam\u00e1li\u00f0. \u00de\u00fa getur ekki keyrt eina einustu sam\u00fe\u00e6ttingapr\u00f3fun \u00far IDE-inu \u00fe\u00ednu. \u00c1\u00f0ur en \u00fe\u00fa gerir \u00fea\u00f0 \u00fearftu a\u00f0 r\u00e6sa g\u00e1mana handvirkt. Enn fremur mun n\u00e6sta Maven-keyrsla r\u00edfa ni\u00f0ur \u00fe\u00e1 g\u00e1ma (sj\u00e1\u00f0u \u00e1 <code>ni\u00f0ur<\/code> framkv\u00e6md).<\/p>\n\n\n\n<p>\u00deannig a\u00f0 \u00feessi lausn er eins og st\u00f3rt flutningaskip. Ef allt gengur vel, \u00fe\u00e1 er allt \u00ed lagi. \u00d6ll \u00f3v\u00e6nt e\u00f0a \u00f3venjuleg heg\u00f0un lei\u00f0ir til <a href=\"https:\/\/thecodest.co\/is\/blog\/why-us-companies-are-opting-for-polish-developers\/\">okkur<\/a> til einhvers konar h\u00f6rmungar.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Pr\u00f3funarkerfi \u2013 keyra kerfi \u00far pr\u00f3funum<\/h2>\n\n\n\n<p>En hva\u00f0 ef vi\u00f0 g\u00e6tum keyrt g\u00e1mana okkar \u00far pr\u00f3funum? \u00deessi hugmynd l\u00edtur vel \u00fat og er \u00feegar \u00ed framkv\u00e6md. <a href=\"https:\/\/www.testcontainers.org\/\" rel=\"nofollow\">Pr\u00f3funar\u00edl\u00e1t<\/a>, \u00fev\u00ed vi\u00f0 erum a\u00f0 tala um \u00feetta verkefni, h\u00e9r er lausn \u00e1 vandam\u00e1lum okkar. Ekki fullkomi\u00f0, en enginn er fullkominn.<\/p>\n\n\n\n<p>\u00deetta er <strong><a href=\"https:\/\/thecodest.co\/is\/blog\/top-programming-languages-to-build-e-commerce\/\">Java<\/a><\/strong> b\u00f3kasafn sem sty\u00f0ur JUnit- og Spock-pr\u00f3fanir og b\u00fd\u00f0ur upp \u00e1 l\u00e9ttar og au\u00f0veldlega lei\u00f0ir til a\u00f0 keyra \u00fe\u00e6r <a href=\"https:\/\/thecodest.co\/is\/dictionary\/docker-developer\/\">Docker<\/a> \u00edl\u00e1t. Sko\u00f0um \u00fea\u00f0 og skrifum sm\u00e1 k\u00f3\u00f0a!<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Forsendur og stillingar<\/h3>\n\n\n\n<p>\u00c1\u00f0ur en vi\u00f0 byrjum, \u00feurfum vi\u00f0 a\u00f0 athuga stillingarnar okkar. <strong>Pr\u00f3funar\u00edl\u00e1t<\/strong> \u00fe\u00f6rf:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Docker \u00ed \u00fatg\u00e1fu v17.09,<\/li>\n\n\n\n<li>Java l\u00e1gmarks\u00fatg\u00e1fa 1.8,<\/li>\n\n\n\n<li>A\u00f0gangur a\u00f0 neti, s\u00e9rstaklega a\u00f0 docker.hub.<\/li>\n<\/ul>\n\n\n\n<p>Meira um kr\u00f6fur fyrir tilteknar st\u00fdrikerfi og CI m\u00e1 finna<br>\u00ed <a href=\"https:\/\/www.testcontainers.org\/supported_docker_environment\/\" rel=\"nofollow\">Skjalager\u00f0<\/a>.<\/p>\n\n\n\n<p>N\u00fa er kominn t\u00edmi til a\u00f0 b\u00e6ta nokkrum l\u00ednum vi\u00f0 <code>pom.xml<\/code>.<\/p>\n\n\n\n<aside>\u00c9g nota Spring Boot \u00ed verkefninu til a\u00f0 draga \u00far endurteknum k\u00f3\u00f0ainnsl\u00e6tti. <strong>Pr\u00f3funar\u00edl\u00e1t<\/strong> eru sj\u00e1lfst\u00e6\u00f0ir fr\u00e1 Spring Framework og \u00fe\u00fa getur nota\u00f0 \u00fe\u00e1 \u00e1n \u00feess.<\/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>\u00c9g nota <strong>Pr\u00f3funar\u00edl\u00e1t<\/strong> \u00fatg\u00e1fa <code>1.17.3<\/code>, en endilega nota\u00f0u n\u00fdjasta.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Pr\u00f3fanir me\u00f0 Postgres-\u00edl\u00e1ti<\/h3>\n\n\n\n<p>Fyrsta skrefi\u00f0 er a\u00f0 undirb\u00faa eintak af \u00edl\u00e1ti okkar. \u00de\u00fa getur gert \u00fea\u00f0 beint \u00ed pr\u00f3finu, en sj\u00e1lfst\u00e6tt flokkur l\u00edtur betur \u00fat.<\/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   \/\/ gera ekkert. \u00deetta er deilt eintak. L\u00e1ti\u00f0 JVM sj\u00e1 um \u00feessa a\u00f0ger\u00f0.\n }\n}\n<\/code><\/pre>\n\n\n\n<p>\u00cd upphafi pr\u00f3fanna munum vi\u00f0 b\u00faa til eintak af <code>Postgres13TC<\/code>. \u00deessi bekkur getur me\u00f0h\u00f6ndla\u00f0 uppl\u00fdsingar um \u00edl\u00e1ti\u00f0 okkar. Mikilv\u00e6gast h\u00e9r eru tengistrengir gagnagrunnsins og au\u00f0kenni. N\u00fa er kominn t\u00edmi til a\u00f0 skrifa mj\u00f6g einfalt pr\u00f3f.<\/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 (SQLException sqlException) {\n assertThat((Exception) sqlException).doesNotThrowAnyException();\n   }\n }\n}<\/code><\/pre>\n\n\n\n<p>\u00c9g nota JUnit 5 h\u00e9r. Athugasemd <code>@Testcontainers<\/code> er hluti af vi\u00f0b\u00f3tunum sem st\u00fdra \u00edl\u00e1tum \u00ed pr\u00f3funarumhverfinu. \u00de\u00e6r finna \u00f6ll reitina me\u00f0 <code>@\u00cdl\u00e1t<\/code> athugasemd og byrjunar- og st\u00f6\u00f0vunarkassa \u00ed s\u00f6mu r\u00f6\u00f0.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Pr\u00f3fanir me\u00f0 Spring Boot<\/h3>\n\n\n\n<p>Eins og \u00e9g nefndi \u00e1\u00f0ur nota \u00e9g Spring Boot \u00ed verkefninu. \u00cd \u00feessu tilfelli \u00feurfum vi\u00f0 a\u00f0 skrifa a\u00f0eins meira k\u00f3\u00f0a. Fyrsta skrefi\u00f0 er a\u00f0 b\u00faa til vi\u00f0b\u00f3tar stillingaklass.<\/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>\u00deessi bekkur skiptir \u00fat n\u00faverandi eiginleikum me\u00f0 gildum \u00far the <strong>pr\u00f3funar\u00edl\u00e1t<\/strong>. Fyrstu \u00fer\u00edr eiginleikarnir eru sta\u00f0la\u00f0ir Spring-eiginleikar. N\u00e6stu fimm eru vi\u00f0b\u00f3tareiginleikar sem h\u00e6gt er a\u00f0 nota til a\u00f0 stilla a\u00f0ra au\u00f0linda og vi\u00f0b\u00e6tur, til d\u00e6mis 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>N\u00fa er kominn t\u00edmi til a\u00f0 skilgreina einfalt sam\u00fe\u00e6ttingapr\u00f3f.<\/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>Vi\u00f0 h\u00f6fum nokkrar vi\u00f0b\u00f3tarathugasemdir h\u00e9r.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>@SpringBootTest(webEnvironment = RANDOM_PORT)<\/code> \u2013 merkir pr\u00f3fi\u00f0 sem Spring Boot-pr\u00f3f og r\u00e6sir Spring-samhengi.<\/li>\n\n\n\n<li><code>@AutoConfigureTestDatabase(replace = NONE)<\/code> \u2013 \u00feessar athugasemdir segja a\u00f0 spring test vi\u00f0b\u00f3tin \u00e6tti ekki a\u00f0 skipta \u00fat postgres gagnagrunnsstillingu fyrir H2 \u00ed minnisstillingu.<\/li>\n\n\n\n<li><code>@ContextConfiguration(initializers = ContainerInit.class)<\/code> \u2013 auka vor samhengi<br>Uppsetning \u00fear sem vi\u00f0 stillum eiginleika fr\u00e1 <strong>Pr\u00f3funar\u00edl\u00e1t<\/strong>.<\/li>\n\n\n\n<li><code>@Testcontainers<\/code> \u2013 eins og \u00e1\u00f0ur hefur veri\u00f0 nefnt, st\u00fdrir \u00feessi athugasemd l\u00edfsferli \u00edl\u00e1tsins.<\/li>\n<\/ul>\n\n\n\n<p>\u00cd \u00feessu d\u00e6mi nota \u00e9g reactive-geymslur, en \u00fea\u00f0 virkar \u00e1 sama h\u00e1tt me\u00f0 venjulegum JDBC- og JPA-geymslum.<\/p>\n\n\n\n<p>N\u00fa getum vi\u00f0 keyrt \u00feessa pr\u00f3fun. Ef \u00feetta er fyrsta keyrslan \u00fearf v\u00e9lin a\u00f0 s\u00e6kja myndir af docker.hub. \u00dea\u00f0 g\u00e6ti teki\u00f0 sm\u00e1 stund. Eftir \u00fea\u00f0 munum vi\u00f0 sj\u00e1 a\u00f0 tveir g\u00e1mar hafa keyrt. Annar er postgres og hinn er Testcontainers-st\u00fdringarv\u00e9lin. S\u00fa seinni g\u00e1mur s\u00e9r um a\u00f0 keyra g\u00e1mana og jafnvel \u00fe\u00f3tt JVM st\u00f6\u00f0vist \u00f3v\u00e6nt, sl\u00f6kkur hann \u00e1 g\u00e1munum og hreinsar umhverfi\u00f0.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Skulum draga saman<\/h2>\n\n\n\n<p><strong>Pr\u00f3funar\u00edl\u00e1t<\/strong> eru mj\u00f6g notendav\u00e6n verkf\u00e6ri sem hj\u00e1lpa okkur a\u00f0 b\u00faa til sam\u00fe\u00e6ttingapr\u00f3f sem nota Docker-\u00edl\u00e1t. \u00dea\u00f0 gefur okkur meiri sveigjanleika og eykur \u00fer\u00f3unarhra\u00f0a. R\u00e9tt uppsetning pr\u00f3ff\u00e6rib\u00fana\u00f0ar dregur \u00far \u00feeim t\u00edma sem \u00fearf til a\u00f0 taka n\u00fdja \u00fer\u00f3unara\u00f0ila inn \u00ed teymi\u00f0. \u00deeir \u00feurfa ekki a\u00f0 setja upp \u00f6ll h\u00e1\u00f0akerfi, heldur eing\u00f6ngu keyra skrifu\u00f0u pr\u00f3fin me\u00f0 valin stillingarskr\u00e1r.<\/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=\"samstarfsf\u00e1ninn\"\/><\/a><\/figure>","protected":false},"excerpt":{"rendered":"<p>Ertu a\u00f0 leita a\u00f0 lei\u00f0 til a\u00f0 gera pr\u00f3fanir au\u00f0veldari? Vi\u00f0 erum h\u00e9r fyrir \u00feig! Sko\u00f0a\u00f0u eftirfarandi grein og l\u00e6r\u00f0u hvernig \u00fe\u00fa getur gert \u00fea\u00f0 m\u00f6gulegt.<\/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\/is\/blogg\/profunarilat-hvernig-a-ad-gera-profanir-audveldari\/\" \/>\n<meta property=\"og:locale\" content=\"is_IS\" \/>\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\/is\/blogg\/profunarilat-hvernig-a-ad-gera-profanir-audveldari\/\" \/>\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\":\"is\",\"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\":\"is\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/thecodest.co\\\/blog\\\/test-containers-how-to-make-tests-easier\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"is\",\"@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\":\"is\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/thecodest.co\\\/#organization\",\"name\":\"The Codest\",\"url\":\"https:\\\/\\\/thecodest.co\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"is\",\"@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\":\"is\",\"@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\\\/is\\\/author\\\/thecodest\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Pr\u00f3funar\u00edl\u00e1t \u2013 Hvernig gerum vi\u00f0 pr\u00f3fanir au\u00f0veldari? - 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\/is\/blogg\/profunarilat-hvernig-a-ad-gera-profanir-audveldari\/","og_locale":"is_IS","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\/is\/blogg\/profunarilat-hvernig-a-ad-gera-profanir-audveldari\/","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":"is","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":"Pr\u00f3funar\u00edl\u00e1t \u2013 Hvernig gerum vi\u00f0 pr\u00f3fanir au\u00f0veldari? - 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":"is","potentialAction":[{"@type":"ReadAction","target":["https:\/\/thecodest.co\/blog\/test-containers-how-to-make-tests-easier\/"]}]},{"@type":"ImageObject","inLanguage":"is","@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":"is"},{"@type":"Organization","@id":"https:\/\/thecodest.co\/#organization","name":"The Codest","url":"https:\/\/thecodest.co\/","logo":{"@type":"ImageObject","inLanguage":"is","@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":"is","@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\/is\/author\/thecodest\/"}]}},"_links":{"self":[{"href":"https:\/\/thecodest.co\/is\/wp-json\/wp\/v2\/posts\/3631","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/thecodest.co\/is\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/thecodest.co\/is\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/thecodest.co\/is\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/thecodest.co\/is\/wp-json\/wp\/v2\/comments?post=3631"}],"version-history":[{"count":9,"href":"https:\/\/thecodest.co\/is\/wp-json\/wp\/v2\/posts\/3631\/revisions"}],"predecessor-version":[{"id":8016,"href":"https:\/\/thecodest.co\/is\/wp-json\/wp\/v2\/posts\/3631\/revisions\/8016"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/thecodest.co\/is\/wp-json\/wp\/v2\/media\/3632"}],"wp:attachment":[{"href":"https:\/\/thecodest.co\/is\/wp-json\/wp\/v2\/media?parent=3631"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/thecodest.co\/is\/wp-json\/wp\/v2\/categories?post=3631"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/thecodest.co\/is\/wp-json\/wp\/v2\/tags?post=3631"}],"curies":[{"name":"vp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}