<?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: Surendranath Reddy Jillella</title>
    <description>The latest articles on DEV Community by Surendranath Reddy Jillella (@jsnreddy).</description>
    <link>https://dev.to/jsnreddy</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3957145%2F4c55b32e-75a2-498f-9717-649781fc6c92.jpg</url>
      <title>DEV Community: Surendranath Reddy Jillella</title>
      <link>https://dev.to/jsnreddy</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/jsnreddy"/>
    <language>en</language>
    <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>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>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>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>
  </channel>
</rss>
