<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: YmAICode</title>
    <description>The latest articles on DEV Community by YmAICode (@su_qym_e0ffcb6804a23256f7).</description>
    <link>https://dev.to/su_qym_e0ffcb6804a23256f7</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4092681%2F5d9dc978-4058-49d2-a422-8ffd34755ae0.png</url>
      <title>DEV Community: YmAICode</title>
      <link>https://dev.to/su_qym_e0ffcb6804a23256f7</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/su_qym_e0ffcb6804a23256f7"/>
    <language>en</language>
    <item>
      <title>AI UI Testing: Why Local Demos Hit 9/10 and Production Hits 6/10</title>
      <dc:creator>YmAICode</dc:creator>
      <pubDate>Mon, 24 Aug 2026 16:42:05 +0000</pubDate>
      <link>https://dev.to/su_qym_e0ffcb6804a23256f7/ai-ui-testing-why-local-demos-hit-910-and-production-hits-610-2i6a</link>
      <guid>https://dev.to/su_qym_e0ffcb6804a23256f7/ai-ui-testing-why-local-demos-hit-910-and-production-hits-610-2i6a</guid>
      <description>&lt;h1&gt;
  
  
  AI UI Testing: Why Local Demos Hit 9/10 and Production Hits 6/10
&lt;/h1&gt;

&lt;blockquote&gt;
&lt;p&gt;We built TestStar, an AI UI testing platform. Here's what we learned from 8 runs of one real case.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  The gap nobody talks about
&lt;/h2&gt;

&lt;p&gt;If you've used any AI browser-testing tool in 2025-2026, you've probably hit this:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Local demos succeed 9 out of 10 times. Production at scale? Maybe 6 out of 10. Sometimes worse.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;We hit this head-on during our Tier 1 stability verification at &lt;strong&gt;TestStar&lt;/strong&gt;. We took one real-world business case (login → SQL console → enter query → execute → assert, 19 steps) and ran it 8 times:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Run&lt;/th&gt;
&lt;th&gt;Result&lt;/th&gt;
&lt;th&gt;Time&lt;/th&gt;
&lt;th&gt;Tokens&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;failed&lt;/td&gt;
&lt;td&gt;367s&lt;/td&gt;
&lt;td&gt;480K&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;failed&lt;/td&gt;
&lt;td&gt;104s&lt;/td&gt;
&lt;td&gt;74K&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;passed&lt;/td&gt;
&lt;td&gt;178s&lt;/td&gt;
&lt;td&gt;191K&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;passed&lt;/td&gt;
&lt;td&gt;99s&lt;/td&gt;
&lt;td&gt;57K&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;td&gt;passed&lt;/td&gt;
&lt;td&gt;114s&lt;/td&gt;
&lt;td&gt;54K&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;passed&lt;/td&gt;
&lt;td&gt;65s&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Each failure had a different cause. Run 1: bad data (AI did nothing wrong). Run 2: browser driver crashed. That's the part that breaks your sanity — there's no consistent failure mode.&lt;/p&gt;

&lt;p&gt;But Run 6 was the one that taught us the real lesson. The subprocess finished successfully. The AI did everything right. But the result never made it back to the database. &lt;strong&gt;AI judgment and system judgment disagreed.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;We spent two days debugging. Root cause: every AI step was triggering a sync memory write. By step 19, the worker thread was so backed up it timed out. Tools worked. Platform collapsed.&lt;/p&gt;

&lt;p&gt;That's the production gap nobody warns you about.&lt;/p&gt;




&lt;h2&gt;
  
  
  What "execution engine ≠ platform" actually means
&lt;/h2&gt;

&lt;p&gt;Browser-Use, Midscene, Skyvern — they're execution engines. They translate natural language into browser actions. Useful, but they're not testing platforms.&lt;/p&gt;

&lt;p&gt;A testing platform needs at least:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Failure handling: retry, give up, escalate?&lt;/li&gt;
&lt;li&gt;Self-healing: is this AI error or product change? Fixable?&lt;/li&gt;
&lt;li&gt;Observability: can humans replay, locate, attribute?&lt;/li&gt;
&lt;li&gt;Retry with idempotency: how do you retry network blips without double-clicking "Pay"?&lt;/li&gt;
&lt;li&gt;Memory: does today's failure experience carry forward?&lt;/li&gt;
&lt;li&gt;Scheduling: how do you run 1000 cases across priorities?&lt;/li&gt;
&lt;li&gt;Knowledge: where exactly is that button on this page?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;None of these live in the execution engine. They all live in what we call the &lt;strong&gt;Harness layer&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;A team we know spent 3 months evaluating 5 AI testing tools, picked the one with the best demo, then spent another 6 months building the Harness layer themselves. Total: 9 months. If they'd asked the right questions upfront, the decision would have been different.&lt;/p&gt;




&lt;h2&gt;
  
  
  Three real incidents that shaped our self-healing
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Incident 1: AI confidently clicked the wrong button
&lt;/h3&gt;

&lt;p&gt;Early on, AI clicked what it thought was "Delete user." Logs showed success. UI showed success. But the actual button — due to a CSS bug — was covering the "Archive" button. AI did exactly what it saw, but the user got the wrong operation.&lt;/p&gt;

&lt;p&gt;We learned: &lt;strong&gt;self-healing can't trust "operation succeeded" alone&lt;/strong&gt;. You have to verify the user's intended outcome, not just the system's reported outcome.&lt;/p&gt;

&lt;h3&gt;
  
  
  Incident 2: Self-healing broke a working test
&lt;/h3&gt;

&lt;p&gt;We shipped the self-healing module. QA reported that previously-passing tests were now failing. We dug in.&lt;/p&gt;

&lt;p&gt;The AI saw this line in logs:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Continue on error: skip summary-xxx.json"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The word "error" triggered the diagnosis. AI generated a patch, applied it, broke a working test. &lt;strong&gt;The real failure was on a different line entirely.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Fix: add a "real error extraction" layer. Only scan lines starting with patterns like &lt;code&gt;waitFor timeout&lt;/code&gt; / &lt;code&gt;Assertion failed&lt;/code&gt;. Exclude configuration lines.&lt;/p&gt;

&lt;p&gt;Lesson: &lt;strong&gt;the premise of self-healing is trustworthy failure signals&lt;/strong&gt;. Get the signal wrong, and you make things worse.&lt;/p&gt;

&lt;h3&gt;
  
  
  Incident 3: "I can't find the login button" — but it's right there
&lt;/h3&gt;

&lt;p&gt;AI reported it couldn't locate the login button. Developer went to the page — the button was right there. Took 30 minutes of debugging to figure out: at the moment AI took its screenshot, a popup ad was covering the button. AI wasn't lying. The signal was misleading.&lt;/p&gt;




&lt;h2&gt;
  
  
  The 60% number (and why we won't inflate it)
&lt;/h2&gt;

&lt;p&gt;We deliberately created 5 failing test cases and measured self-healing recovery:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Case&lt;/th&gt;
&lt;th&gt;Failure type&lt;/th&gt;
&lt;th&gt;Recovered?&lt;/th&gt;
&lt;th&gt;Why&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;network&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;DNS unreachable — physical failure&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;element&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;Element relocalization&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;assertion&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;Assertion condition updated&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;timeout&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;1s extreme timeout — test design error&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;rename&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;Element renamed&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Recoverable failures: 3/3 = 100%&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Overall: 3/5 = 60%&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Case 4 (the 1-second timeout) was the most interesting. We debated whether to "rescue" it — let AI extend the timeout automatically. We decided &lt;strong&gt;not to&lt;/strong&gt;. Why? The case was waiting 1 second for an element that genuinely needs 3 seconds to appear. If AI "fixed" this, it would hide a real test design problem the developer needs to address.&lt;/p&gt;

&lt;p&gt;If we inflated the number to 80%, we'd be hiding the fact that physical failures and test design errors aren't supposed to be healed. &lt;strong&gt;Honest &amp;gt; inflated.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This principle matters more in AI testing than almost anywhere else. AI testing is inherently uncertain. Customer trust is fragile. Inflated data builds false trust — and false trust collapses harder than it was built.&lt;/p&gt;




&lt;h2&gt;
  
  
  Memory and the knowledge base
&lt;/h2&gt;

&lt;p&gt;We have three kinds of memory:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Wiki&lt;/strong&gt;: "This button is at the top of the page" — persistent&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Skill distillation&lt;/strong&gt;: "For similar scenarios, this pattern works" — from successful runs&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Failure memory&lt;/strong&gt;: "Last time we did X, it failed" — accumulated&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Storage is semantic-search-first, with local file fallback. Works in demo (no dependencies), scales to production.&lt;/p&gt;

&lt;p&gt;But we learned the hard way: &lt;strong&gt;memory is not always good&lt;/strong&gt;. One case: a transient network timeout got written into failure memory. From then on, every similar scenario triggered that "lesson," and AI started second-guessing normal operations.&lt;/p&gt;

&lt;p&gt;Memory has noise. Auto-forgetting and conflict resolution are still open problems for us.&lt;/p&gt;

&lt;p&gt;For the knowledge base, we inject page-element hints (semantic + location) into the AI prompt. Real effect: AI used to confuse "password" with "password login" — two similar elements. After injecting location hints, it locks onto the right element by position first. Error rate dropped noticeably.&lt;/p&gt;




&lt;h2&gt;
  
  
  When TestStar works (and when it doesn't)
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Works for&lt;/strong&gt;: form + list + detail UIs in admin/dashboard systems (OA, CRM, BI platforms, internal tools).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Doesn't work for&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Canvas/WebGL (games, visualization, whiteboards) — AI sees pixels but doesn't know what they mean&lt;/li&gt;
&lt;li&gt;Heavy anti-bot pages (CAPTCHA, slider, behavior detection) — AI has no real human environment&lt;/li&gt;
&lt;li&gt;Very short cases (fewer than 5 steps) — cache hits don't offset startup overhead&lt;/li&gt;
&lt;li&gt;Cross-domain federated login (OAuth, SAML multi-step)&lt;/li&gt;
&lt;li&gt;Heavily dynamic SPAs that completely re-render on every refresh&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;We're honest about this. &lt;strong&gt;Acknowledging your limits is more respectable than pretending you don't have any.&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Five questions before adopting any AI testing tool
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Are failure signals structured?&lt;/strong&gt; (determines whether self-healing is even possible)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Are logs externally subscribable?&lt;/strong&gt; (determines observability)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Can the execution be interrupted?&lt;/strong&gt; (determines self-healing loops)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Can the tool ingest external knowledge?&lt;/strong&gt; (determines knowledge base value)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Is there an API for scheduling?&lt;/strong&gt; (determines scale)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;These five answers matter more than how good the demo looks.&lt;/p&gt;




&lt;h2&gt;
  
  
  What we got wrong, honestly
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;First CI run: 36% pass rate.&lt;/strong&gt; Stakeholder reaction: "How is this production-ready?" Our answer: "First-run 36% is normal. What matters is exit code 0 (CI didn't block), KPIs collected (healing rate, tokens, time), and data persisted. The real value is in the 2 weeks of production data that follow."&lt;/p&gt;

&lt;p&gt;We did not inflate. We did not exclude "known failures." Some team members thought this was too aggressive. We held the line.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Real CI data: missing.&lt;/strong&gt; Smoke scripts work. Two weeks of production data haven't accumulated yet. Real failure rate, monthly cost, human intervention frequency — all unknowns.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Multi-scenario validation: incomplete.&lt;/strong&gt; We have deep validation on one case (data query console). Other scenarios (CRM, complex SPAs, low-code platforms) — unverified.&lt;/p&gt;




&lt;h2&gt;
  
  
  Closing
&lt;/h2&gt;

&lt;p&gt;Three things, if I had to compress:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;The execution engine is the start, not the finish. &lt;strong&gt;The Harness layer is where the real battle is.&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Token cost is structural, not optimizable. &lt;strong&gt;Cache is not an optimization — it's a prerequisite for production.&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Engines will commoditize. &lt;strong&gt;Differentiation will land on memory and knowledge — whoever remembers more, whoever crystallizes better.&lt;/strong&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;If you're evaluating AI testing tools, ask the five questions. If you're building one, build the Harness layer first — the engine can be substituted.&lt;/p&gt;

&lt;p&gt;Test engineers' core value was never "knows which tool to use." It's "knows when to trust, when to doubt."&lt;/p&gt;




&lt;p&gt;TestStar is an AI UI testing platform: 22K lines of Python + 10K lines of vanilla JS, with a built-in vision-driven AI browser engine and an orchestration/self-healing/memory layer on top.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>automation</category>
      <category>softwareengineering</category>
      <category>testing</category>
    </item>
  </channel>
</rss>
