{"id":21725,"date":"2026-04-27T13:11:28","date_gmt":"2026-04-27T11:11:28","guid":{"rendered":"https:\/\/mjolner.dk\/?page_id=21725"},"modified":"2026-05-15T13:00:27","modified_gmt":"2026-05-15T11:00:27","slug":"dvergr","status":"publish","type":"page","link":"https:\/\/mjolner.dk\/en\/dvergr\/","title":{"rendered":"Dvergr"},"content":{"rendered":"<div style=\"margin-top: -10em; margin-left: -10%; background-color: #084393; text-align: center; width: 120%; border-radius: 12px\"><img loading=\"lazy\" decoding=\"async\" class=\"size-medium wp-image-22017 aligncenter\" src=\"https:\/\/mjolner.dk\/wp-content\/uploads\/2026\/05\/logo-300x300.png\" alt=\"\" width=\"300\" height=\"300\" srcset=\"https:\/\/mjolner.dk\/wp-content\/uploads\/2026\/05\/logo-300x300.png 300w, https:\/\/mjolner.dk\/wp-content\/uploads\/2026\/05\/logo-150x150.png 150w, https:\/\/mjolner.dk\/wp-content\/uploads\/2026\/05\/logo-768x768.png 768w, https:\/\/mjolner.dk\/wp-content\/uploads\/2026\/05\/logo.png 938w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/div>\n<p><\/p>\n<div><strong><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-21732 alignright\" src=\"https:\/\/mjolner.dk\/wp-content\/uploads\/2026\/04\/image-8-300x209.png\" alt=\"\" width=\"486\" height=\"338\" srcset=\"https:\/\/mjolner.dk\/wp-content\/uploads\/2026\/04\/image-8-300x209.png 300w, https:\/\/mjolner.dk\/wp-content\/uploads\/2026\/04\/image-8-1024x713.png 1024w, https:\/\/mjolner.dk\/wp-content\/uploads\/2026\/04\/image-8-768x534.png 768w, https:\/\/mjolner.dk\/wp-content\/uploads\/2026\/04\/image-8.png 1493w\" sizes=\"auto, (max-width: 486px) 100vw, 486px\" \/>Automated UI Testing Tool for Embedded Touch Displays<\/strong><\/p>\n<p style=\"text-align: left;\">Dvergr is an automated UI testing tool for embedded systems, designed to eliminate the limitations of manual testing on graphical user interfaces (GUIs). It enables deep, deterministic, and repeatable UI validation by directly interacting with the target device\u2019s memory and graphics subsystem\u2014without modifying the firmware or hardware.<\/p>\n<p>Developed by <strong>Mj\u00f8lner Informatics<\/strong>, Dvergr is purpose-built for systems using embedded graphics frameworks such as TouchGFX and is especially suited for regulated or high\u2011reliability products.<\/p>\n<h2>What Problem Does Dvergr Solve?<\/h2>\n<p>UI testing in embedded devices is traditionally manual, slow, and fragile. Dvergr addresses the following key pain points:<\/p>\n<p><strong>1. Manual Testing is Slow<br \/>\n<\/strong>Each test cycle requires extensive hands-on interaction, significantly delaying releases and slowing innovation.<\/p>\n<p><strong>2. Repetitive Tests Are Error-Prone<br \/>\n<\/strong>Human interaction in repetitive test steps introduces inconsistencies and mistakes that compromise test reliability.<\/p>\n<p><strong>3. Test Cases Are Hard to Maintain<br \/>\n<\/strong>Frequent UI changes cause manual test scripts and documentation to become outdated, increasing long-term maintenance cost.<\/p>\n<p><div style=\"width: 1920px;\" class=\"wp-video\"><video class=\"wp-video-shortcode\" id=\"video-21725-1\" width=\"1920\" height=\"1080\" preload=\"metadata\" controls=\"controls\"><source type=\"video\/mp4\" src=\"https:\/\/mjolner.dk\/wp-content\/uploads\/2026\/05\/dvergr-demo-video.mp4?_=1\" \/><a href=\"https:\/\/mjolner.dk\/wp-content\/uploads\/2026\/05\/dvergr-demo-video.mp4\">https:\/\/mjolner.dk\/wp-content\/uploads\/2026\/05\/dvergr-demo-video.mp4<\/a><\/video><\/div><br \/>\nSee the pdf report from the video: <a href=\"https:\/\/mjolner.dk\/wp-content\/uploads\/2026\/05\/PythonTestReport.pdf\" target=\"\">here<\/a><\/p>\n<h2>What Makes Dvergr Different?<\/h2>\n<p>Unlike camera-based or input-emulation solutions, Dvergr works <em>inside<\/em> the system\u2014observing and interacting with the UI exactly as the device itself sees it.<\/p>\n<h3>Key Capabilities<\/h3>\n<ul>\n<li><strong>Direct memory access on the target device<\/strong>\n<ul>\n<li>Reads internal application state without modifying firmware<\/li>\n<\/ul>\n<\/li>\n<li><strong>Can work through SWD-based communication<\/strong>\n<ul>\n<li>Uses existing SWD pins (already required for flashing)<\/li>\n<li>No hardware changes or additional test pins required<\/li>\n<\/ul>\n<\/li>\n<li><strong>Live framebuffer readout<\/strong>\n<ul>\n<li>Extracts display contents in real time<\/li>\n<li>Enables pixel-perfect comparison on a host PC<\/li>\n<\/ul>\n<\/li>\n<li><strong>Event injection<\/strong>\n<ul>\n<li>Injects touch and button events into existing event queues<\/li>\n<li>Interacts naturally with the application logic<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<h2>System Architecture<\/h2>\n<h3><strong><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-21734 alignright\" src=\"https:\/\/mjolner.dk\/wp-content\/uploads\/2026\/04\/image-9-300x196.png\" alt=\"\" width=\"338\" height=\"221\" srcset=\"https:\/\/mjolner.dk\/wp-content\/uploads\/2026\/04\/image-9-300x196.png 300w, https:\/\/mjolner.dk\/wp-content\/uploads\/2026\/04\/image-9-1024x670.png 1024w, https:\/\/mjolner.dk\/wp-content\/uploads\/2026\/04\/image-9-768x502.png 768w, https:\/\/mjolner.dk\/wp-content\/uploads\/2026\/04\/image-9.png 1200w\" sizes=\"auto, (max-width: 338px) 100vw, 338px\" \/><\/strong><br \/>\nOn the Target Device<\/h3>\n<ul>\n<li>No firmware modifications required<\/li>\n<li>No additional test software running on the device<\/li>\n<li>Normal application behavior preserved &#8211; we test what we ship<\/li>\n<\/ul>\n<h3>On the Host PC (Dvergr Tool)<\/h3>\n<p>The PC-based tool has semantic knowledge of the application, including:<\/p>\n<ul>\n<li>Screen layouts and UI structure<\/li>\n<li>Which TouchGFX screen is currently shown on the display<\/li>\n<li>What content is expected vs. what is rendered<\/li>\n<li>How to safely interact with current UI elements<\/li>\n<li>Integrates seamlessly into existing testing infrastructure<\/li>\n<\/ul>\n<p>This allows Dvergr to operate at a <em>logical UI level<\/em>, not just raw pixels.<\/p>\n<h2>What Can Dvergr Test?<\/h2>\n<p>Beyond standard UI automation, Dvergr enables tests that are otherwise impractical or impossible to test manually:<\/p>\n<ul>\n<li>Detect subtle text or element clipping<\/li>\n<li>Verify screen content across translations<\/li>\n<li>Detect if the placeholder character is displayed due to a missing glyph<\/li>\n<li>Verify internal application state against what is shown in the UI<\/li>\n<li>Validate non-UI system state correlated with UI changes<\/li>\n<li>Perform deterministic regression tests across UI versions<\/li>\n<li>Probe application behavior unreachable through user interaction alone<\/li>\n<\/ul>\n<h2>Example Use Cases<\/h2>\n<ul>\n<li>Automated regression testing of embedded GUIs<\/li>\n<li>Quality assurance for medical or regulated devices<\/li>\n<li>Long-term UI stability testing during continuous delivery<\/li>\n<li>Verifying rendering correctness without camera systems<\/li>\n<li>Reducing validation time before product releases<\/li>\n<\/ul>\n<h2>Collaboration Model<\/h2>\n<p>Dvergr is delivered as a <strong>collaborative solution<\/strong>, ensuring it fits seamlessly into real embedded environments.<\/p>\n<ul>\n<li><strong>Pilot project<\/strong> to validate value on your hardware and UI<\/li>\n<li><strong>Integration support<\/strong> for your development and test workflows<\/li>\n<li><strong>Ongoing collaboration<\/strong> to evolve features based on real needs<\/li>\n<\/ul>\n<p>This approach ensures Dvergr works effectively from day one &#8211; and continues to scale with your product.<\/p>\n<\/div>\n<div class=\"uk-card-default\" style=\"padding: 1em; min-height: 8em; border-radius: 12px\"><img decoding=\"async\" style=\"float: left; top: 1em; height: 8em; border-radius: 12px\" src=\"https:\/\/mjolner.dk\/wp-content\/uploads\/2026\/04\/SRI-Business-Development-Manager-e1750923635658-474e6b47-200x300.webp\" \/><br \/>\n<strong style=\"display: inline-block; padding-left: 1em\">Want to know more?<br \/>\nReach out to Sebastian Roed Iversen <a href=\"mailto:sri@mjolner.dk\">&lt;sri@mjolner.dk&gt;<\/a><br \/>\n<\/strong><\/div>\n","protected":false},"excerpt":{"rendered":"<p>Automated UI Testing Tool for Embedded Touch Displays Dvergr is an automated UI testing tool for embedded systems, designed to eliminate the limitations of manual testing on graphical user interfaces (GUIs). It enables deep, deterministic, and repeatable UI validation by directly interacting with the target device\u2019s memory and graphics subsystem\u2014without modifying the firmware or hardware. [&hellip;]<\/p>\n","protected":false},"author":33,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"_acf_changed":false,"footnotes":""},"class_list":["post-21725","page","type-page","status-publish","hentry"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v24.6 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Dvergr - Mj\u00f8lner<\/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:\/\/mjolner.dk\/en\/dvergr\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Dvergr - Mj\u00f8lner\" \/>\n<meta property=\"og:description\" content=\"Automated UI Testing Tool for Embedded Touch Displays Dvergr is an automated UI testing tool for embedded systems, designed to eliminate the limitations of manual testing on graphical user interfaces (GUIs). It enables deep, deterministic, and repeatable UI validation by directly interacting with the target device\u2019s memory and graphics subsystem\u2014without modifying the firmware or hardware. [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/mjolner.dk\/en\/dvergr\/\" \/>\n<meta property=\"og:site_name\" content=\"Mj\u00f8lner\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/MjolnerInformatics\/\" \/>\n<meta property=\"article:modified_time\" content=\"2026-05-15T11:00:27+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/mjolner.dk\/wp-content\/uploads\/2026\/05\/logo.png\" \/>\n\t<meta property=\"og:image:width\" content=\"938\" \/>\n\t<meta property=\"og:image:height\" content=\"938\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:site\" content=\"@mjolnerdk\" \/>\n<meta name=\"twitter:label1\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data1\" content=\"4 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\/\/mjolner.dk\/en\/dvergr\/\",\"url\":\"https:\/\/mjolner.dk\/en\/dvergr\/\",\"name\":\"Dvergr - Mj\u00f8lner\",\"isPartOf\":{\"@id\":\"https:\/\/mjolner.dk\/en\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/mjolner.dk\/en\/dvergr\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/mjolner.dk\/en\/dvergr\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/mjolner.dk\/wp-content\/uploads\/2026\/05\/logo-300x300.png\",\"datePublished\":\"2026-04-27T11:11:28+00:00\",\"dateModified\":\"2026-05-15T11:00:27+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/mjolner.dk\/en\/dvergr\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/mjolner.dk\/en\/dvergr\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/mjolner.dk\/en\/dvergr\/#primaryimage\",\"url\":\"https:\/\/mjolner.dk\/wp-content\/uploads\/2026\/05\/logo-300x300.png\",\"contentUrl\":\"https:\/\/mjolner.dk\/wp-content\/uploads\/2026\/05\/logo-300x300.png\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/mjolner.dk\/en\/dvergr\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Hjem\",\"item\":\"https:\/\/mjolner.dk\/en\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Dvergr\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/mjolner.dk\/en\/#website\",\"url\":\"https:\/\/mjolner.dk\/en\/\",\"name\":\"Mj\u00f8lner\",\"description\":\"\",\"publisher\":{\"@id\":\"https:\/\/mjolner.dk\/en\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/mjolner.dk\/en\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/mjolner.dk\/en\/#organization\",\"name\":\"Mj\u00f8lner\",\"url\":\"https:\/\/mjolner.dk\/en\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/mjolner.dk\/en\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/mjolner.dk\/wp-content\/uploads\/2017\/11\/logo-white-8.svg\",\"contentUrl\":\"https:\/\/mjolner.dk\/wp-content\/uploads\/2017\/11\/logo-white-8.svg\",\"width\":1,\"height\":1,\"caption\":\"Mj\u00f8lner\"},\"image\":{\"@id\":\"https:\/\/mjolner.dk\/en\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/www.facebook.com\/MjolnerInformatics\/\",\"https:\/\/x.com\/mjolnerdk\",\"https:\/\/www.linkedin.com\/company\/mjolner-informatics-as\/\"]}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Dvergr - Mj\u00f8lner","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:\/\/mjolner.dk\/en\/dvergr\/","og_locale":"en_US","og_type":"article","og_title":"Dvergr - Mj\u00f8lner","og_description":"Automated UI Testing Tool for Embedded Touch Displays Dvergr is an automated UI testing tool for embedded systems, designed to eliminate the limitations of manual testing on graphical user interfaces (GUIs). It enables deep, deterministic, and repeatable UI validation by directly interacting with the target device\u2019s memory and graphics subsystem\u2014without modifying the firmware or hardware. [&hellip;]","og_url":"https:\/\/mjolner.dk\/en\/dvergr\/","og_site_name":"Mj\u00f8lner","article_publisher":"https:\/\/www.facebook.com\/MjolnerInformatics\/","article_modified_time":"2026-05-15T11:00:27+00:00","og_image":[{"width":938,"height":938,"url":"https:\/\/mjolner.dk\/wp-content\/uploads\/2026\/05\/logo.png","type":"image\/png"}],"twitter_card":"summary_large_image","twitter_site":"@mjolnerdk","twitter_misc":{"Est. reading time":"4 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/mjolner.dk\/en\/dvergr\/","url":"https:\/\/mjolner.dk\/en\/dvergr\/","name":"Dvergr - Mj\u00f8lner","isPartOf":{"@id":"https:\/\/mjolner.dk\/en\/#website"},"primaryImageOfPage":{"@id":"https:\/\/mjolner.dk\/en\/dvergr\/#primaryimage"},"image":{"@id":"https:\/\/mjolner.dk\/en\/dvergr\/#primaryimage"},"thumbnailUrl":"https:\/\/mjolner.dk\/wp-content\/uploads\/2026\/05\/logo-300x300.png","datePublished":"2026-04-27T11:11:28+00:00","dateModified":"2026-05-15T11:00:27+00:00","breadcrumb":{"@id":"https:\/\/mjolner.dk\/en\/dvergr\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/mjolner.dk\/en\/dvergr\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/mjolner.dk\/en\/dvergr\/#primaryimage","url":"https:\/\/mjolner.dk\/wp-content\/uploads\/2026\/05\/logo-300x300.png","contentUrl":"https:\/\/mjolner.dk\/wp-content\/uploads\/2026\/05\/logo-300x300.png"},{"@type":"BreadcrumbList","@id":"https:\/\/mjolner.dk\/en\/dvergr\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Hjem","item":"https:\/\/mjolner.dk\/en\/"},{"@type":"ListItem","position":2,"name":"Dvergr"}]},{"@type":"WebSite","@id":"https:\/\/mjolner.dk\/en\/#website","url":"https:\/\/mjolner.dk\/en\/","name":"Mj\u00f8lner","description":"","publisher":{"@id":"https:\/\/mjolner.dk\/en\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/mjolner.dk\/en\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/mjolner.dk\/en\/#organization","name":"Mj\u00f8lner","url":"https:\/\/mjolner.dk\/en\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/mjolner.dk\/en\/#\/schema\/logo\/image\/","url":"https:\/\/mjolner.dk\/wp-content\/uploads\/2017\/11\/logo-white-8.svg","contentUrl":"https:\/\/mjolner.dk\/wp-content\/uploads\/2017\/11\/logo-white-8.svg","width":1,"height":1,"caption":"Mj\u00f8lner"},"image":{"@id":"https:\/\/mjolner.dk\/en\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/MjolnerInformatics\/","https:\/\/x.com\/mjolnerdk","https:\/\/www.linkedin.com\/company\/mjolner-informatics-as\/"]}]}},"_links":{"self":[{"href":"https:\/\/mjolner.dk\/en\/wp-json\/wp\/v2\/pages\/21725","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/mjolner.dk\/en\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/mjolner.dk\/en\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/mjolner.dk\/en\/wp-json\/wp\/v2\/users\/33"}],"replies":[{"embeddable":true,"href":"https:\/\/mjolner.dk\/en\/wp-json\/wp\/v2\/comments?post=21725"}],"version-history":[{"count":20,"href":"https:\/\/mjolner.dk\/en\/wp-json\/wp\/v2\/pages\/21725\/revisions"}],"predecessor-version":[{"id":22064,"href":"https:\/\/mjolner.dk\/en\/wp-json\/wp\/v2\/pages\/21725\/revisions\/22064"}],"wp:attachment":[{"href":"https:\/\/mjolner.dk\/en\/wp-json\/wp\/v2\/media?parent=21725"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}