<?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: QApilot</title>
    <description>The latest articles on DEV Community by QApilot (qapilot).</description>
    <link>https://dev.to/qapilot</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%2Forganization%2Fprofile_image%2F13465%2F318b2884-f847-472c-82d7-6c35e3b05b0f.png</url>
      <title>DEV Community: QApilot</title>
      <link>https://dev.to/qapilot</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/qapilot"/>
    <language>en</language>
    <item>
      <title>App Intents, AppFunctions, and the Interface Your Test Suite Has Never Driven</title>
      <dc:creator>Surya Polavarapu</dc:creator>
      <pubDate>Thu, 17 Sep 2026 11:45:32 +0000</pubDate>
      <link>https://dev.to/qapilot/your-app-has-had-a-side-door-since-2016-someone-new-just-walked-through-it-25om</link>
      <guid>https://dev.to/qapilot/your-app-has-had-a-side-door-since-2016-someone-new-just-walked-through-it-25om</guid>
      <description>&lt;p&gt;iOS 27 reached every compatible iPhone on 14 September, and most of the coverage has understandably been about Siri - the new architecture, the conversational mode, the access to personal context. Underneath that consumer story is a change in who can reach into your app, and most development and testing teams haven't caught up with it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The side doors are not new&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The UI is the storefront: browse, add to cart, check out, in that order. Apple has been opening side doors into that shop for a decade.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;SiriKit (2016)&lt;/strong&gt; was a voice side door, but only for a few Apple-approved jobs: send a message, request a ride, start a workout, pay someone. Uber did not have to invent a general “Siri API.” It implemented “book a ride,” and Siri knew how to ask for pickup and destination. A person could complete a core action without opening the app. That is already a second interface.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Shortcuts (2018)&lt;/strong&gt; was a recipe side door. A user, or your team, could save a sequence: “log this workout,” “order my usual,” “set Do Not Disturb and open Maps.” Tapping the shortcut, or saying “Hey Siri, run Morning,” ran those steps without walking the screens. QA rarely treated Shortcuts as a first-class surface, but customers were already using the app that way.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;App Intents (2022)&lt;/strong&gt; was Apple replacing those one-off side doors with a catalog of actions the system can call: Siri, Spotlight search, the Action Button, widgets, Shortcuts. “Create event,” “play this playlist,” “show my order.” Same idea as publishing a short list of APIs, except the callers are Apple’s system features instead of a website.&lt;/p&gt;

&lt;p&gt;So the surface is old. What arrived this year is a far more capable visitor using it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What changed is the visitor&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Siri AI doesn't need the ten phrases you published. It reads the catalogue, looks at what's on screen and at personal context, forms a plan from a sentence, and calls actions in whatever order that plan requires.&lt;/p&gt;

&lt;p&gt;Apple has been promising this visitor since WWDC 2024, where personal context, onscreen awareness and App Intents-powered in-app actions were announced together. The features were officially delayed in March 2025, slipped through that year and into early 2026, and landed on phones in September. The long gap matters here, because it means many teams filed App Intents under "did that in 2022" and stopped thinking about it. Three things are true now that weren't then.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Discovery flipped.&lt;/strong&gt; Previously a user had to know a Shortcut existed or say a phrase you'd published. Now the assistant finds the action. Anything in the catalogue is in play — including intents someone added years ago for a Shortcuts integration and nobody has looked at since.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Sequence is no longer your design&lt;/strong&gt;. A Shortcut runs the order you wrote. A screen flow only offers the next legal step. An assistant composing "move lunch, tell the attendees, book a car" calls whatever functions it decides it needs, in combinations no screen ever permitted. Every invariant a team relies on because "the user can't get there from here" needs rechecking.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Absence became a product problem&lt;/strong&gt;. In 2022, skipping App Intents made you weaker in Shortcuts and the app still worked. Apple's documentation now describes SiriKit, Intents and IntentsUI as providing legacy support for existing interactions and points developers to App Intents for modern integration. SiriKit still covers its old domains; it does not carry you onto the new surface. Users will ask Siri to do the thing, Siri will do it in a competitor's app, and nothing will appear in your crash reports.&lt;/p&gt;

&lt;p&gt;Google made the same move this year. Android 17 expanded AppFunctions, described in the release announcement as contributing an app's capabilities as orchestratable tools for Android MCP, the on-device equivalent of the Model Context Protocol. MCP is how agents call tools on servers; Google has pointed the same idea at the apps installed on a phone. Gemini integration is still in private preview with trusted testers, so Android teams have more runway — but two platforms converged on one pattern inside a single cycle. That's why 2026 is the story and 2022 wasn't.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why this lands on QA&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;An App Intent or an AppFunction is a function signature: typed parameters, entity types it accepts and returns, discoverability settings, and a policy governing what authentication is required before it runs. Nothing a UI test depends on is present on that path — no screen to read, no element to tap, no navigation sequence quietly establishing state along the way.&lt;/p&gt;

&lt;p&gt;Beyond the ordering problem above, three properties make this hard to verify.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Parameter values arrive from an interpreter&lt;/strong&gt;. A UI constrains its own input: a date picker only emits a valid date, a dropdown only emits a member of a known set. An intent parameter is populated by a model reading a sentence, which makes "next Friday," spoken by someone in a timezone the app was never tested in, a live input to a function whose date picker never had to handle it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Authentication and confirmation moved off the screen.&lt;/strong&gt; When the action executes outside your UI, so does the moment where the user agrees to it. Apple exposes settings that govern this, and getting them wrong doesn't fail loudly — it means something happens the user never clearly consented to, a defect that surfaces in a review rather than in CI.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The caller changes without your code changing.&lt;/strong&gt; This one has no precedent. A UI test pins a contract between your code and a human whose behaviour is stable. An intent's caller is a model updated on the platform's schedule. The same function, with the same tests green, can start being invoked differently after an OS update you didn't ship.&lt;/p&gt;

&lt;p&gt;The tooling exists. Its scope is the issue.&lt;/p&gt;

&lt;p&gt;Worth being precise, because the gap isn't an absence of tools. Apple shipped App Intents Testing alongside iOS 27 — an XCTest framework that runs intents, entities, enums and queries out of process, the way Siri and Shortcuts perform them, with type-erased APIs letting a test reference an intent by name and set its parameters without linking against the app target. It covers onscreen context through view annotations. On Android, adb shell cmd app_function list-app-functions enumerates what a package registers, execute-app-function invokes one with a JSON parameter string, and the AppFunctions Testing Agent goes further, letting you observe behaviour in a conversational flow.&lt;/p&gt;

&lt;p&gt;These are good tools and anyone publishing intents should be using them. What they verify is that a function does what it claims when called. That layer is well served.&lt;/p&gt;

&lt;p&gt;What remains unverified is the system the function now sits inside: whether a model read an ambiguous utterance the way you expected, whether an agent composing across three apps called your functions in an order your data model survives, whether any of that held after the platform updated the assistant underneath you. Those are properties of an interaction rather than of a function, and the discipline for testing them hasn't formed yet. Security teams recognised the shape early — tooling that inventories published intents and audits what they expose appeared quickly, because a new caller with access to an app's data and actions reads immediately as a threat model worth mapping. The quality equivalent is further behind.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Where a team can start&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Inventory first. List every intent or function the app publishes, and record its parameters, its authentication policy, and what data it can reach. That list is usually longer than expected, for the reason above: intents accumulate, and the ones added for Shortcuts in 2022 are now exposed to a caller nobody anticipated.&lt;/p&gt;

&lt;p&gt;Then use the platform tools for what they're good at, and be explicit about what sits outside them. Boundary cases on every parameter. Invocation from states the UI cannot produce. Confirmation behaviour when the app isn't in the foreground. Behaviour when the underlying data has changed between the agent reading it and acting on it. Past that, a team is making judgement calls without a safety net — and knowing that is better than assuming a green suite covers it.&lt;/p&gt;

&lt;p&gt;The doors have been there for years. What's new is that something on the other side can now read the whole catalogue and decide for itself which ones to open.&lt;/p&gt;

&lt;p&gt;We've spent years at &lt;a href="https://qapilot.io/" rel="noopener noreferrer"&gt;QApilot&lt;/a&gt; building tests that describe a goal rather than a sequence of taps, because the surface underneath keeps moving. An assistant calling your app is a similar problem arriving from a new direction and needs to be addressed.&lt;/p&gt;

</description>
      <category>ios</category>
      <category>ai</category>
      <category>mobile</category>
      <category>testing</category>
    </item>
    <item>
      <title>AI Test Generation for Mobile Apps Looks Great in Demos. Here Is Why It Decays in Production.</title>
      <dc:creator>Surendranath Reddy Jillella</dc:creator>
      <pubDate>Thu, 10 Sep 2026 11:58:33 +0000</pubDate>
      <link>https://dev.to/qapilot/ai-test-generation-for-mobile-apps-looks-great-in-demos-here-is-why-it-decays-in-production-5cfo</link>
      <guid>https://dev.to/qapilot/ai-test-generation-for-mobile-apps-looks-great-in-demos-here-is-why-it-decays-in-production-5cfo</guid>
      <description>&lt;p&gt;I have been in developer tooling long enough to have watched the same cycle repeat: a new capability arrives, it looks genuinely impressive in controlled conditions, teams adopt it at scale, and then six months later the results are underwhelming, and nobody quite knows why.&lt;/p&gt;

&lt;p&gt;AI test generation for mobile apps is currently in the impressive-demo phase. The question worth asking now, before the disappointment phase, is: what breaks when this hits a real production codebase?&lt;/p&gt;

&lt;p&gt;The answer has a name. It is called constraint decay. And it is not being talked about enough in the mobile testing conversation.&lt;/p&gt;




&lt;h2&gt;
  
  
  AI Is Changing Mobile Test Generation
&lt;/h2&gt;

&lt;p&gt;The shift is real and measurable. Mobile teams are increasingly using large language models to generate test cases directly from source code, user stories, or UI recordings. A bunch of tools now offer AI-assisted generation as a core feature.&lt;/p&gt;

&lt;p&gt;The promise is straightforward: point an AI at your codebase or your screen recordings, and it generates test cases. Teams that used to spend three weeks writing an Appium test suite can now get a first draft in hours.&lt;/p&gt;

&lt;p&gt;For greenfield screens with simple logic, this works well. For a login screen with a text field and a submit button, any capable LLM will generate reasonable tests quickly. The output looks comprehensive. Coverage numbers climb. Teams ship more tests than they wrote by hand.&lt;/p&gt;

&lt;p&gt;This is where the problem starts.&lt;/p&gt;




&lt;h2&gt;
  
  
  What the Current Conversation Is Missing
&lt;/h2&gt;

&lt;p&gt;Most discussions about AI test generation for mobile focus on two things: how fast you can generate tests, and how well self-healing handles UI changes. Both matter. But there is a third problem that almost nobody in the mobile testing space is naming directly.&lt;/p&gt;

&lt;p&gt;AI test generation tools are evaluated and marketed under conditions that do not resemble your actual app.&lt;/p&gt;

&lt;p&gt;The screens used in demos are simple. The apps used in case studies are well-documented, architecturally clean, and purpose-built for the demonstration. Your payment flow that involves three third-party SDKs, a backend session token, biometric authentication on iOS, back-stack handling differences on Android, and a compliance requirement from your legal team three months ago is a fundamentally different target.&lt;/p&gt;

&lt;p&gt;When real structural constraints are present, AI performance on code generation tasks drops substantially. That is not a hypothesis. It is the finding of a 2025 research paper that should be required reading for anyone building or buying AI testing tooling.&lt;/p&gt;




&lt;h2&gt;
  
  
  Constraint Decay: What the Research Actually Says
&lt;/h2&gt;

&lt;p&gt;A May 2026 &lt;a href="https://arxiv.org/abs/2605.06445" rel="noopener noreferrer"&gt;paper&lt;/a&gt; published on arXiv (arXiv:2605.06445) studied how LLM coding agents perform across increasing levels of structural constraint. The researchers ran evaluations across 80 greenfield generation tasks and 20 feature-implementation tasks spanning eight web frameworks, measuring performance at four constraint levels.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;L0 (unconstrained):&lt;/strong&gt; The agent has full architectural freedom. It can use any framework, any structure, any pattern it chooses.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;L1 (basic framework specified):&lt;/strong&gt; A framework is specified. The agent still has broad flexibility within it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;L2 (API contracts added):&lt;/strong&gt; Data contracts and API shapes are specified. The agent must conform to existing interfaces.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;L3 (fully constrained):&lt;/strong&gt; Framework, API contracts, ORM, and data layer are all specified. The agent must operate within a fully defined structural environment.&lt;/p&gt;

&lt;p&gt;At L0, top models exceeded 85% assertion pass rate. By L3, average performance had dropped 30 percentage points. The relative loss was 40% of baseline performance. The worst-performing configuration dropped 45 percentage points, losing 62% of its L0 score.&lt;/p&gt;

&lt;p&gt;The researchers named this phenomenon &lt;strong&gt;constraint decay&lt;/strong&gt;: as &lt;a href="https://usewire.io/blog/constraint-decay-structural-rules-break-ai-coding-agents/" rel="noopener noreferrer"&gt;structural requirements accumulate&lt;/a&gt;, agent performance declines substantially.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Assumption: The constraint decay paper measures coding agent performance on backend generation tasks, not test generation specifically. The extrapolation to test generation is logical given that test generation under real constraints (business rules, architecture, platform specifics) faces the same structural complexity problem, but this has not been formally studied under the same experimental design. The directional argument holds; the exact percentages would differ.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  What This Looks Like in Mobile Testing
&lt;/h3&gt;

&lt;p&gt;The L0 to L3 mapping translates directly to mobile test generation:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;L0 (demo conditions):&lt;/strong&gt; Generate tests for a login screen with an email field and a password field. The AI knows nothing about your architecture and has full freedom. It produces reasonable coverage of basic flows.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;L3 (your actual app):&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Generate tests for your checkout flow that must account for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Session tokens from your auth service that expire after 15 minutes of inactivity&lt;/li&gt;
&lt;li&gt;Biometric authentication on iOS 17 and above, with a PIN fallback below that version&lt;/li&gt;
&lt;li&gt;Android back-stack behaviour that differs between the checkout and payment confirmation screens&lt;/li&gt;
&lt;li&gt;A third-party payment SDK that behaves differently when the user has saved cards vs. first-time entry&lt;/li&gt;
&lt;li&gt;A promotional discount engine that applies different rules based on user segment&lt;/li&gt;
&lt;li&gt;A compliance requirement that prevents storing card details in local state&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;An AI given the codebase alone cannot infer most of this from source files. The session timeout is a backend configuration. The iOS version cutoff is a product decision. The Android back-stack behavior is a known edge case from a production incident six months ago. The promotional rules live in a database, not in the app code. The compliance requirement is a document in your legal team's folder.&lt;/p&gt;

&lt;p&gt;At L3, the AI is not generating the wrong tests because it is a bad model. It is generating the wrong tests because it does not have the context to know what the right tests are. The constraints are real, and they are not in the codebase.&lt;/p&gt;




&lt;h2&gt;
  
  
  How to Manage Constraint Decay in Practice
&lt;/h2&gt;

&lt;p&gt;Constraint decay is not a reason to avoid AI test generation. It is a reason to be deliberate about how you apply it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Give AI bounded context, not the full codebase.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Dumping an entire mobile codebase into a prompt and asking for test generation is the L0 approach applied to an L3 problem. The model will produce tests that reflect the structure of the code it can see, not the business logic that lives outside it.&lt;/p&gt;

&lt;p&gt;Instead: scope each generation request to a specific module, a specific user flow, or a specific change in a pull request. The tighter the scope, the closer the model gets to the actual constraints.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Refresh tests with the context that triggered the code change.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A test suite is only as fresh as its understanding of why the code is the way it is. When a developer changes the checkout flow because of a compliance update, the AI generating tests for that diff needs to know the compliance context, not just the code diff.&lt;/p&gt;

&lt;p&gt;Without that context, the regenerated tests will cover the code change correctly but miss the intent behind it. Six months of small changes like this without context refresh is how a test suite becomes structurally correct and functionally wrong.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Use mutation testing to detect when generated tests have decayed.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;AI-generated tests look syntactically correct even when they have stopped catching real regressions. Mutation testing, which introduces deliberate small bugs and checks whether your tests catch them, surfaces this decay without requiring a production incident.&lt;/p&gt;

&lt;p&gt;If your mutation score is falling while your test count is rising, constraint decay has already arrived.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Part AI Cannot Do: Deciding What to Test
&lt;/h2&gt;

&lt;p&gt;Here is the argument that the research points to but does not state directly.&lt;/p&gt;

&lt;p&gt;AI does not know your app's priority hierarchy. It does not know that the payment confirmation screen is ten times more important than the profile settings screen. It does not know that the offline mode failure on Android was your most-reported bug last quarter. It does not know that your highest-revenue user segment uses an older device running a specific OS version that has a known rendering quirk.&lt;/p&gt;

&lt;p&gt;None of this is in the codebase. All of it should be in the test strategy.&lt;/p&gt;

&lt;p&gt;When teams hand test generation entirely to AI without a priority layer, they get tests that reflect code structure rather than business risk. The checkout flow and the account deletion flow may receive the same test coverage weight, because from the code's perspective they are similar in complexity. From the business's perspective, they are not remotely comparable.&lt;/p&gt;

&lt;p&gt;This decay compounds over time. As the app evolves, AI-generated tests without human priority context drift toward testing implementation details rather than user outcomes. The tests stay syntactically valid. They pass. They just stop catching the failures that matter.&lt;/p&gt;

&lt;p&gt;The role of the human in AI-assisted mobile test generation is not to review every generated test line by line. It is to supply the priority layer that the AI cannot infer from source code:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Which flows are revenue-critical&lt;/li&gt;
&lt;li&gt;Which user segments have platform-specific behaviour that must be covered&lt;/li&gt;
&lt;li&gt;Which failures have caused production incidents and therefore warrant regression tests specifically written to prevent recurrence&lt;/li&gt;
&lt;li&gt;Which upcoming feature changes are high-risk enough to warrant hand-written scenario tests rather than AI-generated coverage&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;With that priority layer in place, AI generation becomes significantly more useful. The model operates within a bounded, well-specified context rather than trying to infer what matters from code structure alone.&lt;/p&gt;

&lt;h3&gt;
  
  
  Tools Worth Knowing
&lt;/h3&gt;

&lt;p&gt;Several tools have made genuine progress on bringing human context into AI test generation for mobile:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://qapilot.io/" rel="noopener noreferrer"&gt;QApilot&lt;/a&gt;&lt;/strong&gt; takes a codeless approach that keeps a human in the authoring loop by design. Test creation is still human-directed, with AI assisting rather than replacing.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Maestro&lt;/strong&gt; has moved toward declarative, intent-driven test authoring that integrates with AI generation through its MCP interface. The declarative format makes it easier to specify what a test is trying to validate, not just what steps to execute.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Kobiton&lt;/strong&gt; generates Appium scripts from recordings and supports cross-platform porting. More useful for teams with existing manual test flows they want to automate than for greenfield AI generation.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;testRigor&lt;/strong&gt; explicitly supports human-in-the-loop review on AI-generated tests and is designed around natural language test authoring that keeps the intent visible and reviewable.&lt;/p&gt;

&lt;p&gt;None of these fully solve the constraint decay problem. They each address parts of it. The gap that remains across all of them is the priority and business context layer, which currently requires the human to supply explicitly rather than inferring from the codebase.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Assumption: The tool descriptions above are based on publicly available information as of mid-2026. Tool capabilities in this space change rapidly. Verify current feature sets before making purchasing decisions.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  The Practical Starting Point
&lt;/h2&gt;

&lt;p&gt;If you are using AI test generation for a mobile app today, three things are worth doing before you generate another test:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Map your high-risk flows before prompting.&lt;/strong&gt; Write down the ten user journeys where a failure would hurt your users or your business the most. Feed that list into your generation prompts as explicit priority context. This is the difference between L0 and L3 generation.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Scope generation to change, not to coverage.&lt;/strong&gt; AI test generation produces the most value when it is scoped to what just changed in the codebase, with the context of why that change was made. Full-suite generation from a complete codebase is the least constrained and least accurate application of the technology.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Treat the first run as a draft, not a suite.&lt;/strong&gt; AI-generated tests are a starting point. Someone who understands the app needs to review whether the generated tests are covering what the business actually cares about, not just what the code happens to implement.&lt;/p&gt;

&lt;p&gt;The goal is not to remove humans from mobile test generation. The goal is to remove humans from the parts of mobile test generation that do not require human judgment, and preserve them for the parts that do.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Deciding what to test requires human judgment. Writing the test for a decision already made is increasingly something AI can do well.&lt;/strong&gt;&lt;/p&gt;




&lt;p&gt;P.S. - I am Surendranath, Head of AI at QApilot. &lt;/p&gt;

</description>
      <category>testing</category>
      <category>mobile</category>
      <category>ai</category>
      <category>testautomation</category>
    </item>
    <item>
      <title>Liquid Glass Is Here: Testing Considerations for Developers and Quality Engineers</title>
      <dc:creator>Surya Polavarapu</dc:creator>
      <pubDate>Thu, 03 Sep 2026 11:12:57 +0000</pubDate>
      <link>https://dev.to/qapilot/liquid-glass-is-here-testing-considerations-for-developers-and-quality-engineers-mm9</link>
      <guid>https://dev.to/qapilot/liquid-glass-is-here-testing-considerations-for-developers-and-quality-engineers-mm9</guid>
      <description>&lt;p&gt;Liquid Glass is Apple's new design language announced at WWDC 2025 &amp;amp; shipped with iOS 26. Apple calls it their "broadest software design update ever" - the most significant visual overhaul since iOS 7 moved from skeuomorphism to flat design in 2013. &lt;/p&gt;

&lt;p&gt;All UI elements like tab bars, buttons, switches, sliders - are now translucent and dynamic. They mimic real glass: they refract light, reflect their surroundings, and change appearance based on what's underneath them. Scroll a page and the navigation bar shifts in real time based on the content beneath it. The same button can look completely different against a dark wallpaper vs a light one.&lt;br&gt;
&amp;nbsp;&lt;br&gt;
&lt;strong&gt;What happened when it reached real devices?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;In beta builds, users reported a lot of functional rather than purely aesthetic problems: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Notifications on the lock screen were barely visible against transparent background. The Control Centre blended into whatever was behind it, making toggles hard to find&lt;/li&gt;
&lt;li&gt;Navigation became unpredictable: Safari's forward button appears and disappears depending on context, search bars moved, and back buttons sometimes vanished entirely.&lt;/li&gt;
&lt;li&gt;Touch targets got smaller and more crowded - tab bars were squeezed, spacing reduced&lt;/li&gt;
&lt;li&gt;Contrast was insufficient for anyone with even mild vision difficulties - many users immediately turned on "Reduce Transparency" and "Increase Contrast" in accessibility settings just to make their phones usable
 &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The Nielsen Norman Group published a detailed analysis in March 2026 that was unusually pointed for a publication that typically stays measured: the interface is restless, less predictable, less legible, and constantly pulling focus rather than supporting seamless access to content. They specifically called out that Apple has crowded and shrunk touch targets, seemingly tossing out the long-standing guideline of at least 0.4cm between targets and 1cm × 1cm tap areas.&lt;br&gt;
&amp;nbsp;&lt;br&gt;
Apple eventually responded in iOS 26.1 beta 4 by introducing a "Tinted" setting that tones down the transparency - a soft reversal of one of its most disputed visual decisions. The community largely received this as an acknowledgement that the initial implementation went too far.&lt;br&gt;
&amp;nbsp;&lt;br&gt;
&lt;strong&gt;The Mandate&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Apple understood that a change this large needed a runway. So when iOS 26 shipped, they built an opt-out into Xcode, but requires all iOS apps to fully support the Liquid Glass design system by September 2026. &lt;br&gt;
This isn't optional. The iOS 27 beta, released at WWDC June 2026, confirms that &lt;em&gt;UIDesignRequiresCompatibility&lt;/em&gt; , the flag teams used to opt out of Liquid Glass - is ignored when building with the iOS 27 SDK. Teams that used this flag to defer the migration now have regressions hidden in their code that QA never considered. Those regressions will all surface simultaneously when they adopt the new SDK.&lt;br&gt;
&amp;nbsp;&lt;br&gt;
&lt;strong&gt;Critical Considerations&lt;/strong&gt;&lt;br&gt;
&amp;nbsp;&lt;br&gt;
The most important action for any team still using the compatibility flag is to remove the flag, build against the iOS 26 SDK, run the app on a physical device, and do a full regression pass now - before Xcode 27 is made mandatory, before a bug fix release forces the issue. &lt;br&gt;
Visual testing breaks down. Tools comparing pixel to pixel will flag everything during regression and the actual failures would get buried in the noise. Liquid Glass elements render differently depending on what's behind them - wallpaper, content, dark vs light mode, even time of day in some cases. There is no stable baseline to compare against. The same screen, in the same device can produce a different visual output on every run. Pixel-diffing tools flag everything as a regression.&lt;br&gt;
&amp;nbsp;&lt;br&gt;
Touch target testing becomes necessary. The NN/g piece documents that Apple went against its own guidelines on tap target sizing. For apps adapting to Liquid Glass, elements that previously passed accessibility and tap-size checks may no longer. Every interactive element in a migrated app needs re-verification - not just against design specs but against real device behaviour.&lt;br&gt;
&amp;nbsp;&lt;br&gt;
The hidden regression problem. Teams that deferred Liquid Glass via the compatibility flag now have untested code paths. The single most important action for these teams: remove the compatibility flag, build with Xcode 26 against a physical iOS 26 device, and run a full regression pass - discover the regressions at your own pace rather than under Xcode 27 deadline pressure. Most haven't done this yet.&lt;br&gt;
&amp;nbsp;&lt;br&gt;
&lt;strong&gt;What testing against Liquid Glass actually requires&lt;/strong&gt;&lt;br&gt;
&amp;nbsp;&lt;br&gt;
When Liquid Glass migration shifts the position of a tab bar item, reformats a navigation element, or resizes a button, test steps that relied on the previous element location or identifier fail. Not because the feature broke but because the anchor the test was using no longer sits in the same place. Many elements shifting simultaneously, across many screens, where the alternative is manually triaging and rewriting every broken test step by hand.&lt;br&gt;
&amp;nbsp;&lt;br&gt;
At &lt;a href="https://qapilot.io/" rel="noopener noreferrer"&gt;QApilot&lt;/a&gt;, our AI native system works through a resolution hierarchy - accessibility identifiers, relative positioning, visible text, and a vision-based fallback that identifies the element the way a human tester would: by what it looks like and where it sits in the flow. The healed step is flagged for review before the fix persists in the system - the team sees what changed and approves it.&lt;br&gt;
&amp;nbsp;&lt;br&gt;
Our Auto Bug Finder surfaces accessibility gaps per screen during Crawler execution - contrast issues, missing labels, elements that fail WCAG checks - precisely the category of failure Liquid Glass migration is most likely to introduce.&lt;br&gt;
&amp;nbsp;&lt;br&gt;
Liquid Glass shipped with real performance issues on older devices - early builds showed sluggish rendering and elevated GPU load that Apple progressively resolved through subsequent updates. An app migrating to Liquid Glass today still carries that risk, particularly on devices outside the latest hardware generation. QApilot captures CPU, memory, battery, and rendering metrics during test execution - surfacing performance regressions as part of the same run that validates functional behaviour.&lt;br&gt;
&amp;nbsp;&lt;br&gt;
The September 2026 deadline and the Xcode 27 SDK mandate are arriving in the same window. For any team planning a release in the next twelve months, the question of whether their app has been tested against Liquid Glass is worth asking now.&lt;/p&gt;

</description>
      <category>ios</category>
      <category>ai</category>
      <category>mobile</category>
      <category>automation</category>
    </item>
    <item>
      <title>Flaky Tests Persist Because Everyone Is Ignoring Them Rationally</title>
      <dc:creator>Surendranath Reddy Jillella</dc:creator>
      <pubDate>Thu, 27 Aug 2026 12:40:13 +0000</pubDate>
      <link>https://dev.to/qapilot/flaky-tests-persist-because-everyone-is-ignoring-them-rationally-4m4h</link>
      <guid>https://dev.to/qapilot/flaky-tests-persist-because-everyone-is-ignoring-them-rationally-4m4h</guid>
      <description>&lt;p&gt;You have done everything right.&lt;/p&gt;

&lt;p&gt;You made the economic case for automation and got the investment approved. You distributed quality checks across the SDLC instead of piling them at the end. You replaced pyramid thinking with risk-weighted coverage. You stopped reporting a coverage percentage that was lying to you.&lt;/p&gt;

&lt;p&gt;Six months later, your engineers have started ignoring test failures.&lt;/p&gt;

&lt;p&gt;Not because they are careless. Because ignoring test failures became the rational choice. This article is about how that happens, why it happens to teams that know better, and why it is the final form of Test Debt.&lt;/p&gt;




&lt;h2&gt;
  
  
  What is flakiness?
&lt;/h2&gt;

&lt;p&gt;A flaky test is a test that fails intermittently without any change to the code it covers. It sometimes passes and sometimes fails, with no consistent pattern. The most common root causes are timing issues in async operations, test-order dependencies, shared mutable state, and coupling to external services.&lt;/p&gt;

&lt;p&gt;All of these are fixable. The fixable nature of the problem is not what makes it interesting. What makes it interesting is that teams fix very little of it, and teams with strong engineers who care about quality fix very little of it.&lt;/p&gt;

&lt;p&gt;The reason is not the technical difficulty.&lt;/p&gt;




&lt;h2&gt;
  
  
  The scale
&lt;/h2&gt;

&lt;p&gt;The numbers are worth stating clearly, because they establish what is actually at stake here:&lt;/p&gt;

&lt;p&gt;At &lt;a href="https://testing.googleblog.com/2016/05/flaky-tests-at-google-and-how-we.html" rel="noopener noreferrer"&gt;Google&lt;/a&gt;, approximately 16% of tests show some form of flakiness, and 84% of transitions from passing to failing involve a flaky test rather than a genuine regression. &lt;/p&gt;

&lt;p&gt;At &lt;a href="https://devblogs.microsoft.com/engineering-at-microsoft/improving-developer-productivity-via-flaky-test-management/" rel="noopener noreferrer"&gt;Microsoft&lt;/a&gt;, roughly 25% of test failures in large-scale CI systems are caused by flakiness, not actual code defects. The average time a developer spends per flaky test investigation: 30 minutes, before determining it was not a real failure.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.atlassian.com/blog/how-we-build/taming-test-flakiness-how-we-built-a-scalable-tool-to-detect-and-manage-flaky-tests" rel="noopener noreferrer"&gt;Atlassian&lt;/a&gt; estimated 150,000 developer hours per year consumed by flaky test investigation before they built automated detection tooling. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://getautonoma.com/blog/flaky-tests-ci-cd-engineering-cost" rel="noopener noreferrer"&gt;Slack's&lt;/a&gt; mobile test failure rate reached 56.76% before they intervened. More than half of all test failures were noise.&lt;/p&gt;

&lt;p&gt;These are not teams with poor engineering culture. They are among the best-resourced and most technically sophisticated organisations in the industry.&lt;/p&gt;




&lt;h2&gt;
  
  
  &lt;a href="https://arxiv.org/pdf/2203.00483" rel="noopener noreferrer"&gt;The rational inaction problem&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;Here is the core insight this article is built around: flaky tests are the only common engineering quality problem where every person in the chain responds correctly given their local information, and the outcome is still catastrophic.&lt;/p&gt;

&lt;p&gt;The developer who sees a test failure and hits retry is not being careless. In their experience, 85% of unexplained failures are environment issues, not regressions. Investigating would take 30 minutes and probably turn up a race condition in test infrastructure that is not their code. Retry is the rational choice.&lt;/p&gt;

&lt;p&gt;The QA engineer who logs the failure as "likely flaky, monitoring for pattern" is not dropping the ball. Without detection tooling, they cannot quickly distinguish a flaky failure from a real regression. Flagging and watching is the rational choice.&lt;/p&gt;

&lt;p&gt;The infrastructure team that says "it is a test quality issue, not infrastructure" is not deflecting. Flaky tests usually are a test quality issue. Declining scope is the rational choice.&lt;/p&gt;

&lt;p&gt;The engineering manager who does not put flakiness remediation on the sprint roadmap is not mismanaging. There are always user-facing features with higher business visibility. Flakiness does not appear in the product backlog with an owner or a deadline. Deferring is the rational choice.&lt;/p&gt;

&lt;p&gt;Nobody made a bad decision, but nobody fixed anything as well.&lt;/p&gt;

&lt;p&gt;This is the organisational failure mode this series has been describing in different forms since Article 1: costs that are invisible and diffuse; don't get addressed, because the people experiencing the cost in small increments are never the people with authority to fix it at the root.&lt;/p&gt;

&lt;p&gt;The rational inaction framing applies most clearly to mid-to-large engineering organisations with specialisation between roles. In small teams of fewer than 10 engineers, the same person often occupies multiple positions in the chain described above, which creates different incentive dynamics. The argument is strongest for teams of 20 or more where there is clear separation between developer, QA, infrastructure, and management roles.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why retry is the most expensive button in your CI interface
&lt;/h2&gt;

&lt;p&gt;When a team normalises retrying flaky tests, they make a subtle but load-bearing decision: test failures no longer reliably indicate real problems.&lt;/p&gt;

&lt;p&gt;That decision has a half-life. Once a team accepts that some failures are noise, the threshold for investigating failures drifts upward. A suite with 5% flakiness earns mild skepticism. A suite with 20% flakiness is treated as broken infrastructure. A suite with 50% flakiness is effectively ignored.&lt;/p&gt;

&lt;p&gt;Slack documented their mobile test failure rate reaching 56.76% before they intervened. At that point, the pipeline provides negative value. It adds latency to every deployment while producing no useful signal about regressions. You have paid to build, maintain, and run a suite that has become pure noise.&lt;/p&gt;

&lt;p&gt;The connection to Article 1 in this series is direct: Article 1 described the cost of having no test automation. A flaky, untrusted test suite is a different path to the same destination. You are making deployment decisions without a reliable test signal. The investment from Articles 1 through 4 has been eroded to zero. You are still paying 100% of the maintenance cost and receiving close to 0% of the coverage value.&lt;/p&gt;




&lt;h2&gt;
  
  
  The accountability structure that actually works
&lt;/h2&gt;

&lt;p&gt;The research on teams that have genuinely reduced flakiness shows a consistent pattern. The technical fixes vary by codebase and language. The organisational fix does not vary.&lt;/p&gt;

&lt;p&gt;At Microsoft, flaky tests are automatically assigned to the developer who owns the affected code. Not a team. A named individual. Developers with more than 10 open flaky test bugs have their PR merges blocked until they close them.&lt;/p&gt;

&lt;p&gt;At Atlassian, the approach combined three elements: automated detection (so no manual effort required to identify flaky tests), immediate quarantine (the test is removed from the blocking suite while investigation is open, keeping the pipeline trustworthy), and a named owner assigned within 24 hours of identification.&lt;/p&gt;

&lt;p&gt;Neither of these is primarily a technical solution. Both are accountability structures. They answer the question "whose problem is this?" with a specific name and a specific timeline, rather than leaving it as a shared responsibility that falls on no one.&lt;/p&gt;

&lt;p&gt;The &lt;a href="https://www.alphabin.co/blog/flaky-test-management-guide" rel="noopener noreferrer"&gt;practical framework&lt;/a&gt;, regardless of team size:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Make the number visible first.&lt;/strong&gt; Pull your CI data for the last 30 days. Find every test that failed and then passed on retry. Express that as a percentage of total runs. Most teams have never seen this number. It is the most important signal in their pipeline, and it is not surfaced by default in any major CI tool.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Quarantine, do not delete.&lt;/strong&gt; A flaky test usually covers real behaviour. Removing it from the blocking suite preserves pipeline signal while investigation is open. Deleting it removes coverage. These are different decisions with different consequences.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Assign by name, not by team.&lt;/strong&gt; "The QA team owns flakiness remediation" produces the same outcome as no ownership. "Jason owns these four tests, resolution expected by end of sprint" produces a different outcome.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Set a flakiness budget.&lt;/strong&gt; Define a maximum acceptable rate; 1% is a reasonable starting threshold, and treat it the same way you treat error rate or latency: a metric with a threshold, a dashboard, and a named owner who is accountable when it is breached.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Assumption: The 1% flakiness budget threshold is based on commonly cited industry practice rather than a formally derived number. Google and Microsoft operate internal flakiness thresholds but do not publicly document the specific percentages. Teams with very large test suites (10,000 or more tests) may need to calibrate differently based on acceptable investigation volume.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Why AI detection changes the equation but not the root cause
&lt;/h2&gt;

&lt;p&gt;Automated flaky test detection, including AI-based pattern recognition across CI runs, removes the manual work that was the excuse for not addressing flakiness earlier.&lt;/p&gt;

&lt;p&gt;Without detection tooling, asking a team to track flakiness is asking them to do manual bookkeeping across every CI run. Under any reasonable delivery pressure, this does not happen.&lt;/p&gt;

&lt;p&gt;With detection tooling, the identification is automatic. The question of whether to address it becomes purely organisational: who owns it and what happens if they do not.&lt;/p&gt;

&lt;p&gt;This is why detection tools are necessary but not sufficient. Teams that deploy automated flaky test detection without the accountability structure around it often end up with a dashboard showing 12% flakiness that nobody acts on. The bottleneck was never the detection. It was the ownership.&lt;/p&gt;




&lt;h2&gt;
  
  
  Closing the series
&lt;/h2&gt;

&lt;p&gt;This series started with a single argument: the cost of not investing in testing is real, measurable, and invisible until it is catastrophic.&lt;/p&gt;

&lt;p&gt;Each article has described a different mechanism through which testing investment either fails to materialise or silently loses value:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Article 1&lt;/strong&gt; - The investment does not happen because nobody has made the cost of not having it visible (Article 1).&lt;br&gt;
&lt;strong&gt;Article 2&lt;/strong&gt; - The investment happens too late in the cycle because the tooling for real-time quality feedback was not in place when the policy changed.&lt;br&gt;
&lt;strong&gt;Article 3&lt;/strong&gt; - The investment covers the wrong things because the pyramid model was a cost heuristic that got mistaken for a structural law. &lt;br&gt;
&lt;strong&gt;Article 4&lt;/strong&gt; - The investment measures the wrong things because a coverage gate creates the incentive to pass the gate rather than catch the bugs.&lt;br&gt;
And then in this article, we spoke about how the investment erodes silently because flakiness is everyone's problem in a diffused sense and nobody's problem in an accountable sense.&lt;/p&gt;

&lt;p&gt;The through-line is not tooling. The through-line is that each of these problems persists because the cost is invisible and the accountability is diffused. The moment you make the cost visible and assign the accountability to a specific person, the problem becomes tractable. Not easy, not fast, but tractable.&lt;/p&gt;

&lt;p&gt;Article 3 ended with the observation that deciding what is risky is still a human judgment. Every article in this series has made a version of that same point. The investment decision is human. The timing decision is human. The prioritisation decision is human. The measurement decision is human. The accountability decision is human.&lt;/p&gt;

&lt;p&gt;The tools have never been the bottleneck.&lt;/p&gt;

&lt;p&gt;What we are trying to do at &lt;a href="https://qapilot.io/" rel="noopener noreferrer"&gt;QApilot&lt;/a&gt; is collapse the gap between 'the cost exists' and 'someone sees it and can act on it.' That is true for coverage gaps, for flakiness, for untested risk paths. The tooling is there. The visibility is what has been missing.&lt;/p&gt;

</description>
      <category>testing</category>
      <category>engineering</category>
      <category>leadership</category>
      <category>devops</category>
    </item>
    <item>
      <title>Why Hitting Your Coverage Target Is Making Your Tests Worse</title>
      <dc:creator>Surendranath Reddy Jillella</dc:creator>
      <pubDate>Fri, 21 Aug 2026 06:04:26 +0000</pubDate>
      <link>https://dev.to/qapilot/why-hitting-your-coverage-target-is-making-your-tests-worse-3c2o</link>
      <guid>https://dev.to/qapilot/why-hitting-your-coverage-target-is-making-your-tests-worse-3c2o</guid>
      <description>&lt;p&gt;I had 87% coverage, and we still broke the billing flow on launch day.&lt;/p&gt;

&lt;p&gt;Not because of a gap in the percentage. Because 87% was covering the wrong things. The tests were written to pass a gate, not to catch a failure.&lt;/p&gt;

&lt;p&gt;That is a more common story than most teams admit. And the reason it keeps happening is not that engineers are careless. It is that the incentive structure you created made it the rational outcome.&lt;/p&gt;




&lt;h2&gt;
  
  
  The series checkpoint
&lt;/h2&gt;

&lt;p&gt;The first three articles in this series built the investment case for testing and then dismantled the received wisdom about how to execute it. We've made the economic argument for automation. We've restructured when quality checks happen across the SDLC. We've replaced the pyramid model with something shaped by risk rather than by code hierarchy.&lt;/p&gt;

&lt;p&gt;Now, when someone asks: how do you know if it is working?&lt;/p&gt;

&lt;p&gt;The answer most teams give is their coverage percentage. This article is about why that answer is structurally broken, and why fixing it is a management decision before it is a tooling decision.&lt;/p&gt;




&lt;h2&gt;
  
  
  What coverage percentage actually measures
&lt;/h2&gt;

&lt;p&gt;Coverage percentage tracks which lines of your code were executed during a test run. If a line ran, it counts as covered.&lt;/p&gt;

&lt;p&gt;That is the complete definition.&lt;/p&gt;

&lt;p&gt;It does not measure whether the test asserted anything meaningful about that line. It does not measure whether both branches of a conditional were exercised. It does not measure whether the specific inputs that cause failures were ever tried. A test that calls a payment function and checks &lt;code&gt;assert response is not None&lt;/code&gt; covers the same lines as a test that validates the transaction ID, amount, currency, error code, and retry behaviour. The coverage tool treats them identically.&lt;/p&gt;

&lt;p&gt;The research on this is unambiguous. A 2017 study by &lt;a href="https://www.researchgate.net/publication/319655487_Code_Coverage_and_Postrelease_Defects_A_Large-Scale_Study_on_Open_Source_Projects" rel="noopener noreferrer"&gt;Kochhar et al.&lt;/a&gt; examined the correlation between code coverage and actual bug rates across 100 large open-source Java projects. The finding: the coverage of existing test suites has an insignificant correlation with the number of bugs found after release. &lt;a href="https://www.researchgate.net/publication/266656203_Coverage_is_not_strongly_correlated_with_test_suite_effectiveness" rel="noopener noreferrer"&gt;Inozemtseva and Holmes&lt;/a&gt; found separately that line coverage is the metric that correlates &lt;em&gt;least&lt;/em&gt; with real defect detection compared to other available options.&lt;/p&gt;

&lt;p&gt;You are using the most popular quality metric in software engineering. It is also the least predictive of actual quality.&lt;/p&gt;




&lt;h2&gt;
  
  
  Goodhart's Law in your CI pipeline
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://www.researchgate.net/publication/253797490_Goodhart's_Law_Its_Origins_Meaning_and_Implications_for_Monetary_Policy" rel="noopener noreferrer"&gt;Goodhart's Law&lt;/a&gt; comes from economics: when a measure becomes a target, it ceases to be a good measure. The principle describes what happens when you attach consequences to a proxy metric instead of to the underlying goal it was meant to represent.&lt;/p&gt;

&lt;p&gt;Coverage percentage is a proxy metric. The underlying goal is: tests that catch bugs before production. When you make the proxy metric a gate, teams optimise for the proxy, not the goal. The badge turns green. The risk does not go down.&lt;/p&gt;

&lt;p&gt;This is not a character flaw. It is a predictable response to an incentive you designed. Under delivery pressure, engineers do the rational thing: they hit the number using the fastest available path.&lt;/p&gt;




&lt;h2&gt;
  
  
  How the gaming plays out
&lt;/h2&gt;

&lt;p&gt;The fastest path to coverage percentage is testing happy paths. User submits form successfully. API returns expected response. Data saves to the database. These scenarios are easy to construct, execute quickly, and each one covers a high line count because they touch the main execution path.&lt;/p&gt;

&lt;p&gt;What does not get covered:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Error handling paths run on exception conditions that are tedious to construct in tests. Retry logic, fallback behaviour, and timeout handling live in branches that require specific setup. These are also, as a direct consequence, the places where the most consequential bugs hide.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Boundary conditions require generating test inputs at the edges of valid ranges, null states, empty strings, Unicode characters, and maximum lengths. Each of these covers almost the same lines as a single typical input but requires separate test construction. Under time pressure, one test covers the line.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Conditional branches show as "covered" once either branch executes. A function with a condition that checks user role, applied to admin and guest differently, can show as fully covered if only one role ever runs the test. The other branch remains untested with no coverage signal.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The outcome is a suite at 85% coverage where the well-tested parts are tested three times over, and the failure-prone parts have one shallow test each. Teams with high line coverage but low integration validation have been observed producing more than double the production incidents of teams with lower but more balanced coverage.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Assumption: The claim that coverage-gamed suites produce higher production incident rates than lower but risk-balanced suites is based on observed patterns in industry case studies, not a controlled experiment. The "double production incidents" figure comes from analysis of specific teams and may not generalize uniformly. It should be read as directional evidence of the problem rather than a precise multiplier.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  What this costs you
&lt;/h2&gt;

&lt;p&gt;In the first article in this series, the framing was: the cost of not investing in testing is invisible until it is catastrophic.&lt;/p&gt;

&lt;p&gt;Coverage gaming creates a specific variant of that problem. You are paying the full maintenance cost of a test suite that is not delivering the risk reduction you paid for. Every test written to hit a percentage rather than catch a bug still needs to be maintained when the code changes, still runs in every CI cycle, and still occupies space in the mental model of everyone who reads the suite.&lt;/p&gt;

&lt;p&gt;You have made the right investment decision. A portion of that investment is funding theatre rather than protection. The cost shows up in the budget. The corresponding value does not show up in production stability.&lt;/p&gt;




&lt;h2&gt;
  
  
  A better measurement
&lt;/h2&gt;

&lt;p&gt;The honest version of coverage is mutation score. Mutation testing introduces deliberate small bugs into your code: flipping a comparison operator, removing a conditional check, changing a return value. Your test suite runs against each mutated version. If the tests catch the mutation (they fail), the mutation is killed. If the tests pass despite the code being wrong, the mutation survives.&lt;/p&gt;

&lt;p&gt;A mutation score of 80% means your tests caught 80% of introduced bugs. That is a direct claim about defect detection, not about line execution. These are different claims.&lt;/p&gt;

&lt;p&gt;A &lt;a href="https://dev.to/jghiringhelli/the-ai-reported-931-coverage-it-was-34-290k"&gt;real case&lt;/a&gt; documented on dev.to reported 93% line coverage that turned out to be a 34% mutation score. The team had been reporting a green badge on a suite where two-thirds of the introduced bugs would have survived.&lt;/p&gt;

&lt;p&gt;Mutation testing is computationally expensive, which is a real constraint. The practical approach: do not run it across the entire codebase. Run it on the paths where failure is most costly, specifically the risk-weighted paths identified in the work from Article 3. Use line coverage as a floor (it tells you about completely untested code) and mutation score as the signal for whether the tests you have are actually doing anything on the critical paths.&lt;/p&gt;

&lt;p&gt;Branch coverage is a useful intermediate step. It is stricter than statement coverage, it surfaces the conditional gaps that line coverage misses, and most existing coverage tools already support it. Switching from statement to branch coverage as your CI gate raises the bar without requiring new tooling.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Assumption: Mutation testing adoption is growing but not mainstream as of mid-2026. Frameworks exist for most major languages (Stryker for JavaScript and TypeScript, PITest for Java, mutmut for Python) but are not a default feature in major CI platforms. The claim that most teams do not use mutation testing is based on tooling adoption patterns, not a formal survey.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  The behavioural fix
&lt;/h2&gt;

&lt;p&gt;The tool change matters less than the conversation change.&lt;/p&gt;

&lt;p&gt;If coverage percentage is a pass/fail gate in your pipeline, you have created the incentive to game it. The alternative is not removing coverage tracking. It is removing the gate behaviour.&lt;/p&gt;

&lt;p&gt;Report coverage as a trend, not a threshold. A team whose coverage has been at 78% for six months is in a fundamentally different position than one whose coverage dropped from 88% to 68% after a feature push. The trend carries information. The snapshot at a point in time does not.&lt;/p&gt;

&lt;p&gt;Pair that with the question you actually want answered: are the highest-risk paths in this codebase meaningfully tested? That question does not have a single percentage answer. It requires looking at branch coverage on critical paths and, where the stakes are highest, mutation score. Neither of these is hard to implement. They are just not the defaults.&lt;/p&gt;




&lt;p&gt;PS: I am Surendranath, leading the AI team at &lt;a href="https://qapilot.io/" rel="noopener noreferrer"&gt;QApilot&lt;/a&gt;, and we are solving problems specific to mobile app testing through our AI-native product. Reach out if you are interested to try it out!&lt;/p&gt;

</description>
      <category>testing</category>
      <category>coverage</category>
      <category>testautomation</category>
      <category>devops</category>
    </item>
    <item>
      <title>Google upgraded Android's UI language, can test automation keep up?</title>
      <dc:creator>Surya Polavarapu</dc:creator>
      <pubDate>Thu, 13 Aug 2026 10:48:42 +0000</pubDate>
      <link>https://dev.to/qapilot/google-upgraded-androids-ui-language-can-test-automation-keep-up-3ic2</link>
      <guid>https://dev.to/qapilot/google-upgraded-androids-ui-language-can-test-automation-keep-up-3ic2</guid>
      <description>&lt;p&gt;On May 19, Google made it official: Jetpack Compose is now the only way forward for Android UI. The older approach of writing screens in XML, the markup language that defined app development for over a decade, is now placed in maintenance mode. No new feature launches, bug fixes only. &lt;/p&gt;

&lt;p&gt;For most developers, this landed as good news. Compose is genuinely better to build with: less code, faster iteration, cleaner architecture. So most of the attention since has been on what developers gained and barely anything on what happens to the test suites!&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What actually changed under the hood&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;To understand why this matters for quality teams, it helps to know what automation tools have always relied on.&lt;/p&gt;

&lt;p&gt;Android testing frameworks typically found elements on screen using identifiers: resource IDs, class names, positions in a structure called the View hierarchy. Every button, text field, and screen element in an XML-based app lives in that hierarchy. Your test says "&lt;em&gt;find the element with ID btn_checkout&lt;/em&gt;" and the framework finds it.&lt;/p&gt;

&lt;p&gt;Compose doesn't produce Views. It produces a semantics tree - a structure closer to how a screen reader navigates an app than to how traditional layouts worked. These are two different models.&lt;/p&gt;

&lt;p&gt;Appium can interact with Compose, but not in the way most teams currently have it set up. It requires switching to the UIAutomator2 driver specifically - not the Espresso driver - and it only works if developers have explicitly added testTag modifiers to Compose elements and enabled testTagsAsResourceId in the app configuration. Those are deliberate, manual steps that someone on the engineering side has to take for every element that needs to be reachable by a test. &lt;/p&gt;

&lt;p&gt;Most teams migrating existing apps to Compose haven't done this. The result is a test written to find &lt;em&gt;btn_checkout&lt;/em&gt; by its resource ID will silently fail on a Compose screen - not because the button disappeared, but because the element it was looking for no longer exists in that form. Tests stop finding elements and the suite starts failing. So when teams are quickly rewriting UI code, they are quietly invalidating years of recorded test steps, locators, and automation logic&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The same problem we solved for Flutter is now arriving for the Android native ecosystem&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This isn't a new class of problem. Flutter introduced a version of it years ago, and it was worse. Flutter renders entirely on its own canvas, bypassing the native UI framework completely. UIAutomator2 sees nothing. XCUITest sees nothing. There is no View tree, and no semantics tree accessible through standard drivers. The only reliable paths are Flutter Driver - which only works on debug builds, not release ones.&lt;/p&gt;

&lt;p&gt;At &lt;a href="https://qapilot.io/" rel="noopener noreferrer"&gt;QApilot&lt;/a&gt;, we built our proprietary layer using advanced methods like OCR &amp;amp; computer vision precisely because standard locators find nothing. No custom framework setup or coordinate scripts - the test finds the element visually, the way a human would. &lt;/p&gt;

&lt;p&gt;Compose is a step along the same spectrum. The accessibility layer is still reachable if the app is configured correctly. The problem is that "configured correctly" now requires deliberate choices from the development team that most aren't making yet.&lt;/p&gt;

&lt;p&gt;The abstraction layer we've built normalises Native, Flutter, React Native, and WebView apps into a single locator and action interface. Compose First is another reason why that kind of abstraction matters. The specific UI framework your team chose to build in shouldn't be a variable that determines whether your test suite survives a platform update. &lt;/p&gt;

&lt;p&gt;It's worth watching how quickly Android teams migrate. Compose adoption has been steady but slower than Google would prefer - partly because legacy codebases are large, and partly because migration comes with invisible costs that don't show up in a developer experience comparison.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>mobile</category>
      <category>automation</category>
      <category>testing</category>
    </item>
    <item>
      <title>The End of the Testing Pyramid: What Replaces It in the AI Era</title>
      <dc:creator>Surendranath Reddy Jillella</dc:creator>
      <pubDate>Thu, 06 Aug 2026 08:01:20 +0000</pubDate>
      <link>https://dev.to/qapilot/the-end-of-the-testing-pyramid-what-replaces-it-in-the-ai-era-3b46</link>
      <guid>https://dev.to/qapilot/the-end-of-the-testing-pyramid-what-replaces-it-in-the-ai-era-3b46</guid>
      <description>&lt;p&gt;We have discussed the cost of no automation and reasoned "when to test". &lt;br&gt;
This doesn't automatically solve the test coverage question - the QA teams are swamped enough, and if you ask them to test across the SDLC, that can only lead to testing what is easy or whatever is quick.&lt;/p&gt;

&lt;p&gt;Hence the next question - &lt;strong&gt;What tests to prioritise?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The testing pyramid was and is gospel, still, and every sprint planning meeting with a QA team included some version of: "we need more unit tests at the base, fewer E2E tests at the top."&lt;/p&gt;

&lt;p&gt;The pyramid made complete sense - for its time. I'm not sure it makes sense anymore.&lt;/p&gt;




&lt;h2&gt;
  
  
  What the Pyramid Was Actually Solving
&lt;/h2&gt;

&lt;p&gt;Mike Cohn introduced the testing pyramid in &lt;a href="https://dl.acm.org/doi/10.5555/1667109" rel="noopener noreferrer"&gt;&lt;em&gt;Succeeding with Agile&lt;/em&gt; (2009)&lt;/a&gt;, though the concept was sketched out earlier around 2003–04. His original framing had three layers: unit tests at the base, service/integration tests in the middle, UI tests at the top. Martin Fowler popularised it further on his &lt;a href="https://martinfowler.com/articles/practical-test-pyramid.html" rel="noopener noreferrer"&gt;blog&lt;/a&gt;, and it became a de facto standard across the industry.&lt;/p&gt;

&lt;p&gt;The underlying logic was about &lt;strong&gt;cost&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Unit tests&lt;/strong&gt;: cheap to write, fast to run, easy to pinpoint failures&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Integration tests&lt;/strong&gt;: moderate cost, slower, harder to isolate failures&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;E2E/UI tests&lt;/strong&gt;: expensive to write, slow to run, brittle - and when they fail, you often spend an hour figuring out &lt;em&gt;what&lt;/em&gt; actually broke&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So the pyramid was really a cost-optimisation heuristic: do more of the cheap thing, less of the expensive thing - sensible advice when humans are writing every test by hand.&lt;/p&gt;




&lt;h2&gt;
  
  
  The AI Problem with This Logic
&lt;/h2&gt;

&lt;p&gt;Here's what changes when AI can generate test cases: the marginal cost of writing the 100th test approaches zero.&lt;/p&gt;

&lt;p&gt;Generating 10 unit tests costs me roughly the same as generating 100. The input cost - my time writing a prompt, reviewing output - is largely fixed, not variable.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Assumption: This assumes LLM output quality is "good enough to review and merge" without significant rework. Current research (&lt;a href="https://www.mdpi.com/2504-4990/7/3/97" rel="noopener noreferrer"&gt;MDPI, 2025&lt;/a&gt;) shows LLMs are effective for test generation on well-scoped, lower-complexity functions, but accuracy drops for complex, stateful logic. So this cost collapse is real for &lt;em&gt;breadth&lt;/em&gt; of coverage, less so for &lt;em&gt;depth&lt;/em&gt; in complex systems.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;If writing isn't the bottleneck anymore, the pyramid's rationale starts to crack. But there's a catch.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Cost That Didn't Collapse: Maintenance
&lt;/h2&gt;

&lt;p&gt;Writing tests and maintaining tests are two different problems. AI hasn't fully solved the second one yet.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://getautonoma.com/blog/cost-of-test-maintenance" rel="noopener noreferrer"&gt;Industry data&lt;/a&gt; suggests test maintenance consumes anywhere from &lt;strong&gt;30% to 50%&lt;/strong&gt; of a QA team's automation effort.&lt;/p&gt;

&lt;p&gt;That's not a pyramid problem; it's a maintenance problem. And it compounds fast when you generate tests faster than you can maintain them.&lt;/p&gt;

&lt;p&gt;If AI test generation significantly outpaces AI test maintenance and healing capabilities, teams could end up with larger, flakier suites than they started with. This is a genuine risk in 2026 - generation tools have matured faster than maintenance/healing tools. The balance matters.&lt;/p&gt;

&lt;p&gt;So the new model can't just be "generate everything." It has to be smarter about &lt;em&gt;what&lt;/em&gt; gets generated.&lt;/p&gt;




&lt;h2&gt;
  
  
  What Should Replace the Pyramid
&lt;/h2&gt;

&lt;p&gt;I've been thinking about this as &lt;strong&gt;risk-weighted coverage&lt;/strong&gt; rather than a structural pyramid. The question isn't "how many tests at each layer?" - it's "where does a failure hurt most, and am I covered there?"&lt;/p&gt;

&lt;p&gt;A few principles that seem to hold up:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Coverage by business risk, not code structure&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A payment-processing function with 60% unit coverage is riskier than a string formatter with 95% coverage. The pyramid doesn't capture this. A risk-weighted model does. The first question before generating any test should be: &lt;em&gt;what breaks the business if this fails?&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. The E2E tax is shrinking, not gone&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;E2E tests are still slow. They're still brittle when they fail. But AI-assisted generation makes writing them dramatically cheaper. The remaining cost is infrastructure and maintenance. &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Assumption: As AI-based self-healing for selectors and UI state matures, the E2E maintenance cost will fall meaningfully. This is directionally happening but isn't yet the default reality for most teams in 2026.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;3. A "testing mesh" over a rigid pyramid&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Rather than a strict hierarchy, think of tests as a mesh - overlapping coverage at multiple levels, weighted toward high-risk areas. Some paths get unit + integration + E2E coverage. Low-risk utility code gets unit only. The &lt;em&gt;shape&lt;/em&gt; is determined by risk analysis, not by a fixed ratio rule.&lt;/p&gt;




&lt;h2&gt;
  
  
  What This Means Practically
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;If you're maintaining a mature test suite:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Audit which E2E tests cover high-risk paths vs. low-risk happy paths. The latter are usually candidates for deletion or downgrade.&lt;/li&gt;
&lt;li&gt;Use AI to generate edge-case unit tests for your critical business logic - that's where current LLM-based generation adds the most value with the least maintenance overhead.&lt;/li&gt;
&lt;li&gt;Don't generate tests uniformly. Generate them where failure actually matters.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;If you're greenfielding:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Start with risk mapping before writing a single test. What breaks the business if it fails?&lt;/li&gt;
&lt;li&gt;Let AI fill coverage breadth; invest human effort in the tests for high-risk paths that require business context to assert correctly.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  The Real Question
&lt;/h2&gt;

&lt;p&gt;The pyramid isn't dead - it's become one valid shape among many. The right test distribution depends on your system's risk profile, not a universal rule.&lt;/p&gt;

&lt;p&gt;The harder question the AI era forces is: &lt;em&gt;who decides what's risky?&lt;/em&gt; And that's still a deeply human judgment. AI can generate tests for you, but it can't tell you what matters to your business unless you've told it.&lt;/p&gt;




&lt;p&gt;P.S. - I am Surendranath from &lt;a href="https://qapilot.io/" rel="noopener noreferrer"&gt;QApilot&lt;/a&gt; and this post is part the series &lt;em&gt;Test Debt&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>testautomation</category>
      <category>devops</category>
      <category>testmesh</category>
    </item>
    <item>
      <title>Shift-Left is Dead. Long Live Shift-Everywhere</title>
      <dc:creator>Surendranath Reddy Jillella</dc:creator>
      <pubDate>Thu, 30 Jul 2026 07:53:13 +0000</pubDate>
      <link>https://dev.to/qapilot/shift-left-is-dead-long-live-shift-everywhere-4lj6</link>
      <guid>https://dev.to/qapilot/shift-left-is-dead-long-live-shift-everywhere-4lj6</guid>
      <description>&lt;p&gt;Last week, I presented the cost of no testing - &lt;a href="https://dev.to/qapilot/the-hidden-cost-of-no-test-automation-a-back-of-napkin-calculation-ejo"&gt;Hidden cost of no test automation&lt;/a&gt;&lt;br&gt;
It is now clear that testing is essential, if not earlier. The next question that comes to mind is &lt;strong&gt;&lt;em&gt;When to test?&lt;/em&gt;&lt;/strong&gt; - Shift Left is an answer that many leadership mandates suggest.&lt;br&gt;
The practical interpretation of Shift-Left is simple - QA was going to write fewer tests, and developers were going to write more. The phrase was presented as a philosophy. It felt more like a headcount justification.&lt;/p&gt;

&lt;p&gt;That's not what Larry Smith meant when he coined the term.&lt;/p&gt;




&lt;h2&gt;
  
  
  What Shift-Left Actually Said
&lt;/h2&gt;

&lt;p&gt;Smith's article "&lt;a href="https://dl.acm.org/doi/10.5555/500399.500404" rel="noopener noreferrer"&gt;Shift-Left Testing&lt;/a&gt;" was published in &lt;em&gt;Dr. Dobb's Journal&lt;/em&gt; in September 2001. The observation was straightforward: on any project timeline, testing was always concentrated at the right side - near delivery. He proposed moving it left - closer to inception - to catch defects earlier and cheaper.&lt;/p&gt;

&lt;p&gt;The economics behind it were sound. IBM Systems Sciences Institute data (originally from 1981 internal training materials) showed bugs found after release cost 60–100x more to fix than bugs found during design. Even if those exact multipliers are contested - &lt;em&gt;&lt;a href="https://www.theregister.com/software/2021/07/22/everyone-cites-that-bugs-are-100x-more-expensive-to-fix-in-production-research-but-the-study-might-not-even-exist/1371906" rel="noopener noreferrer"&gt;The Register&lt;/a&gt;&lt;/em&gt; ran a worthwhile piece in 2021 questioning whether the original IBM study was ever a peer-reviewed paper - the directional finding has been consistently confirmed by &lt;a href="https://www.nist.gov/system/files/documents/director/planning/report02-3.pdf" rel="noopener noreferrer"&gt;NIST research&lt;/a&gt;, Capers Jones' analysis of 12,000+ projects, and anyone who has sat in a production incident war room at 2 am.&lt;/p&gt;

&lt;p&gt;The idea was right. The execution became something else.&lt;/p&gt;




&lt;h2&gt;
  
  
  What Shift-Left Became
&lt;/h2&gt;

&lt;p&gt;In practice, shift-left was operationalised as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Developers writing unit tests&lt;/strong&gt; they didn't always have the domain context to write well&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;CI gates nobody trusted&lt;/strong&gt; because flaky tests made failure signals into noise&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;QA "embedded" in scrum teams&lt;/strong&gt; without changing when or how testing actually happened&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Static analysis tools added to pipelines&lt;/strong&gt; that nobody read the output of&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The mandate to shift left didn't come with a corresponding shift in tools, time allocation, or context. It was process vocabulary layered on top of unchanged behavior.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Assumption: This characterization reflects the most common pattern of shift-left adoption - process-driven, without sufficient tooling change. It won't apply to every team. Organizations that genuinely restructured roles, tooling, and feedback loops saw real results. But the pattern of "shift-left = devs write more tests with no additional support" is widespread enough to be a recurring frustration in engineering retrospectives. If your team executed shift-left well, you're in the minority.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The original promise - catch bugs earlier - was only partially delivered, for most teams.&lt;/p&gt;




&lt;h2&gt;
  
  
  What's Actually Different Now
&lt;/h2&gt;

&lt;p&gt;The &lt;a href="https://medium.com/@yusufenes3494/according-to-the-developer-survey-2024-report-developers-spend-only-24-of-their-time-actually-c13c783cd86f" rel="noopener noreferrer"&gt;2024 Developer Survey&lt;/a&gt; found developers spend only &lt;strong&gt;24% of their time writing code&lt;/strong&gt;. The rest goes to debugging (roughly 41%), meetings, reviews, documentation, and operational work.&lt;/p&gt;

&lt;p&gt;That ratio is persistent and damning. A huge chunk of debugging time is spent on issues that better earlier feedback - not just earlier &lt;em&gt;testing&lt;/em&gt;, but earlier &lt;em&gt;signals&lt;/em&gt; - would have caught before they compounded.&lt;/p&gt;

&lt;p&gt;What AI tooling is changing, when it's actually embedded rather than bolted on, is making quality checks &lt;strong&gt;ambient&lt;/strong&gt; rather than phased:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;In the IDE&lt;/strong&gt;: Copilot-style tools flag issues as you type. Some generate test stubs inline for the function you just wrote.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;In the PR&lt;/strong&gt;: AI reviewers analyze diffs for missing edge cases, untested branches, and logic gaps - not just style and formatting.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;In CI&lt;/strong&gt;: AI-based test generation triggered on diff, targeting new and changed code specifically rather than running the full regression suite.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;In production&lt;/strong&gt;: Error monitoring that surfaces coverage gaps by tracing prod failures back to untested paths.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This isn't shift-left. It's &lt;strong&gt;shift-everywhere&lt;/strong&gt;. Quality isn't a phase you move earlier - it's a layer that runs in parallel with development at every stage.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Distinction That Matters
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Shift-left&lt;/strong&gt; was about &lt;em&gt;when&lt;/em&gt; in the SDLC to apply testing.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Shift-everywhere&lt;/strong&gt; is about &lt;em&gt;continuous presence&lt;/em&gt; of quality signals regardless of SDLC phase.&lt;/p&gt;

&lt;p&gt;A developer gets immediate feedback in their IDE. The same PR gets an AI review pass. The CI pipeline runs targeted tests on exactly the changed code. An alert the next day surfaces a production error and maps it back to a coverage gap.&lt;/p&gt;

&lt;p&gt;The SDLC doesn't stop being sequential - code still gets designed, written, reviewed, deployed. But quality signals are no longer tied to a single phase of that sequence.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Assumption: "Shift-everywhere" as described assumes a mature AI tooling stack. Most teams in 2026 have 1–2 of these layers, not all four. The full ambient quality model is where the industry is heading, but it's not the default state yet. I'd estimate fewer than 25% of teams have more than two of these layers genuinely integrated and trusted, based on the tooling adoption curves I've seen.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  What Hasn't Changed
&lt;/h2&gt;

&lt;p&gt;AI doesn't fix everything. A few things remain stubbornly manual:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Understanding what to assert.&lt;/strong&gt; Generating a test is easy. Knowing what the &lt;em&gt;correct behavior&lt;/em&gt; should be for a non-obvious edge case - one that depends on business rules, not just code logic - still requires a human who understands the domain.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Flaky tests.&lt;/strong&gt; AI can reduce new flakiness by generating more deterministic tests, but it doesn't automatically rehabilitate an existing flaky suite. That's still cleanup work.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Cross-service test strategy.&lt;/strong&gt; What to test across service boundaries, under real load, in failure scenarios - that's architectural thinking that LLMs don't consistently reason well about yet.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Practical Takeaway
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;If you're a developer&lt;/strong&gt;&lt;br&gt;
Shift-left was never the enemy. The enemy was treating it as a process change without a tooling change. The AI-era version of the same idea is more actionable because the tooling is actually there.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;If you're running an engineering or QA team&lt;/strong&gt;&lt;br&gt;
Stop thinking about &lt;em&gt;where&lt;/em&gt; in the pipeline quality lives. Start thinking about &lt;em&gt;how many stages have real-time quality feedback embedded&lt;/em&gt;. Count the stages where a developer gets an automated signal about quality within minutes of writing code. If the answer is one - probably CI - you have room to move.&lt;/p&gt;




&lt;p&gt;P.S.: This article is part of the &lt;em&gt;Test Debt&lt;/em&gt; series.&lt;br&gt;
About me - I lead the AI team at &lt;a href="https://qapilot.io/" rel="noopener noreferrer"&gt;QApilot&lt;/a&gt; - an AI-native mobile test automation company, and we build products to help you achieve the quality standards that your users demand.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>testing</category>
      <category>softwareengineering</category>
      <category>devops</category>
    </item>
    <item>
      <title>I Used to Hate App Updates. Then I Saw What Happens Behind the Screen</title>
      <dc:creator>Harini Mukesh</dc:creator>
      <pubDate>Mon, 27 Jul 2026 10:30:00 +0000</pubDate>
      <link>https://dev.to/qapilot/i-used-to-hate-app-updates-then-i-saw-what-happens-behind-the-screen-339b</link>
      <guid>https://dev.to/qapilot/i-used-to-hate-app-updates-then-i-saw-what-happens-behind-the-screen-339b</guid>
      <description>&lt;h2&gt;
  
  
  From "Ugh, Another Update?" to "Wait... There's So Much Behind This"
&lt;/h2&gt;

&lt;p&gt;A few months ago, if my phone showed &lt;strong&gt;"Update Available"&lt;/strong&gt; while I was in the middle of using an app, my first reaction was always the same.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;"Seriously? Right now?"&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Sometimes I'd postpone it. Other times I'd update it just because the notification wouldn't stop bothering me. Either way, I never thought much about it. As long as the app opened, did what I wanted, and didn't crash, I was happy.&lt;/p&gt;

&lt;p&gt;Like most people, I only noticed an app when something went wrong.&lt;/p&gt;

&lt;p&gt;If it was a free app and it kept crashing, I'd uninstall it and look for another alternative. There are plenty of apps that solve the same problem anyway.&lt;/p&gt;

&lt;p&gt;But paid apps were different.&lt;/p&gt;

&lt;p&gt;The moment I pay for a subscription, my expectations go up. During the free trial, I suddenly become a tester without realizing it. I click every button, explore every feature, and try to decide if it's worth my money. If something feels broken, I'm probably not renewing.&lt;/p&gt;

&lt;p&gt;Looking back, I realized I only cared about the final experience. I never wondered how many people worked on the app, how many times it was tested, or how much effort went into making everything feel smooth.&lt;/p&gt;

&lt;p&gt;That changed when I got the chance to explore a mobile testing platform.&lt;/p&gt;

&lt;p&gt;Until then, I genuinely believed testing meant opening the app, clicking a few buttons, making sure nothing crashed, and calling it a day.&lt;/p&gt;

&lt;p&gt;I couldn't have been more wrong.&lt;/p&gt;

&lt;p&gt;The deeper I explored, the more I realized that every screen, every button, every animation, every permission popup, and every update notification has an incredible amount of planning and testing behind it.&lt;/p&gt;

&lt;p&gt;It felt like discovering an invisible world that had always existed behind every app I use but one I had never noticed.&lt;/p&gt;

&lt;h2&gt;
  
  
  I Thought Testing Was Just Clicking Buttons... I Couldn't Have Been More Wrong
&lt;/h2&gt;

&lt;p&gt;If someone had asked me what software testing meant before this experience, I would've probably said,&lt;/p&gt;

&lt;p&gt;&lt;em&gt;"Open the app, click a few buttons, make sure everything works, and you're done."&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Turns out, that's probably the easiest part.&lt;/p&gt;

&lt;p&gt;What surprised me most was that testing isn't about checking whether an app works when everything goes according to plan. It's about making sure it still works when things don't.&lt;/p&gt;

&lt;p&gt;What happens if someone denies a permission request?&lt;/p&gt;

&lt;p&gt;What if the internet disconnects during a payment?&lt;/p&gt;

&lt;p&gt;What if the user rotates the phone halfway through filling a form?&lt;/p&gt;

&lt;p&gt;What if a notification interrupts the app?&lt;/p&gt;

&lt;p&gt;What if everything works perfectly on one device but breaks on another?&lt;/p&gt;

&lt;p&gt;These aren't rare situations, they're everyday user behaviour. And someone has to think about every one of them before the app reaches us.&lt;/p&gt;

&lt;p&gt;That's when I came across terms like &lt;strong&gt;functional testing&lt;/strong&gt;, where every feature is verified to work as expected, and &lt;strong&gt;exploratory testing&lt;/strong&gt;, where testers intentionally explore an app the way real users would, looking for unexpected issues instead of following a fixed script.&lt;/p&gt;

&lt;p&gt;I also learned about &lt;strong&gt;cross-platform testing&lt;/strong&gt; making sure the same app behaves consistently across Android, iOS, different screen sizes, and different OS versions. Something as simple as a button can behave differently depending on the device.&lt;/p&gt;

&lt;p&gt;Then there are &lt;strong&gt;edge cases&lt;/strong&gt; those unusual situations that don't happen often but can completely break the user experience if they're ignored.&lt;/p&gt;

&lt;p&gt;The more I learned, the more I understood one thing.&lt;/p&gt;

&lt;p&gt;Good testing is invisible.&lt;/p&gt;

&lt;p&gt;When everything works perfectly, nobody thinks about the hundreds of scenarios that were tested beforehand. We simply assume the app is supposed to work that way.&lt;/p&gt;

&lt;p&gt;One line stayed with me throughout this journey:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Testing isn't about proving that an app works. It's about trying to discover where it doesn't.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Because it's far better for a tester to find those problems than for thousands of users to discover them after launch.&lt;/p&gt;

&lt;h2&gt;
  
  
  One Bug Doesn't Mean One Person Fixes It
&lt;/h2&gt;

&lt;p&gt;Another thing I completely misunderstood was what happens after a bug is found.&lt;/p&gt;

&lt;p&gt;I always assumed the issue simply went back to &lt;strong&gt;"the developer."&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A button isn't working?&lt;/p&gt;

&lt;p&gt;The developer fixes it.&lt;/p&gt;

&lt;p&gt;The app crashes?&lt;/p&gt;

&lt;p&gt;The developer fixes it.&lt;/p&gt;

&lt;p&gt;Simple.&lt;/p&gt;

&lt;p&gt;But that's not how software teams work. Imagine a tester finds multiple issues on a single login screen. The button colour doesn't match the design. The spacing is inconsistent. The login API returns the wrong error message. The keyboard hides the login button on a particular Android device. To me, that looked like one screen with four bugs.&lt;/p&gt;

&lt;p&gt;In reality, those issues belong to different teams.&lt;/p&gt;

&lt;p&gt;The UI or UX team handles visual inconsistencies like colours, spacing, typography, and layouts. Mobile developers focus on how the screen behaves. Backend engineers investigate API responses and business logic. Sometimes Android and iOS teams even work separately because the same feature can behave differently across platforms.&lt;/p&gt;

&lt;p&gt;That completely changed how I looked at testing.&lt;/p&gt;

&lt;p&gt;I realized it isn't just about finding bugs, it's about communicating them clearly so the right people can fix the right problems.&lt;/p&gt;

&lt;p&gt;One thing I found particularly interesting while exploring QApilot was how findings can be organized instead of being dumped into one long report. Visual issues can go to the design team, functional issues to developers, and backend-related findings to the engineers responsible for those services.&lt;/p&gt;

&lt;p&gt;That might sound like a small detail, but when multiple teams are working on the same product, structured reporting saves a lot of time and confusion.&lt;/p&gt;

&lt;p&gt;Before this experience, I thought testing ended once someone discovered a bug.&lt;/p&gt;

&lt;p&gt;Now I think that's where collaboration really begins.&lt;/p&gt;

&lt;p&gt;Behind every app we use are designers, developers, testers, product managers, and engineers, all working together to make something feel effortless for the rest of us.&lt;/p&gt;

&lt;p&gt;And honestly, that's something I had never appreciated until I looked behind the screen.&lt;/p&gt;

&lt;h2&gt;
  
  
  Exploring QApilot Made Me Think Differently About Testing
&lt;/h2&gt;

&lt;p&gt;By this point, I had stopped looking at testing as just another step before releasing an app. Instead, I started seeing it as something that builds confidence not just for the team creating the app, but for the people using it.&lt;/p&gt;

&lt;p&gt;That's when I spent more time exploring &lt;a href="https://qapilot.io/" rel="noopener noreferrer"&gt;QApilot&lt;/a&gt; itself.&lt;/p&gt;

&lt;p&gt;What I liked immediately was that I didn't need to be an experienced QA engineer to understand the platform. The interface felt simple enough to explore without constantly referring to documentation, which made learning much easier.&lt;/p&gt;

&lt;p&gt;The first feature that caught my attention was the &lt;a href="https://qapilot.io/product/autonomous-testing" rel="noopener noreferrer"&gt;&lt;strong&gt;Crawler&lt;/strong&gt;&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Initially, I thought it would simply click random buttons. But I soon realized its purpose was much more practical. It explores an app the way a curious user might, moving through different screens and uncovering user journeys you may not think of manually.&lt;/p&gt;

&lt;p&gt;Then came &lt;strong&gt;Record &amp;amp; Play&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;It made me think about how repetitive testing can become. Every new release often means repeating the same login flow, navigation, or validation steps. Instead of doing those tasks from scratch every single time, Record &amp;amp; Play allows testers to automate the repetitive parts and spend more time exploring new features and unexpected scenarios.&lt;/p&gt;

&lt;p&gt;The feature that stood out to me the most, though, was &lt;a href="https://qapilot.io/product/cowork" rel="noopener noreferrer"&gt;&lt;strong&gt;CoWork&lt;/strong&gt;&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Whenever people talk about AI, the conversation usually becomes, &lt;em&gt;"Will it replace people?"&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;CoWork gave me a different perspective.&lt;/p&gt;

&lt;p&gt;It felt less like AI replacing testers and more like AI working alongside them. It helps generate and organize test cases, while the tester still reviews, guides, and makes the final decisions. That balance made much more sense to me than expecting AI to handle everything on its own.&lt;/p&gt;

&lt;p&gt;Exploring these features made me realize that modern testing isn't just about finding bugs anymore. It's about making the entire testing process smarter, faster, and easier without taking people out of the equation.&lt;/p&gt;

&lt;h2&gt;
  
  
  If It Can Help a Vibe Coder, Imagine What It Can Do for QA Teams
&lt;/h2&gt;

&lt;p&gt;One thought kept coming back to me while I was learning all this.&lt;/p&gt;

&lt;p&gt;Building software has become easier than ever.&lt;/p&gt;

&lt;p&gt;Today, someone with an idea can use AI coding tools or vibe coding platforms to build a working app in days instead of months. That's incredible because it allows more people to bring their ideas to life.&lt;/p&gt;

&lt;p&gt;But building an app is only half the journey.&lt;/p&gt;

&lt;p&gt;Making sure it's reliable is something entirely different.&lt;/p&gt;

&lt;p&gt;Users don't care whether an app was written by an experienced engineer, a solo founder, or an AI coding assistant. They only care about one thing, it should work.&lt;/p&gt;

&lt;p&gt;If the app crashes during a payment, freezes during onboarding, or breaks on a particular device, most users won't wait for an explanation. They'll leave a poor review or move on to another app.&lt;/p&gt;

&lt;p&gt;That's where I started seeing the bigger value of testing.&lt;/p&gt;

&lt;p&gt;If I were building my first app today, I'd want to know whether the important user journeys worked before anyone downloaded it. I'd want someone or something to explore the app the way a real user would and point out issues I might have missed.&lt;/p&gt;

&lt;p&gt;That's exactly why tools like this make so much sense for startup founders and indie developers. They provide confidence before launch.&lt;/p&gt;

&lt;p&gt;And if they can simplify testing for someone with little experience, I can only imagine how much more useful they become for professional QA teams managing hundreds of test cases, multiple releases, and different devices every day.&lt;/p&gt;

&lt;p&gt;For me, that was the biggest takeaway.&lt;/p&gt;

&lt;p&gt;AI isn't replacing testing.&lt;/p&gt;

&lt;p&gt;It's helping people spend less time repeating the same work and more time solving the problems that still need human thinking.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Next Time My Phone Asks Me to Update...
&lt;/h2&gt;

&lt;p&gt;It's funny how quickly a perspective can change.&lt;/p&gt;

&lt;p&gt;A few months ago, an app update was just another interruption. I'd tap &lt;strong&gt;"Update Later"&lt;/strong&gt; and continue with whatever I was doing.&lt;/p&gt;

&lt;p&gt;Now, whenever I see that notification, I think about everything that probably happened before it reached my phone.&lt;/p&gt;

&lt;p&gt;Someone may have discovered a bug that only appeared on a particular device.&lt;/p&gt;

&lt;p&gt;Someone may have found an issue while testing a user flow that nobody expected.&lt;/p&gt;

&lt;p&gt;A designer, developer, tester, and product team may have worked together to fix it before millions of users ever noticed. Most of that work is completely invisible. And maybe that's the whole point. When an app works smoothly, we don't stop to appreciate the effort behind it. We simply expect it to work. This experience didn't turn me into a QA engineer. It did, however, turn me into a much more curious user.&lt;/p&gt;

&lt;p&gt;Now, whenever I open an app, I find myself wondering about the work happening behind the screen. How many scenarios were tested before this feature reached me? How many conversations happened before this button behaved exactly the way it should? How many problems were solved before I even had the chance to experience them? Those are questions I never would've asked a few months ago.&lt;/p&gt;

&lt;p&gt;The next time my phone asks me to install an update, I'll probably still wish it had chosen a better time.&lt;/p&gt;

&lt;p&gt;But instead of thinking,&lt;/p&gt;

&lt;p&gt;&lt;em&gt;"Why another update?"&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;I'll probably think,&lt;/p&gt;

&lt;p&gt;&lt;em&gt;"Someone found a problem before I did and they're making sure I never have to experience it."&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;As users, we only see the finished product.&lt;/p&gt;

&lt;p&gt;Behind every smooth experience is an enormous amount of invisible work.&lt;/p&gt;

&lt;p&gt;And after getting a glimpse of that world, I don't think I'll ever look at app updates or mobile apps the same way again.&lt;/p&gt;

</description>
      <category>testing</category>
      <category>mobile</category>
      <category>softwaredevelopment</category>
      <category>qa</category>
    </item>
    <item>
      <title>The Hidden Cost of No Test Automation: A Back-of-Napkin Calculation</title>
      <dc:creator>Surendranath Reddy Jillella</dc:creator>
      <pubDate>Thu, 23 Jul 2026 12:48:07 +0000</pubDate>
      <link>https://dev.to/qapilot/the-hidden-cost-of-no-test-automation-a-back-of-napkin-calculation-ejo</link>
      <guid>https://dev.to/qapilot/the-hidden-cost-of-no-test-automation-a-back-of-napkin-calculation-ejo</guid>
      <description>&lt;p&gt;Nobody cancels a sprint to do a testing ROI analysis. The cost of skipping test automation doesn't have a line item in your budget. It doesn't show up on a dashboard. It accumulates in the background - slower releases, developer burnout, customer-reported bugs - until something catastrophic makes it visible.&lt;/p&gt;

&lt;p&gt;I want to make it visible before that happens. Here's a calculation you can actually run for your team.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Math That Got Buried
&lt;/h2&gt;

&lt;p&gt;The most widely cited figure in software testing economics: &lt;strong&gt;bugs found in production cost 60–100x more to fix than bugs found during design&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;It traces back to IBM Systems Sciences Institute research, originally from 1981 internal training materials. The Register ran a 2021 piece questioning whether this ever existed as a peer-reviewed paper - a fair challenge. But the directional finding - that bugs get exponentially more expensive as they age through the SDLC - has been confirmed independently by:&lt;/p&gt;

&lt;p&gt;NIST's 2002 study on software quality infrastructure, which pegged software defects at &lt;strong&gt;$59.5 billion in annual cost to the US economy&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Capers Jones' research across 12,000+ projects, which consistently found similar multipliers&lt;/p&gt;

&lt;p&gt;BetterQA's analysis of SDLC-stage fix costs, which found production bugs run approximately &lt;strong&gt;30x&lt;/strong&gt; the cost of catching the same bug in development&lt;/p&gt;

&lt;p&gt;The exact multiplier is debatable. The direction is not.&lt;/p&gt;

&lt;p&gt;For this calculation, I'm using the conservative end.&lt;/p&gt;




&lt;h2&gt;
  
  
  Bug Cost by SDLC Stage
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Stage&lt;/th&gt;
&lt;th&gt;Relative Cost&lt;/th&gt;
&lt;th&gt;Example: $200 fix during development&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Design / requirements&lt;/td&gt;
&lt;td&gt;0.5x&lt;/td&gt;
&lt;td&gt;$100&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Development (caught by dev)&lt;/td&gt;
&lt;td&gt;1x&lt;/td&gt;
&lt;td&gt;$200&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;QA / testing phase&lt;/td&gt;
&lt;td&gt;5x&lt;/td&gt;
&lt;td&gt;$1,000&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Staging / UAT&lt;/td&gt;
&lt;td&gt;10x&lt;/td&gt;
&lt;td&gt;$2,000&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Production&lt;/td&gt;
&lt;td&gt;30x&lt;/td&gt;
&lt;td&gt;$6,000&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Assumption&lt;/strong&gt;: These multipliers use the conservative end of the cited range (IBM goes to 100x; I'm using 30x for production). Actual cost per bug varies enormously by system criticality, customer impact, and bug type. A cosmetic UI bug in production costs far less than a data corruption bug. These numbers are directional tools for making the case, not inputs for precise budgeting. Adjust the production multiplier up for customer-facing, data-sensitive, or regulated systems.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The $6,000 production cost is not just engineer debug hours. It includes: incident coordination, customer communication, potential data cleanup, postmortem time, and possible SLA penalties. Reputational cost is not included, because it's hard to quantify and easy to dismiss.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Manual Regression Tax
&lt;/h2&gt;

&lt;p&gt;If you have no test automation, you have manual regression. Here's what that actually costs.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Assumptions for this calculation:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Mid-size team: 15 engineers&lt;/li&gt;
&lt;li&gt;2-week sprint cycle (26 releases per year)&lt;/li&gt;
&lt;li&gt;1 QA engineer (or developer in QA rotation) running regression each cycle&lt;/li&gt;
&lt;li&gt;Loaded engineer cost: $120/hour&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Assumption&lt;/strong&gt;: $120/hr is a US-market estimate for a mid-level engineer including salary, benefits, and overhead. Adjust for your market and seniority. European teams might run $80–$100/hr; senior engineers in high-cost markets might run $180–$200/hr.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;A realistic 200-test manual suite:&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Activity&lt;/th&gt;
&lt;th&gt;Time per cycle&lt;/th&gt;
&lt;th&gt;Annual cost&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Test execution&lt;/td&gt;
&lt;td&gt;4 hours&lt;/td&gt;
&lt;td&gt;$12,480&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Triage of environment failures (not real bugs)&lt;/td&gt;
&lt;td&gt;1 hour&lt;/td&gt;
&lt;td&gt;$3,120&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Re-test after bug fixes&lt;/td&gt;
&lt;td&gt;3 hours&lt;/td&gt;
&lt;td&gt;$9,360&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Total&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;8 hours&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;$24,960&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;That's approximately &lt;strong&gt;$25,000/year in labour&lt;/strong&gt;, just to manually regression-test a 200-case suite on a 2-week cycle.&lt;/p&gt;

&lt;p&gt;This doesn't count:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Releases delayed because testing wasn't finished in time&lt;/li&gt;
&lt;li&gt;Bugs that escaped because the manual suite didn't cover edge cases&lt;/li&gt;
&lt;li&gt;The opportunity cost of that QA engineer's time not going toward exploratory or risk-based testing&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  The Release Confidence Tax
&lt;/h2&gt;

&lt;p&gt;This one is harder to put a number on, but arguably more expensive.&lt;/p&gt;

&lt;p&gt;When your team doesn't trust the test suite - or doesn't have one - release decisions turn conservative. Teams:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Ship less frequently ("let's batch this with next sprint to reduce risk")&lt;/li&gt;
&lt;li&gt;Batch changes, which paradoxically increases risk per release&lt;/li&gt;
&lt;li&gt;Proliferate feature flags as a crutch, adding operational complexity&lt;/li&gt;
&lt;li&gt;Hold informal war rooms before every major release
Developers already spend 41% of their time debugging, according to 2024 survey data. A non-trivial chunk of that is diagnosing issues that better test coverage would have caught before they merged.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Conservative framing: if better test automation saves even &lt;strong&gt;2 hours/week per developer&lt;/strong&gt; by reducing the time spent debugging regressions and environment issues, that's:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;2 hrs × 15 engineers × 50 weeks × $120/hr = $180,000/year
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That's a large number. Use it carefully - it's the upper bound of what's plausible, not a guarantee.&lt;/p&gt;




&lt;h2&gt;
  
  
  Run This for Your Team
&lt;/h2&gt;

&lt;p&gt;Here's the back-of-napkin formula:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Step 1: Manual regression labour
= (test cases) × (avg minutes per test / 60) × (releases/year) × (hourly rate)

Step 2: Bug escape cost
= (production bugs per quarter × 4) × (avg cost per production incident)
  [Estimate your cost per incident: engineering hours + customer impact time]

Step 3: Release velocity tax
= (avg days delayed per release) × (releases/year) × (daily cost of delay)
  [Daily cost of delay = revenue at risk + opportunity cost of unshipped features]

Total annual cost of no automation = Step 1 + Step 2 + Step 3
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For most teams, &lt;strong&gt;Step 2 alone&lt;/strong&gt; - the production bug escape cost - exceeds the full annual cost of building and maintaining a test automation suite.&lt;/p&gt;




&lt;h2&gt;
  
  
  What Automation Actually Costs
&lt;/h2&gt;

&lt;p&gt;The counterargument: "automation is expensive too." Fair. Here's the honest breakdown.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Initial setup (realistic, not optimistic):&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Item&lt;/th&gt;
&lt;th&gt;Estimate&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Framework selection and setup&lt;/td&gt;
&lt;td&gt;2–3 days&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Writing 200 automated tests&lt;/td&gt;
&lt;td&gt;3–4 engineer-weeks&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CI integration and pipeline config&lt;/td&gt;
&lt;td&gt;2–3 days&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Total initial investment&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;~4–5 engineer-weeks&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;At $120/hr loaded cost: &lt;strong&gt;~$19,200–$24,000 initial investment.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Annual maintenance:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Test maintenance consumes 30–50% of the initial build effort per year for a well-maintained suite.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Assumption&lt;/strong&gt;: Industry data shows maintenance consuming 30–80% of automation budget. The lower end (30–50%) applies to suites that are actively managed, not allowed to grow without pruning, and built on stable APIs rather than brittle UI selectors. If you're running a Selenium-heavy UI suite on a frequently changing frontend, you're likely on the higher end.&lt;br&gt;
&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Annual maintenance ≈ 30% × $22,000 = ~$6,600/year
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;5-year total cost of ownership:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Initial build:     $22,000
5 years maintain:  $33,000
Total:             $55,000
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Compare that to the &lt;strong&gt;$25,000/year manual regression cost&lt;/strong&gt;, compounded over 5 years: &lt;strong&gt;$125,000&lt;/strong&gt; - and that's before counting escaped bugs and delayed releases.&lt;/p&gt;

&lt;p&gt;The ROI case is straightforward. The real objection isn't cost. It's time: teams without automation are usually under delivery pressure and can't find the runway to invest. That's a legitimate constraint - but it's worth naming clearly, because "we can't afford it" and "we don't have time right now" have different solutions.&lt;/p&gt;




&lt;h2&gt;
  
  
  Where AI Changes the Math
&lt;/h2&gt;

&lt;p&gt;AI-based test generation shifts the cost curve at the margins. Here's honestly what it changes and what it doesn't.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What it reduces:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Initial authoring time.&lt;/strong&gt; Studies on LLM-assisted test generation show 50–70% reduction in test authoring time for well-scoped code. The "4–5 engineer-weeks to write 200 tests" shrinks, potentially to 1.5–2 weeks.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Edge case coverage.&lt;/strong&gt; LLMs generate negative cases, boundary values, and permutations that humans commonly skip under time pressure. The coverage you get for free is worth more than the authoring time saved.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Maintenance, partially.&lt;/strong&gt; Self-healing test features (adaptive locators, selector repair) reduce churn caused by UI changes. This is real but not total - tests that encode business logic assumptions still break when business logic changes.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;What it doesn't change:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You still need to understand what you're testing and why. AI generates tests; it doesn't understand your business rules.&lt;/li&gt;
&lt;li&gt;Flaky tests still require cleanup. Generating more tests on top of a flaky foundation makes things worse.&lt;/li&gt;
&lt;li&gt;The strategic decisions - what to test, at what level, with what priority - still require a human with context.
The fundamental ROI argument doesn't change with AI. It gets better: the initial investment drops, which makes the case even cleaner. But the math works either way.&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;P.S.: It's worth mentioning that I lead the AI team at &lt;a href="https://qapilot.io/" rel="noopener noreferrer"&gt;QApilot&lt;/a&gt; - an AI-native mobile test automation company. I might have a bias for more automation with AI, but when that bias is based on data, it's ok I guess.&lt;/p&gt;

</description>
      <category>testing</category>
      <category>devops</category>
      <category>automation</category>
      <category>engineering</category>
    </item>
    <item>
      <title>The Documentation Intern That Never Sleeps</title>
      <dc:creator>Harsh Chandgotia</dc:creator>
      <pubDate>Fri, 12 Jun 2026 12:41:02 +0000</pubDate>
      <link>https://dev.to/qapilot/the-documentation-intern-that-never-sleeps-1cmb</link>
      <guid>https://dev.to/qapilot/the-documentation-intern-that-never-sleeps-1cmb</guid>
      <description>&lt;p&gt;When I joined &lt;a href="https://qapilot.io/" rel="noopener noreferrer"&gt;QAPilot&lt;/a&gt;, I noticed something interesting.&lt;/p&gt;

&lt;p&gt;Some of the most experienced people on the team were spending hours every sprint on work that was important, but highly repetitive: tracking engineering changes ticket by ticket, and updating our GitBook pages to keep the user-facing documentation in sync.&lt;/p&gt;

&lt;p&gt;That meant reading through closed Jira tickets, figuring out which doc pages were affected, rewriting those pages, and drafting customer-facing release notes, every single sprint. The information needed for all of this already existed across Jira, GitLab, and GitBook. It just needed to be gathered, connected, and acted on.&lt;/p&gt;

&lt;p&gt;The more I looked at it, the more it felt like a workflow orchestration problem rather than an expertise problem. So I built an AI-powered pipeline to handle documentation impact analysis and regeneration, orchestrated through GitHub Actions, and designed around human review rather than blind automation,&lt;/p&gt;

&lt;h2&gt;
  
  
  The Shape of the Pipeline
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbxdncw83uphlrc3976zu.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbxdncw83uphlrc3976zu.png" alt="Pipeline" width="800" height="920"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Before getting into how each piece works, it's worth laying out the shape of the whole system, because everything below is really just a closer look at one part of this.&lt;/p&gt;

&lt;p&gt;First, the pipeline gathers everything relevant to the sprint, tickets, code changes, screenshots, and the current state of the docs, into a knowledge base. Second, it works out what that knowledge base actually means for the documentation: which pages are affected, and why. A person reviews that before anything gets written. Third, and only after that review, it regenerates the affected pages and drafts release notes, which go through one more round of review before anything is published.&lt;/p&gt;

&lt;p&gt;The same pattern repeats at every stage: plan first, act second, and put a person between the two.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 1: Building the Documentation Knowledge Base
&lt;/h2&gt;

&lt;p&gt;Before the system can decide what's out of date, it needs to know two things: what changed, and what the docs currently say. So the pipeline starts each run by assembling a knowledge base for the sprint, drawn from four sources, each answering a different question.&lt;/p&gt;

&lt;p&gt;From Jira, it pulls the sprint's tickets, what was supposed to change, in the team's own words. From GitLab, it optionally pulls the merge requests and commit diffs behind those tickets, what was actually built, which doesn't always match what was planned. From the tickets' attachments, it pulls screenshots and runs them through a vision-capable model to generate structured descriptions of what the feature actually looks like, which text alone often doesn't capture. And from GitBook, it pulls the entire existing documentation space, what's already written, so the system has something to compare against.&lt;/p&gt;

&lt;p&gt;That last one turned out to be more involved than it sounds. GitBook doesn't store its content as markdown, it stores it as a proprietary JSON node tree, essentially a deeply nested structure of typed blocks (headings, paragraphs, lists, code blocks, images, links) that its editor uses internally. To remove unnecessary noise, I built a recursive converter that walks the tree and reconstructs it as clean markdown, preserving structure like nested lists and embedded images along the way.&lt;/p&gt;

&lt;p&gt;It's also worth mentioning how the pipeline is able to access all these systems in the first place.&lt;/p&gt;

&lt;p&gt;Our GitLab instance is self-hosted behind the company VPN, which means it isn't reachable from the public internet. GitHub-hosted runners execute in GitHub's infrastructure, so they have no network path to internal services such as GitLab. As a result, any workflow that needed to fetch merge requests, commit diffs, or repository metadata would simply fail because those systems were inaccessible from the runner.&lt;/p&gt;

&lt;p&gt;To solve this, the entire workflow runs on a self-hosted EC2 runner deployed within the company's internal network. GitHub allows external machines to register themselves as self-hosted runners by installing the GitHub Actions runner agent and linking it to a repository or organization. Once registered, the EC2 instance appears as an available runner inside GitHub Actions and can receive workflow jobs just like GitHub-hosted runners.&lt;/p&gt;

&lt;p&gt;Because the runner operates inside the same trusted environment as GitLab, and other internal services, it can securely communicate with them without requiring additional exposure to the public internet.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 2: The Mapping Layer
&lt;/h2&gt;

&lt;p&gt;With the knowledge base in place, here's the part of the pipeline that does the real thinking. The most interesting part of this system isn't writing documentation, it's figuring out what needs to change in the first place.&lt;/p&gt;

&lt;p&gt;Before any page gets rewritten, the pipeline runs an impact analysis. For every ticket in the sprint, it asks the model to reason through a few questions: which product feature did this change touch? Is the change visible to users, or purely internal? Which existing documentation pages describe that feature? And given that, should one of those pages be updated, or does this need a brand-new page?&lt;/p&gt;

&lt;p&gt;Take a hypothetical example: a ticket adds a two-factor authentication step to the password reset flow. The model recognizes this as touching account security and being user-facing, finds that the "Resetting Your Password" page already describes the old flow and needs updating, and flags that a new "Setting Up Two-Factor Authentication" page might be needed if one doesn't already exist.&lt;/p&gt;

&lt;p&gt;The output of this stage isn't documentation, it's a structured map: this ticket affects these pages, for these reasons. Separating this from generation, as its own explicit stage, made a bigger difference to output quality than any prompt tweak I tried. It gives the system a plan to inspect before it writes anything, and it gives reviewers something concrete to check: a proposed relationship between a change and a page, with reasoning attached, rather than a wall of regenerated text to proofread.&lt;/p&gt;

&lt;h2&gt;
  
  
  Human Review Before Generation
&lt;/h2&gt;

&lt;p&gt;Once the mapping is ready, the pipeline opens a GitHub Issue listing every proposed ticket-to-page relationship, along with the model's reasoning for each. A reviewer, usually the PM who ran the sprint, reads through it. Most relationships are correct as-is. When one isn't, the reviewer doesn't need a special interface: they leave a comment with a small JSON snippet describing the correction.&lt;/p&gt;

&lt;p&gt;The pipeline picks this up on its next run and folds it into the approved mapping.&lt;/p&gt;

&lt;p&gt;No database. No custom review portal. No separate workflow engine. GitHub Issues became the system of record for the entire mapping step, which sounds almost too simple, but it meant reviewers were working in a tool they already used every day, and every decision and correction was automatically logged and auditable.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 3: Controlled Document Regeneration
&lt;/h2&gt;

&lt;p&gt;With the mapping approved, the second workflow runs, and this is where the actual writing happens. For each page flagged as needing an update, the system pulls the current markdown and asks the model to revise only the sections relevant to the change, with explicit instructions to leave everything else untouched. This matters for a few reasons: it keeps the diff small and reviewable, it stops the model from quietly rewriting an unrelated paragraph in a slightly different voice, and it means a reviewer's job is "does this new section make sense" rather than "re-read the whole page for unintended changes."&lt;/p&gt;

&lt;p&gt;For pages that don't exist yet, like our hypothetical "Setting Up Two-Factor Authentication" page, the model writes from scratch, but it's given a handful of existing pages from the same section as style references, so the new page reads like it belongs in the same documentation set rather than something a different author wrote.&lt;/p&gt;

&lt;p&gt;Alongside the updated pages, the workflow also drafts customer-facing release notes for statuspage. These are deliberately a separate output from the documentation updates, because the audience is different: docs explain how a feature works in full, while release notes are a short, plain-language summary of what changed for someone using the product. Both the updated pages and the release notes are posted back to GitHub for one final round of review before anything goes live.&lt;/p&gt;

&lt;h2&gt;
  
  
  Keeping It Fast Enough to Run Every Sprint
&lt;/h2&gt;

&lt;p&gt;One more piece is worth mentioning, because it's what makes running this every sprint practical rather than painful.&lt;/p&gt;

&lt;p&gt;The mapping stage in Step 2 doesn't hand the model the full markdown of every GitBook page, for a documentation site of any real size, that would be an enormous amount of context. Instead, each page gets summarized first, and those summaries are what is fed into the mapping step. But summarizing the entire documentation space on every single run was expensive, in both time and tokens, for pages that hadn't changed at all since the last sprint.&lt;/p&gt;

&lt;p&gt;The fix was a caching layer: GitBook automatically syncs its documentation content to a GitHub repository, allowing the pipeline to use repository SHAs as a lightweight change detection mechanism. Page summaries are persisted between runs as GitHub Actions artifacts, and each new run compares the latest repository state against the previous one to identify which pages have actually changed. Only those pages are re-summarized, while unchanged summaries are loaded directly from the cache. It's a relatively small architectural addition, but it's the difference between a pipeline that's practical to run every week and one that gradually becomes too expensive and slow to justify.&lt;/p&gt;

&lt;h2&gt;
  
  
  Engineering Lessons
&lt;/h2&gt;

&lt;p&gt;The biggest lesson was that integration work is often harder than intelligence work. The LLM prompts were only one part of the system, most of the complexity came from stitching together Jira, GitLab, GitBook, GitHub Actions, VPN-restricted infrastructure, and multiple data formats into something reliable.&lt;/p&gt;

&lt;p&gt;I also learned that building effective AI systems is less about finding the perfect prompt and more about designing the right architecture around the model. Planning stages, review gates, validation layers, and structured outputs had a far greater impact on quality than prompt tweaks ever did.&lt;/p&gt;

</description>
      <category>automation</category>
      <category>ai</category>
      <category>programming</category>
      <category>python</category>
    </item>
    <item>
      <title>QA in 2030: What Changes, What Stays, and What Disappears</title>
      <dc:creator>S.Pradyumna</dc:creator>
      <pubDate>Fri, 05 Jun 2026 12:30:00 +0000</pubDate>
      <link>https://dev.to/qapilot/qa-in-2030-what-changes-what-stays-and-what-disappears-2b15</link>
      <guid>https://dev.to/qapilot/qa-in-2030-what-changes-what-stays-and-what-disappears-2b15</guid>
      <description>&lt;p&gt;&lt;em&gt;Building software is getting cheap. But trusting it is not.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Says &lt;em&gt;Mobin Thomas&lt;/em&gt; in his wonderful session at &lt;a href="https://www.browserstack.com/" rel="noopener noreferrer"&gt;BrowserStack's&lt;/a&gt; Breakpoint. This stayed with me.&lt;/p&gt;

&lt;p&gt;That is not a prediction. That is the structural reality of the next decade for everyone who works in software quality. One projection was particularly difficult to ignore. It showed that between 2026 and 2030, the cost of building software falls sharply while the cost of trust remains unchanged. That widening gap is where Quality Engineering will live.&lt;/p&gt;

&lt;p&gt;The question is not whether AI will change QA. It already has. The real question is what exactly changes, what stays the same, and what quietly disappears.&lt;/p&gt;




&lt;h2&gt;
  
  
  What Is Already Changing
&lt;/h2&gt;

&lt;p&gt;Three forces are compressing the cost of building software, and they do not add together. They multiply.&lt;/p&gt;

&lt;p&gt;The first is &lt;strong&gt;silicon&lt;/strong&gt;. Inference costs are falling roughly tenfold every year. AI is becoming economically viable in places where it was not before, and that changes everything downstream.&lt;/p&gt;

&lt;p&gt;The second is the &lt;strong&gt;agentic stack&lt;/strong&gt;. Code generation, code review, test generation, log triage, defect routing. All of these are collapsing to fractions of their former cost. What used to take teams multiple days is being compressed into hours.&lt;/p&gt;

&lt;p&gt;The third is &lt;strong&gt;tooling proliferation&lt;/strong&gt;. Every layer of the software development lifecycle now has agentic options. Most are average. Some are exceptional. By 2028, even the laggards are expected to close the gap. When that happens, differentiation moves away from which tools you use and toward the quality of judgment you bring to using them.&lt;/p&gt;

&lt;p&gt;Right now, we are in a phase called &lt;strong&gt;Augmentation&lt;/strong&gt;. AI sits alongside the human, who remains the decision maker. Test generation from requirements, self-healing locators, and log-triage assistants are already embedded in pipelines. Early adopters are already reporting meaningful productivity gains. The skill shift begins here - prompting, evaluation, and review become everyday disciplines. Tool specific expertise begins to depreciate.&lt;/p&gt;

&lt;p&gt;By 2027, &lt;strong&gt;Delegation&lt;/strong&gt; arrives. Agents own bounded slices of work end to end. An agent reads a ticket, generates tests, runs them, files a defect, proposes a fix, and validates it. This is a direction platforms such as QApilot are already beginning to explore. Humans become approvers, exception handlers, and stewards of the agent ecosystem. The hardest problem in this phase is the &lt;strong&gt;handoff&lt;/strong&gt; - when does an agent escalate? To whom? With what context? That is real engineering work, and it is largely undone in most organisations today.&lt;/p&gt;

&lt;p&gt;By 2029, we would be in a phase called &lt;strong&gt;Governance&lt;/strong&gt;. Code self-heals, deployments become continuous and conditional on behavioural evidence, and pre-production increasingly gives way to simulation. QE no longer tests software. QE defines the conditions software must earn the right to exist.&lt;/p&gt;

&lt;p&gt;Not every industry will reach the same phase of AI-driven QA at the same time, and that is completely fine. Companies building consumer apps, retail platforms, or internal business tools can afford to move fast. If something breaks, the damage might be mostly financial, a bad review, a lost customer, a quick fix. For these teams, the most advanced phase of AI-driven quality engineering arrives roughly when the technology is ready for it.&lt;/p&gt;

&lt;p&gt;However, industries like defence, healthcare, and financial services operate differently and deliberately so. When software fails in those environments, the consequences go far beyond a bad review. A wrong calculation in a trading system, a security gap in critical infrastructure, an error in a medical context, these are not problems you recover from with a patch. So, these industries move at a pace that matches their regulations, not just their technical capability. Both timelines are valid. Neither one is the wrong way to approach the future.&lt;/p&gt;




&lt;h2&gt;
  
  
  What Stays: The Things AI Cannot Replicate
&lt;/h2&gt;

&lt;p&gt;The projection was clear: execution scales with compute. Judgment does not.&lt;/p&gt;

&lt;p&gt;Three things remain irreducibly human.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Judgment&lt;/strong&gt; is the ability to understand what good means before an agent tries to build it. What does "good enough to ship" look like in this domain, for this customer, on this kind of Tuesday? Agents can produce outputs. They cannot answer that question reliably or consistently.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Imagination&lt;/strong&gt;, in other words seeing the failures the agents will not see. Asking what a malicious user would do, what a confused user would try, what a regulator would look for. Imagining the person on the other end when the software breaks, the one whose claim is denied, whose trade slips. Adversarial imagination and empathy for failure remain deeply human capabilities. They are not qualities that can be prompted into existence.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Experience&lt;/strong&gt; is pattern recognition that compute cannot synthesize. Domain depth means knowing the failure modes specific to your industry, not as broad abstractions but as concrete realities. One phrase captured this well: &lt;strong&gt;scar tissue&lt;/strong&gt;. You have seen this pattern break before. You know exactly what is about to go wrong. That is the value of experience.&lt;/p&gt;

&lt;p&gt;This raises an interesting question: does experience still matter after a few years? The answer depends entirely on which kind.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Procedural experience&lt;/strong&gt; depreciates fast, a specific Selenium pattern from 2018, a particular Jira workflow, tool certifications, niche test-management interfaces. These are being commoditised. &lt;strong&gt;Judgment experience&lt;/strong&gt; appreciates. Knowing that a certain kind of release at a certain time of quarter always breaks in a particular way. Knowing what "good enough" actually means in a specific domain. The instinct that flags a passing-but-wrong build. That kind of experience does not depreciate. The broader lesson is straightforward: tool experience is going away. Scar tissue is not.&lt;/p&gt;

&lt;p&gt;All of these qualities point to a larger reality. As execution becomes cheaper and more abundant, the limiting factor shifts elsewhere. It shifts toward trust.&lt;/p&gt;

&lt;p&gt;In many ways, this is the philosophy behind platforms such as &lt;a href="https://qapilot.io/" rel="noopener noreferrer"&gt;QApilot&lt;/a&gt;. The goal is not to replace judgment, imagination, or experience, but to automate the repetitive work around them, so they can focus on the decisions that ultimately determine quality.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why Trust Becomes the Scarce Resource
&lt;/h2&gt;

&lt;p&gt;There is a common belief in software teams that speed is everything: ship the product, fix the problems as they come. It sounds practical and for a while, it works. But it has a ceiling, and most teams only discover that ceiling when they have already gone past it.&lt;/p&gt;

&lt;p&gt;Here is the core issue. The cost of building software is falling fast. The cost of earning user trust is not. Every time a product ships with known gaps in quality, that trust takes a small hit and unlike a bug, trust does not get fixed in the next release. It has to be rebuilt slowly, over time, through consistent reliability. That is not something you can automate.&lt;/p&gt;

&lt;p&gt;A simple example brings this distinction into focus. Think about fraud detection in 2030. One part of the system is a rules engine whose behaviour has been understood for years. Teams know how it responds, regulators understand its boundaries, and its failure modes are familiar.&lt;/p&gt;

&lt;p&gt;Another part is an adaptive AI model that continuously updates how it scores transactions. There is no fixed version to certify once and forget. Trust comes not from static validation but from observing how the system behaves over time, especially under unusual conditions.&lt;/p&gt;

&lt;p&gt;Both systems perform the same job, but they earn trust in fundamentally different ways. If judgment, imagination, and trust become the scarce resources, the next question is who will be responsible for institutionalising them. The answer is likely to reshape the structure of software teams themselves.&lt;/p&gt;




&lt;h2&gt;
  
  
  Who Is in the Standup in 2030?
&lt;/h2&gt;

&lt;p&gt;If this trajectory holds, three roles become increasingly important.&lt;/p&gt;

&lt;p&gt;The &lt;strong&gt;Quality Architect&lt;/strong&gt; who is typically senior and often a former lead SDET, writes the behavioural specifications that agents conform to. This person owns the trust contracts for major systems and talks more to product than to developers. They are not writing test scripts. They are writing what trustworthy looks like for each system, codified and signed.&lt;/p&gt;

&lt;p&gt;A new role may emerge: the &lt;strong&gt;Agent Conductor&lt;/strong&gt;. Part SRE, part prompt engineer, and part team lead. This person operates the agent fleet day to day by tuning prompts, monitoring performance, retiring drifting agents, and maintaining the team's working relationship with autonomous agents.&lt;/p&gt;

&lt;p&gt;The &lt;strong&gt;Domain Authority&lt;/strong&gt; is the domain specialist whose expertise cannot easily be commoditised. This person knows healthcare claims, or trading mechanics, or telecom provisioning in much the way a master craftsperson knows their material. Agents can be trained on this judgment. But the judgment originates here.&lt;/p&gt;




&lt;h2&gt;
  
  
  How the Shift Looks from Different Seats
&lt;/h2&gt;

&lt;p&gt;The implications of this shift differ depending on where you sit.&lt;/p&gt;

&lt;p&gt;For the &lt;strong&gt;practitioner&lt;/strong&gt;, the signal was this: The teams that go deep into a domain will hold their ground. Tools will commoditise. Domain pattern recognition will not. The tester who understands insurance claims, trading mechanics, or telecom provisioning carries knowledge that agents can be trained on but cannot originate. That is the portfolio worth building.&lt;/p&gt;

&lt;p&gt;For &lt;strong&gt;leaders&lt;/strong&gt;, it was a budget question. The projected shift over the next 18 months moves spend away from tool licenses and script maintenance and toward behavioural specification capability and relationships with risk and regulatory colleagues. The teams without governance capability when regulation fully arrives will be caught unprepared. For QE leaders, the signal was clear, if you are not already building relationships with your risk and compliance teams, you are already behind. Regulation is evolving alongside these changes. Historically, every major compliance framework has expanded the scope of quality engineering. The AI Act appears set to do the same by introducing new expectations around behavioural assurance, agent governance, and traceability. Teams that delay building governance capabilities may find themselves reacting rather than leading.&lt;/p&gt;

&lt;p&gt;For &lt;strong&gt;executives&lt;/strong&gt;, the signal was the simplest of the three: trust is the scarce input, not models, not compute. QE produces trust. In 2030, trust is what software is sold on. Fund it accordingly.&lt;/p&gt;




&lt;h2&gt;
  
  
  Already Walking That Path
&lt;/h2&gt;

&lt;p&gt;The future of quality engineering will not be defined by who can write the most tests. It will be defined by who can build trust into increasingly autonomous systems. That shift is already underway.&lt;/p&gt;

&lt;p&gt;Quality engineering is moving from verifying outputs to governing behaviour. As systems become more autonomous, the challenge is no longer simply whether software works, but whether it can be trusted to keep working as conditions change.&lt;/p&gt;

&lt;p&gt;Platforms such as QApilot are already beginning to reflect that shift, treating trust as something that must be engineered continuously rather than verified at the end. The tools will evolve. The agents will become more capable. What will remain is the need for systems people can trust. That is the future quality engineering is moving toward, and it is the path QApilot is already walking.&lt;/p&gt;




&lt;h2&gt;
  
  
  QA Is Not Going Away. It Is Going Up.
&lt;/h2&gt;

&lt;p&gt;AI is not replacing QA. It is transforming it into the most strategically important function in the software development lifecycle.&lt;/p&gt;

&lt;p&gt;The profession is moving into the gap between how cheaply software can be built and how expensively trust must be earned. That gap is not closing. It is growing. The trend itself is difficult to ignore.&lt;/p&gt;

&lt;p&gt;The tools are changing. The roles are changing. The work is changing.&lt;/p&gt;

&lt;p&gt;What stays is the part that was never about the tools in the first place.&lt;/p&gt;

</description>
      <category>testing</category>
      <category>qa</category>
      <category>ai</category>
      <category>qe</category>
    </item>
  </channel>
</rss>
