{"id":1192,"date":"2025-12-16T23:33:00","date_gmt":"2025-12-16T23:33:00","guid":{"rendered":"https:\/\/www.esri.com\/en-us\/software-engineering\/blog\/?post_type=blog&#038;p=1192"},"modified":"2025-12-19T17:17:50","modified_gmt":"2025-12-19T17:17:50","slug":"testing-arcgis-maps-sdks-for-native-apps-a-behind%e2%80%91the%e2%80%91scenes-look","status":"publish","type":"blog","link":"https:\/\/www.esri.com\/en-us\/software-engineering\/blog\/articles\/testing-arcgis-maps-sdks-for-native-apps-a-behind%e2%80%91the%e2%80%91scenes-look","title":{"rendered":"Testing ArcGIS Maps SDKs for Native Apps: A Behind\u2011the\u2011Scenes Look"},"content":{"rendered":"\n<p class=\"undefined block-editor-paragraph\">Testing is central to building reliable developer tools\u2014especially when those tools span multiple platforms and rendering architectures. When I began my journey within the <strong>ArcGIS Maps SDKs for Native Apps<\/strong> group, I was excited to see the test frameworks across the breadth and the depth of the SDKs. Over the years, we&#8217;ve built on those early foundations and we now run over 200,000 tests for Maps SDKs every day.<\/p>\n\n\n\n<p class=\"undefined block-editor-paragraph\">In this post, we\u2019ll take you behind the scenes and show <strong>how we plan, implement, and execute tests<\/strong> across the entire stack of Native Maps SDKs. You\u2019ll see the principles that guide our test design, the types of tests we rely on (including image\u2011based rendering checks), and how we address realities like flaky tests, long\u2011running suites, and platform\u2011specific failures\u2014without compromising end\u2011user quality.<\/p>\n\n\n\n<p class=\"undefined block-editor-paragraph\"><strong><span style=\"text-decoration: underline;\">Table of contents<\/span><\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><a href=\"#h-native-maps-sdks-architecture\">Native Maps SDKs Architecture<\/a><\/li>\n\n\n\n<li><a href=\"#h-what-makes-testing-complex\">What Makes Testing Complex?<\/a><\/li>\n\n\n\n<li><a href=\"#h-planning-for-quality-how-we-design-test-plans\">Planning for Quality: How We Design Test Plans<\/a><\/li>\n\n\n\n<li><a href=\"#h-types-of-tests-we-use\">Types of Tests We Use<\/a><\/li>\n\n\n\n<li><a href=\"#h-test-data-practical-considerations\">Test Data: Practical Considerations<\/a><\/li>\n\n\n\n<li><a href=\"#h-executing-tests-across-the-stack\">Executing Tests Across the Stack<\/a><\/li>\n\n\n\n<li><a href=\"#h-challenges-and-continuous-improvement\">Challenges and Continuous Improvement<\/a><\/li>\n\n\n\n<li><a href=\"#h-conclusion\">Conclusion<\/a><\/li>\n<\/ul>\n\n\n\n<p class=\"undefined block-editor-paragraph\">The ArcGIS Maps SDKs for Native Apps share a common core library called <strong>runtimecore<\/strong>, which unifies behavior across Software Development Kits (SDKs) and devices. That shared core lets us deliver consistent capabilities, but it also brings distinct testing challenges: ensuring rendering accuracy across GPUs and graphics APIs, validating workflows on diverse devices and DPIs, and catching regressions early in a stack that isn\u2019t itself a user\u2011facing app.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-native-maps-sdks-architecture\">Native Maps SDKs Architecture<\/h2>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"alignright size-large\"><img decoding=\"async\" src=\"https:\/\/www.esri.com\/en-us\/software-engineering\/blog\/app\/uploads\/2025\/12\/test-arch-diagram-kh.png\" alt=\"\"\/><figcaption class=\"wp-element-caption\"><em>Internal architecture layout of the Native Maps SDKs<\/em><\/figcaption><\/figure><\/div>\n\n\n<p class=\"undefined block-editor-paragraph\">Each Native Maps SDK exposes platform\u2011specific APIs, UI controls, and idioms, but they all call into <strong>runtimecore<\/strong>, a shared C++ engine that implements core GIS functionality and rendering. This design helps us test behavior one time at the core instead of multiple times for each SDK. Then we verify integration at each SDK layer.<\/p>\n\n\n\n<p class=\"undefined block-editor-paragraph\"><strong><em>Further reading<\/em><\/strong>: For a deeper architectural background, see our CTO, <a href=\"https:\/\/www.esri.com\/arcgis-blog\/products\/product\/uncategorized\/quartz-architecture-deep-dive\">Euan Cameron\u2019s Quartz Architecture Deep Dive<\/a>.<\/p>\n\n\n\n<p class=\"undefined block-editor-paragraph\">The other key aspect of the various SDKs is that each SDK supports one or many platforms and the rendering architecture on that platform. The table below highlights what platform and rendering architecture each SDK supports.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" src=\"https:\/\/www.esri.com\/en-us\/software-engineering\/blog\/app\/uploads\/2025\/12\/test-arch-diagram-1.png\" alt=\"\"\/><figcaption class=\"wp-element-caption\"><em>Platform and rendering architecture support<\/em><\/figcaption><\/figure>\n\n\n\n<p class=\"undefined block-editor-paragraph\">So, to summarize:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>SDKs target <strong>desktop<\/strong> (Windows, macOS, Linux) and <strong>mobile<\/strong> (iOS, Android).<\/li>\n\n\n\n<li>Rendering uses the <strong>native graphics stack<\/strong> of the platform (e.g., DirectX on Windows, Metal on Apple platforms, OpenGL\/ES on some devices).<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-what-makes-testing-complex\">What Makes Testing Complex?<\/h2>\n\n\n\n<p class=\"undefined block-editor-paragraph\">Testing the Native Maps SDKs is about <strong>consistency across diversity<\/strong>:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Platform diversity:<\/strong> Desktop vs. mobile, differing OS releases and drivers.<\/li>\n\n\n\n<li><strong>Rendering architectures:<\/strong> DirectX vs. Metal vs. OpenGL\/ES and shader nuances.<\/li>\n\n\n\n<li><strong>Device characteristics:<\/strong> DPI and pixel density affect features like symbol sizing and color.<\/li>\n<\/ul>\n\n\n\n<p class=\"undefined block-editor-paragraph\"><strong>Example:<\/strong><br>A symbol size that appears correct on a high\u2011DPI iPhone must also be correct on a low\u2011DPI Android device and in a Windows desktop app. We plan tests to assert <strong>size and color fidelity<\/strong> across devices, not just correctness on one platform.<\/p>\n\n\n\n<p class=\"undefined block-editor-paragraph\"><strong>Where to test (runtimecore vs. SDK):<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Core\u2011level tests<\/strong> validate algorithms and rendering logic independent of SDK wrappers.<\/li>\n\n\n\n<li><strong>SDK\u2011level tests<\/strong> verify platform integrations (e.g., view lifecycle, touch handling) and repeat core rendering checks when device variance matters (e.g., shader changes, DPI\u2011sensitive visuals).<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-planning-for-quality-how-we-design-test-plans\">Planning for Quality: How We Design Test Plans<\/h2>\n\n\n\n<p class=\"undefined block-editor-paragraph\">Our test plans are <strong>living documents<\/strong> in the development repos. <strong>Feature teams<\/strong> draft, iterate, and review them with peers across functional groups.<\/p>\n\n\n\n<p class=\"undefined block-editor-paragraph\"><strong>Principles we follow:<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Test early:<\/strong> Introduce tests with feature development to catch issues sooner.<\/li>\n\n\n\n<li><strong>Focus on real workflows:<\/strong> Base cases on what users actually do (identify, edit, navigate, render).<\/li>\n\n\n\n<li><strong>Keep tests simple &amp; targeted:<\/strong> Small, deterministic steps are easier to maintain and diagnose.<\/li>\n\n\n\n<li><strong>Use realistic data:<\/strong> Small, representative datasets for fast runs; large datasets reserved for performance and holistic checks.<\/li>\n\n\n\n<li><strong>Design for cross\u2011platform:<\/strong> Add cases that confirm behavior under differing DPIs\/devices when it matters.<\/li>\n<\/ul>\n\n\n\n<p class=\"undefined block-editor-paragraph\"><strong>Review &amp; feedback loops:<\/strong><br>Feature leads, SDK leads, and quality engineers review test plans. Feedback is captured in repo discussions and pull requests, and prioritized by risk (e.g., shader changes, new projection math) and user impact.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-types-of-tests-we-use\">Types of Tests We Use<\/h2>\n\n\n\n<p class=\"undefined block-editor-paragraph\">We do different types of tests:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><a href=\"#h-1-unit-testing-core-amp-sdk\">Unit Testing (Core &amp; SDK)<\/a><\/li>\n\n\n\n<li><a href=\"#h-2-functional-integration-testing\">Functional (Integration) Testing<\/a><\/li>\n\n\n\n<li><a href=\"#h-3-performance-testing\">Performance Testing<\/a><\/li>\n\n\n\n<li><a href=\"#h-4-ad-hoc-amp-holistic-testing\">Ad\u2011hoc &amp; Holistic Testing<\/a><\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-1-unit-testing-core-amp-sdk\">1. Unit Testing (Core &amp; SDK)<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Core (runtimecore):<\/strong> Validates algorithms and internal components (e.g., projection math, geometry operations, renderer configuration).<\/li>\n\n\n\n<li><strong>SDK wrapping:<\/strong> Ensures SDK APIs correctly map to core functionality and return expected results and errors.<\/li>\n<\/ul>\n\n\n\n<p class=\"undefined block-editor-paragraph\"><strong>GIS example:<\/strong><br>Verifying that a <code>FeatureLayer<\/code> created via an SDK wrapper yields the <strong>same feature count and attributes<\/strong> as a direct core query for a known dataset.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-2-functional-integration-testing\">2. Functional (Integration) Testing<\/h3>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"alignright size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"360\" height=\"606\" src=\"https:\/\/www.esri.com\/en-us\/software-engineering\/blog\/app\/uploads\/2025\/12\/test-design.png\" alt=\"\" class=\"wp-image-1197\" srcset=\"https:\/\/www.esri.com\/en-us\/software-engineering\/blog\/app\/uploads\/2025\/12\/test-design.png 360w, https:\/\/www.esri.com\/en-us\/software-engineering\/blog\/app\/uploads\/2025\/12\/test-design-178x300.png 178w\" sizes=\"auto, (max-width: 360px) 100vw, 360px\" \/><figcaption class=\"wp-element-caption\"><em>Example baseline image<\/em><\/figcaption><\/figure><\/div>\n\n\n<p class=\"undefined block-editor-paragraph\">We use <strong>image\u2011based comparisons<\/strong> when rendering is the outcome. A <strong>baseline image<\/strong> is captured per platform, then each test renders the same data and compares it against the baseline within a small tolerance.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>When image comparison is NOT needed:<\/strong><br>Testing <code>identifyLayer(<\/code><code>\u2026<\/code><code>) \u2192 feature<\/code> doesn\u2019t require a visual diff; success is a correctly returned feature with known attributes.<\/li>\n\n\n\n<li><strong>When image comparison IS needed:<\/strong><br>After identifying a feature, testing <strong>selection rendering<\/strong> (color, thickness, size) should use image comparison to assert visual correctness.<\/li>\n<\/ul>\n\n\n\n<p class=\"undefined block-editor-paragraph\"><strong>Rendering example (3D reprojection hero case):<\/strong><br>To confirm reprojection of 3D objects, we render a <strong>white cylinder<\/strong> with <strong>graphics as control points<\/strong> placed at known geographic locations. If the cylinder (3DObject) shape or position deviates beyond tolerance, the test fails. Graphics themselves are validated elsewhere, so they serve as reliable controls here. There are three components in the image shown. The white cylinder is the subject under test, and the blue diamond, and the red circle serve as the control points. The bottom tip of the blue diamond and the red circle serve as checks for height for the cylinder, while the red circle serves as a check for width. The locations of both the graphics serve as the control point for location of the cylinder.<\/p>\n\n\n\n<p class=\"undefined block-editor-paragraph\">For more about image-based testing, see the video <a href=\"https:\/\/www.youtube.com\/watch?v=MQOXLbk-hXE&amp;t=920s\">Testing with Pictures<\/a> by Mark Baird. Although we no longer support ArcGIS Runtime SDK for Java anymore, the concepts still apply.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-3-performance-testing\">3. Performance Testing<\/h3>\n\n\n\n<p class=\"undefined block-editor-paragraph\">Benchmarks run both at <strong>core<\/strong> and <strong>SDK<\/strong> layers in controlled environments. We measure:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Frame time \/ rendering throughput<\/li>\n\n\n\n<li>Query and selection latency<\/li>\n\n\n\n<li>Memory and resource usage under load<br>Performance suites use <strong>larger datasets<\/strong> or <strong>stress scenarios<\/strong> to validate responsiveness and stability.<\/li>\n<\/ul>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"874\" height=\"300\" src=\"https:\/\/www.esri.com\/en-us\/software-engineering\/blog\/app\/uploads\/2025\/12\/Screenshot-2025-12-16-at-2.55.01-PM.png\" alt=\"\" class=\"wp-image-1332\" srcset=\"https:\/\/www.esri.com\/en-us\/software-engineering\/blog\/app\/uploads\/2025\/12\/Screenshot-2025-12-16-at-2.55.01-PM.png 874w, https:\/\/www.esri.com\/en-us\/software-engineering\/blog\/app\/uploads\/2025\/12\/Screenshot-2025-12-16-at-2.55.01-PM-300x103.png 300w, https:\/\/www.esri.com\/en-us\/software-engineering\/blog\/app\/uploads\/2025\/12\/Screenshot-2025-12-16-at-2.55.01-PM-768x264.png 768w\" sizes=\"auto, (max-width: 874px) 100vw, 874px\" \/><figcaption class=\"wp-element-caption\"><em>Capturing memory allocation from a performance test. A regression got introduced at around build 4775 but we soon caught and mitigated it as can be seen from the chart above.<\/em><\/figcaption><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-4-ad-hoc-amp-holistic-testing\">4. Ad\u2011hoc &amp; Holistic Testing<\/h3>\n\n\n\n<p class=\"undefined block-editor-paragraph\">Beyond automated suites, we exercise <strong>end\u2011to\u2011end workflows<\/strong> (e.g., navigate \u2192 identify \u2192 select \u2192 edit \u2192 persist) on representative devices. Stakeholder personas (mobile field user, desktop analyst) help us spotlight usability and integration issues. Findings feed back into test plans as new automated cases or refinements. <\/p>\n\n\n\n<p class=\"undefined block-editor-paragraph\">For adhoc testing, we use internally built applications as well as reuse our open-sourced code <strong>samples<\/strong> for our users (developers), via a viewer application for each SDK. We have gone from a few samples in my early days, to almost 180 samples for each SDK.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Samples help identify issues like rendering, and user experience.<\/li>\n\n\n\n<li>Tested source code from sample apps gets reused as app samples and code snippets within our <strong>API reference<\/strong> and <strong>guide documents<\/strong> ensuring accurate examples.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-test-data-practical-considerations\">Test Data: Practical Considerations<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Keep it lightweight<\/strong> for routine runs to minimize network and device overhead.<\/li>\n\n\n\n<li><strong>Prefer offline packages<\/strong> (e.g., <strong>mobile map package<\/strong>, <strong>mobile scene package<\/strong>) to reduce external dependencies.<\/li>\n\n\n\n<li><strong>Mock online services<\/strong> to avoid instability from live changes.<br>For Swift users, we maintain <strong>DejaVu<\/strong>, an open\u2011source network\u2011request mocking framework you can use in your own tests. <a href=\"https:\/\/github.com\/Esri\/Dejavu\">Dejavu (Swift) on GitHub<\/a><\/li>\n\n\n\n<li><strong>Formats we exercise:<\/strong> Esri specific datasets, and relevant open\u2011standard types (e.g., OGC). Large datasets that are created via scripts or other data creation tools like ArcGIS Pro, are used for <strong>performance<\/strong> and <strong>holistic<\/strong> scenarios. <\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-executing-tests-across-the-stack\">Executing Tests Across the Stack<\/h2>\n\n\n\n<p class=\"undefined block-editor-paragraph\">We gate changes with multi\u2011level automation:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n\n<li><strong>Pre\u2011merge checks<\/strong> on the feature branch (unit and functional tests) prevent regressions entering the <strong>main<\/strong> branch of runtimecore or an SDK repo.<\/li>\n\n\n<li><strong>Daily builds<\/strong> (core and SDKs) run broader suites\u2014unit, functional\/image comparisons, and performance\u2014across multiple platforms\/devices.<\/li>\n\n\n<li>Results are categorized <strong>pass \/ fail \/ skip<\/strong>.\n\n<ul class=\"wp-block-list\">\n\n<li><strong>Image comparison failures<\/strong> are prioritized because they surface rendering differences (e.g., missing contour lines, color shifts).<\/li>\n\n<\/ul>\n\n<\/li>\n\n<\/ul>\n\n\n\n<p class=\"undefined block-editor-paragraph\"><strong>Example image comparison failures:<\/strong><\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" src=\"https:\/\/www.esri.com\/en-us\/software-engineering\/blog\/app\/uploads\/2025\/12\/image-compare-symbols-md.png\" alt=\"\"\/><figcaption class=\"wp-element-caption\"><em>Side\u2011by\u2011side baseline vs. test image with a <strong>difference <\/strong>highlighting where symbols differ in color or contour lines do not render<\/em><\/figcaption><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" src=\"https:\/\/www.esri.com\/en-us\/software-engineering\/blog\/app\/uploads\/2025\/12\/image-compare-buildings-md.png\" alt=\"\"\/><figcaption class=\"wp-element-caption\"><em>Side\u2011by\u2011side baseline vs. test image with a <strong>difference <\/strong>highlighting where 3D buildings render differently<\/em><\/figcaption><\/figure>\n\n\n\n<p class=\"undefined block-editor-paragraph\">The infrastructure for our end to end testing is handled by creating and maintaining extensive <strong>DevOps<\/strong> pipelines which orchestrate these workflows. This allows us to be agile in testing the entire stack.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-challenges-and-continuous-improvement\">Challenges and Continuous Improvement<\/h2>\n\n\n\n<p class=\"undefined block-editor-paragraph\">Next, we&#8217;ll explain the most common challenges we face in our test infrastructure, along with the techniques we use to mitigate them and keep the system moving forward.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><a href=\"#h-1-flaky-tests\">Flaky Tests<\/a><\/li>\n\n\n\n<li><a href=\"#h-2-changing-data\">Changing Data<\/a><\/li>\n\n\n\n<li><a href=\"#h-3-long-running-suites\">Long-Running Suites<\/a><\/li>\n\n\n\n<li><a href=\"http:\/\/h-4-platform-specific-failures\">Platform-Specific Failures<\/a><\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-1-flaky-tests\">1. Flaky Tests<\/h3>\n\n\n\n<p class=\"undefined block-editor-paragraph\"><strong>Symptoms:<\/strong> Non\u2011deterministic passes\/fails due to timing, race conditions, or environment variability.<br><strong>Mitigations:<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Stabilize by removing non\u2011determinism (explicit waits, seeded randomness).<\/li>\n\n\n\n<li><strong>Quarantine<\/strong> known flaky tests while fixes land; track and burn down between releases.<\/li>\n\n\n\n<li>Add <strong>diagnostic logging<\/strong> and stricter tolerances where appropriate.<\/li>\n<\/ul>\n\n\n\n<p class=\"undefined block-editor-paragraph\"><strong><em>Further viewing<\/em><\/strong>: <a href=\"https:\/\/www.youtube.com\/watch?v=nOHuZ69BMJk\">Qt World Summit talk by Lucas Danzinger and James Ballard<\/a> to deal with flaky tests in the Qt SDK<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-2-changing-data\">2. Changing Data<\/h3>\n\n\n\n<p class=\"undefined block-editor-paragraph\"><strong>Risk:<\/strong> External services and datasets evolve, breaking assumptions.<br><strong>Mitigations:<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Versioned test datasets<\/strong> and <strong>mocked services<\/strong> to lock behavior.<\/li>\n\n\n\n<li>Scheduled refreshes with validation checks before re\u2011adopting updated data.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-3-long-running-suites\">3. Long-Running Suites<\/h3>\n\n\n\n<p class=\"undefined block-editor-paragraph\"><strong>Risk:<\/strong> Slow feedback loops.<br><strong>Mitigations:<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Parallelization<\/strong>, where we run multiple independent tests at the same time in separate threads, and <strong>selective execution<\/strong> (run impacted tests based on functional area changes). <\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-4-platform-specific-failures\">4. Platform-Specific Failures<\/h3>\n\n\n\n<p class=\"undefined block-editor-paragraph\"><strong>Risk:<\/strong> Issues that reproduce only on certain OS\/hardware stacks.<br><strong>Mitigations:<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Reproduce with specific <strong>device <\/strong>and <strong>graphics API variants<\/strong>.<\/li>\n\n\n\n<li>Instrument rendering pathways and compare shader outputs across platforms.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-conclusion\">Conclusion<\/h2>\n\n\n\n<p class=\"undefined block-editor-paragraph\">Delivering consistent, high\u2011quality Native Maps SDKs across platforms requires <strong>early, focused tests<\/strong> at runtimecore, <strong>integration checks<\/strong> at each SDK, <strong>image\u2011based rendering verification<\/strong>, and <strong>performance<\/strong> and <strong>holistic<\/strong> evaluations. <\/p>\n\n\n\n<p class=\"undefined block-editor-paragraph\">Our processes evolve continuously\u2014quarantining and stabilizing flaky tests, mocking volatile inputs, and optimizing long runs\u2014so developers can depend on predictable behavior and visual fidelity.<\/p>\n\n\n\n<p class=\"undefined block-editor-paragraph\">If you\u2019ve encountered similar testing challenges\u2014or have ideas we should explore\u2014we\u2019d love to hear from you. <\/p>\n\n\n\n<p class=\"undefined block-editor-paragraph\">Interested in building tools like these? Check out our <a href=\"https:\/\/www.esri.com\/en-us\/about\/careers\/overview?rsource=%2Fcareers\">careers<\/a> page<strong>.<\/strong><\/p>\n\n\n\n<p class=\"undefined block-editor-paragraph\"><\/p>\n\n\n\n<p class=\"undefined block-editor-paragraph\"><\/p>\n","protected":false},"author":24,"featured_media":0,"parent":0,"menu_order":0,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[3,17],"tags":[71,83,86,89,52,87,82,84,88,80,81],"class_list":["post-1192","blog","type-blog","status-publish","format-standard","hentry","category-software-development","category-testing-qa","tag-arcgis-maps-sdk-for-native-apps","tag-automated-testing","tag-continuous-integration","tag-continuous-testing","tag-development","tag-flaky-tests","tag-software-testing","tag-test-infrastructure","tag-test-reliability","tag-testing-qa","tag-tests"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v23.2 (Yoast SEO v25.0) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Testing ArcGIS Maps SDKs for Native Apps: A Behind\u2011the\u2011Scenes Look - Esri Software Engineering Blog<\/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:\/\/www.esri.com\/en-us\/software-engineering\/blog\/articles\/testing-arcgis-maps-sdks-for-native-apps-a-behind\u2011the\u2011scenes-look\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Testing ArcGIS Maps SDKs for Native Apps: A Behind\u2011the\u2011Scenes Look\" \/>\n<meta property=\"og:description\" content=\"Testing is central to building reliable developer tools\u2014especially when those tools span multiple platforms and rendering architectures. When I began my journey within the ArcGIS Maps SDKs for Native Apps group, I was excited to see the test frameworks across the breadth and the depth of the SDKs. Over the years, we&#8217;ve built on those [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.esri.com\/en-us\/software-engineering\/blog\/articles\/testing-arcgis-maps-sdks-for-native-apps-a-behind\u2011the\u2011scenes-look\" \/>\n<meta property=\"og:site_name\" content=\"Esri Software Engineering Blog\" \/>\n<meta property=\"article:modified_time\" content=\"2025-12-19T17:17:50+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.esri.com\/en-us\/software-engineering\/blog\/app\/uploads\/2025\/12\/test-arch-diagram-kh.png\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data1\" content=\"9 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.esri.com\/en-us\/software-engineering\/blog\/articles\/testing-arcgis-maps-sdks-for-native-apps-a-behind%e2%80%91the%e2%80%91scenes-look\",\"url\":\"https:\/\/www.esri.com\/en-us\/software-engineering\/blog\/articles\/testing-arcgis-maps-sdks-for-native-apps-a-behind%e2%80%91the%e2%80%91scenes-look\",\"name\":\"Testing ArcGIS Maps SDKs for Native Apps: A Behind\u2011the\u2011Scenes Look - Esri Software Engineering Blog\",\"isPartOf\":{\"@id\":\"https:\/\/www.esri.com\/en-us\/software-engineering\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.esri.com\/en-us\/software-engineering\/blog\/articles\/testing-arcgis-maps-sdks-for-native-apps-a-behind%e2%80%91the%e2%80%91scenes-look#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.esri.com\/en-us\/software-engineering\/blog\/articles\/testing-arcgis-maps-sdks-for-native-apps-a-behind%e2%80%91the%e2%80%91scenes-look#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.esri.com\/en-us\/software-engineering\/blog\/app\/uploads\/2025\/12\/test-arch-diagram-kh.png\",\"datePublished\":\"2025-12-16T23:33:00+00:00\",\"dateModified\":\"2025-12-19T17:17:50+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/www.esri.com\/en-us\/software-engineering\/blog\/articles\/testing-arcgis-maps-sdks-for-native-apps-a-behind%e2%80%91the%e2%80%91scenes-look#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.esri.com\/en-us\/software-engineering\/blog\/articles\/testing-arcgis-maps-sdks-for-native-apps-a-behind%e2%80%91the%e2%80%91scenes-look\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.esri.com\/en-us\/software-engineering\/blog\/articles\/testing-arcgis-maps-sdks-for-native-apps-a-behind%e2%80%91the%e2%80%91scenes-look#primaryimage\",\"url\":\"https:\/\/www.esri.com\/en-us\/software-engineering\/blog\/app\/uploads\/2025\/12\/test-arch-diagram-kh.png\",\"contentUrl\":\"https:\/\/www.esri.com\/en-us\/software-engineering\/blog\/app\/uploads\/2025\/12\/test-arch-diagram-kh.png\",\"width\":452,\"height\":570},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.esri.com\/en-us\/software-engineering\/blog\/articles\/testing-arcgis-maps-sdks-for-native-apps-a-behind%e2%80%91the%e2%80%91scenes-look#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.esri.com\/en-us\/software-engineering\/blog\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Testing ArcGIS Maps SDKs for Native Apps: A Behind\u2011the\u2011Scenes Look\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.esri.com\/en-us\/software-engineering\/blog\/#website\",\"url\":\"https:\/\/www.esri.com\/en-us\/software-engineering\/blog\/\",\"name\":\"Esri Software Engineering Blog\",\"description\":\"\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.esri.com\/en-us\/software-engineering\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Testing ArcGIS Maps SDKs for Native Apps: A Behind\u2011the\u2011Scenes Look - Esri Software Engineering Blog","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:\/\/www.esri.com\/en-us\/software-engineering\/blog\/articles\/testing-arcgis-maps-sdks-for-native-apps-a-behind\u2011the\u2011scenes-look","og_locale":"en_US","og_type":"article","og_title":"Testing ArcGIS Maps SDKs for Native Apps: A Behind\u2011the\u2011Scenes Look","og_description":"Testing is central to building reliable developer tools\u2014especially when those tools span multiple platforms and rendering architectures. When I began my journey within the ArcGIS Maps SDKs for Native Apps group, I was excited to see the test frameworks across the breadth and the depth of the SDKs. Over the years, we&#8217;ve built on those [&hellip;]","og_url":"https:\/\/www.esri.com\/en-us\/software-engineering\/blog\/articles\/testing-arcgis-maps-sdks-for-native-apps-a-behind\u2011the\u2011scenes-look","og_site_name":"Esri Software Engineering Blog","article_modified_time":"2025-12-19T17:17:50+00:00","og_image":[{"url":"https:\/\/www.esri.com\/en-us\/software-engineering\/blog\/app\/uploads\/2025\/12\/test-arch-diagram-kh.png","type":"","width":"","height":""}],"twitter_card":"summary_large_image","twitter_misc":{"Est. reading time":"9 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/www.esri.com\/en-us\/software-engineering\/blog\/articles\/testing-arcgis-maps-sdks-for-native-apps-a-behind%e2%80%91the%e2%80%91scenes-look","url":"https:\/\/www.esri.com\/en-us\/software-engineering\/blog\/articles\/testing-arcgis-maps-sdks-for-native-apps-a-behind%e2%80%91the%e2%80%91scenes-look","name":"Testing ArcGIS Maps SDKs for Native Apps: A Behind\u2011the\u2011Scenes Look - Esri Software Engineering Blog","isPartOf":{"@id":"https:\/\/www.esri.com\/en-us\/software-engineering\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.esri.com\/en-us\/software-engineering\/blog\/articles\/testing-arcgis-maps-sdks-for-native-apps-a-behind%e2%80%91the%e2%80%91scenes-look#primaryimage"},"image":{"@id":"https:\/\/www.esri.com\/en-us\/software-engineering\/blog\/articles\/testing-arcgis-maps-sdks-for-native-apps-a-behind%e2%80%91the%e2%80%91scenes-look#primaryimage"},"thumbnailUrl":"https:\/\/www.esri.com\/en-us\/software-engineering\/blog\/app\/uploads\/2025\/12\/test-arch-diagram-kh.png","datePublished":"2025-12-16T23:33:00+00:00","dateModified":"2025-12-19T17:17:50+00:00","breadcrumb":{"@id":"https:\/\/www.esri.com\/en-us\/software-engineering\/blog\/articles\/testing-arcgis-maps-sdks-for-native-apps-a-behind%e2%80%91the%e2%80%91scenes-look#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.esri.com\/en-us\/software-engineering\/blog\/articles\/testing-arcgis-maps-sdks-for-native-apps-a-behind%e2%80%91the%e2%80%91scenes-look"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.esri.com\/en-us\/software-engineering\/blog\/articles\/testing-arcgis-maps-sdks-for-native-apps-a-behind%e2%80%91the%e2%80%91scenes-look#primaryimage","url":"https:\/\/www.esri.com\/en-us\/software-engineering\/blog\/app\/uploads\/2025\/12\/test-arch-diagram-kh.png","contentUrl":"https:\/\/www.esri.com\/en-us\/software-engineering\/blog\/app\/uploads\/2025\/12\/test-arch-diagram-kh.png","width":452,"height":570},{"@type":"BreadcrumbList","@id":"https:\/\/www.esri.com\/en-us\/software-engineering\/blog\/articles\/testing-arcgis-maps-sdks-for-native-apps-a-behind%e2%80%91the%e2%80%91scenes-look#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.esri.com\/en-us\/software-engineering\/blog"},{"@type":"ListItem","position":2,"name":"Testing ArcGIS Maps SDKs for Native Apps: A Behind\u2011the\u2011Scenes Look"}]},{"@type":"WebSite","@id":"https:\/\/www.esri.com\/en-us\/software-engineering\/blog\/#website","url":"https:\/\/www.esri.com\/en-us\/software-engineering\/blog\/","name":"Esri Software Engineering Blog","description":"","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.esri.com\/en-us\/software-engineering\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"}]}},"text_date":"December 16, 2025","author_name":"Koushik Hajra","author_page":false,"custom_image":"https:\/\/www.esri.com\/en-us\/software-engineering\/blog\/app\/uploads\/2025\/12\/Testing-ArcGIS-Maps-SDKs-for-Native-Apps-A-Behind\u2011the\u2011Scenes-Look-With-bg-v3.jpg","primary_product":false,"tag_data":[{"term_id":71,"name":"ArcGIS Maps SDK for Native Apps","slug":"arcgis-maps-sdk-for-native-apps","term_group":0,"term_taxonomy_id":71,"taxonomy":"post_tag","description":"","parent":0,"count":2,"filter":"raw"},{"term_id":83,"name":"automated-testing","slug":"automated-testing","term_group":0,"term_taxonomy_id":83,"taxonomy":"post_tag","description":"","parent":0,"count":1,"filter":"raw"},{"term_id":86,"name":"continuous-integration","slug":"continuous-integration","term_group":0,"term_taxonomy_id":86,"taxonomy":"post_tag","description":"","parent":0,"count":1,"filter":"raw"},{"term_id":89,"name":"continuous-testing","slug":"continuous-testing","term_group":0,"term_taxonomy_id":89,"taxonomy":"post_tag","description":"","parent":0,"count":1,"filter":"raw"},{"term_id":52,"name":"development","slug":"development","term_group":0,"term_taxonomy_id":52,"taxonomy":"post_tag","description":"","parent":0,"count":2,"filter":"raw"},{"term_id":87,"name":"flaky-tests","slug":"flaky-tests","term_group":0,"term_taxonomy_id":87,"taxonomy":"post_tag","description":"","parent":0,"count":1,"filter":"raw"},{"term_id":82,"name":"software-testing","slug":"software-testing","term_group":0,"term_taxonomy_id":82,"taxonomy":"post_tag","description":"","parent":0,"count":1,"filter":"raw"},{"term_id":84,"name":"test-infrastructure","slug":"test-infrastructure","term_group":0,"term_taxonomy_id":84,"taxonomy":"post_tag","description":"","parent":0,"count":1,"filter":"raw"},{"term_id":88,"name":"test-reliability","slug":"test-reliability","term_group":0,"term_taxonomy_id":88,"taxonomy":"post_tag","description":"","parent":0,"count":1,"filter":"raw"},{"term_id":80,"name":"testing &amp; qa","slug":"testing-qa","term_group":0,"term_taxonomy_id":80,"taxonomy":"post_tag","description":"","parent":0,"count":1,"filter":"raw"},{"term_id":81,"name":"tests","slug":"tests","term_group":0,"term_taxonomy_id":81,"taxonomy":"post_tag","description":"","parent":0,"count":1,"filter":"raw"}],"category_data":[{"term_id":3,"name":"Software development","slug":"software-development","term_group":0,"term_taxonomy_id":3,"taxonomy":"category","description":"Articles focusing on how we apply coding practices, software design, development methodologies, and tools used while building our products, systems, etc.","parent":0,"count":8,"filter":"raw"},{"term_id":17,"name":"Testing &amp; QA","slug":"testing-qa","term_group":0,"term_taxonomy_id":17,"taxonomy":"category","description":"Articles on how we apply software testing, quality assurance, test automation, and defect tracking processes to ensure software quality.","parent":3,"count":3,"filter":"raw"}],"product_data":{"errors":{"invalid_taxonomy":["Invalid taxonomy."]},"error_data":[]},"primary_product_link":"https:\/\/www.esri.com\/en-us\/software-engineering\/blog\/","short_description":"200,000 tests a day. Multiple platforms. Same map. The testing processes and challenges behind the ArcGIS Native Maps SDKs.","image":"https:\/\/www.esri.com\/en-us\/software-engineering\/blog\/app\/uploads\/2025\/12\/Testing-ArcGIS-Maps-SDKs-for-Native-Apps.jpg","_links":{"self":[{"href":"https:\/\/www.esri.com\/en-us\/software-engineering\/blog\/wp-json\/wp\/v2\/article\/1192","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.esri.com\/en-us\/software-engineering\/blog\/wp-json\/wp\/v2\/article"}],"about":[{"href":"https:\/\/www.esri.com\/en-us\/software-engineering\/blog\/wp-json\/wp\/v2\/types\/blog"}],"author":[{"embeddable":true,"href":"https:\/\/www.esri.com\/en-us\/software-engineering\/blog\/wp-json\/wp\/v2\/users\/24"}],"version-history":[{"count":0,"href":"https:\/\/www.esri.com\/en-us\/software-engineering\/blog\/wp-json\/wp\/v2\/article\/1192\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.esri.com\/en-us\/software-engineering\/blog\/wp-json\/wp\/v2\/media?parent=1192"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.esri.com\/en-us\/software-engineering\/blog\/wp-json\/wp\/v2\/categories?post=1192"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.esri.com\/en-us\/software-engineering\/blog\/wp-json\/wp\/v2\/tags?post=1192"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}