<?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: Karthik Kalaiyarasu</title>
    <description>The latest articles on DEV Community by Karthik Kalaiyarasu (@karzone).</description>
    <link>https://dev.to/karzone</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%2F2116507%2F6825dab7-694f-48d0-b3d8-0701231a87a5.png</url>
      <title>DEV Community: Karthik Kalaiyarasu</title>
      <link>https://dev.to/karzone</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/karzone"/>
    <language>en</language>
    <item>
      <title>The blind spot in AI-driven test automation: the agent can't see your existing tests</title>
      <dc:creator>Karthik Kalaiyarasu</dc:creator>
      <pubDate>Mon, 27 Jul 2026 21:43:12 +0000</pubDate>
      <link>https://dev.to/karzone/the-blind-spot-in-ai-driven-test-automation-the-agent-cant-see-your-existing-tests-2381</link>
      <guid>https://dev.to/karzone/the-blind-spot-in-ai-driven-test-automation-the-agent-cant-see-your-existing-tests-2381</guid>
      <description>&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fqpmwt603x4dbg7kzjfv1.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fqpmwt603x4dbg7kzjfv1.png" alt=" " width="800" height="450"&gt;&lt;/a&gt;&lt;em&gt;TestAtlas is a zero-config CLI that maps your .NET test automation into one queryable SQLite file — no build, no network, no AI.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Ask a coding agent to "add a test for the checkout discount flow" and watch what happens. It writes a brand-new step for "the cart has two items" — even though three nearly identical steps already exist. It creates a fresh &lt;code&gt;CheckoutApiClient&lt;/code&gt; next to the &lt;code&gt;CartApiClient&lt;/code&gt; that already does the job. It drops the new page object in the wrong project. The test passes. The suite gets a little worse.&lt;/p&gt;

&lt;p&gt;This isn't the model being careless. It's the model being blind.&lt;/p&gt;

&lt;h2&gt;
  
  
  The blind spot
&lt;/h2&gt;

&lt;p&gt;An AI agent working in your repository sees files — the ones it opens, and whatever fragments it can pull into its context window. What it cannot see is the &lt;em&gt;shape&lt;/em&gt; of your test automation: which step definitions already exist, which are bound and which are dead, which page objects wrap which screens, which API client owns which endpoint, and which project anything is supposed to live in.&lt;/p&gt;

&lt;p&gt;Humans have the same blind spot; we just hit it more slowly. Anyone who has joined a mature test-automation suite knows the feeling of "surely we already have a step for this" — followed by twenty minutes of grepping to find out.&lt;/p&gt;

&lt;p&gt;For an agent the cost is worse, because it acts on that blindness immediately: it duplicates, reinvents, and misplaces at machine speed. The suite doesn't fail — it bloats. Duplicate steps, orphaned helpers, and drifting conventions accumulate until the automation is harder to change than the product it tests.&lt;/p&gt;

&lt;p&gt;The missing piece isn't a smarter model. It's a &lt;strong&gt;map&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  What TestAtlas does
&lt;/h2&gt;

&lt;p&gt;TestAtlas reads your solution once and writes a single SQLite file — &lt;code&gt;codemap.db&lt;/code&gt; — that captures the whole structure of your test automation:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Projects and their dependency edges&lt;/li&gt;
&lt;li&gt;Gherkin features, scenarios, and steps&lt;/li&gt;
&lt;li&gt;Step definitions and their bindings — bound, unbound, or ambiguous&lt;/li&gt;
&lt;li&gt;Page objects, API clients, helpers, and test classes&lt;/li&gt;
&lt;li&gt;The call and usage edges that connect them all&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That file is the map. Everything else — search, impact analysis, the HTML report, the dependency graph, the MCP server — is just a different question asked against it.&lt;/p&gt;

&lt;h2&gt;
  
  
  No build. No network. No AI.
&lt;/h2&gt;

&lt;p&gt;The three things TestAtlas deliberately does &lt;em&gt;not&lt;/em&gt; do are the whole point.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;No build.&lt;/strong&gt; It's a syntax-only pass over your source. It never asks Roslyn for a full compilation or a semantic model, so a solution whose NuGet packages have never been restored still maps cleanly. Gherkin comes straight from the &lt;code&gt;.feature&lt;/code&gt; files; step definitions come from the &lt;code&gt;[Given]&lt;/code&gt;/&lt;code&gt;[When]&lt;/code&gt;/&lt;code&gt;[Then]&lt;/code&gt; attributes in your code.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;No network.&lt;/strong&gt; Everything runs locally against your files. Nothing is uploaded.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;No AI.&lt;/strong&gt; The map is produced by static analysis, so it is deterministic and reproducible — the same input yields the same map, every time. That is precisely what makes it useful &lt;em&gt;to&lt;/em&gt; an AI agent: the map is the fixed, trustworthy ground truth the model can stand on, rather than one more probabilistic guess.&lt;/p&gt;

&lt;h2&gt;
  
  
  How it works
&lt;/h2&gt;

&lt;p&gt;TestAtlas parses the solution structure, the &lt;code&gt;.feature&lt;/code&gt; files, and the C# source, then resolves the relationships between them and writes the result into a documented, versioned SQLite schema. Because the schema is a public contract, anything downstream — the report, the graph, the MCP server, or your own SQL — reads from a stable shape.&lt;/p&gt;

&lt;p&gt;Being honest about scope: because the analysis is syntactic, it captures what's declared in source — attributes, class shapes, references, &lt;code&gt;.feature&lt;/code&gt; bindings. It targets Reqnroll/SpecFlow-style BDD suites and deliberately skips generated code-behind. It's a map of your &lt;em&gt;source&lt;/em&gt;, not a runtime trace — and for the "does this already exist / what does this touch" questions, source is exactly the right altitude.&lt;/p&gt;

&lt;h2&gt;
  
  
  What you can ask it
&lt;/h2&gt;

&lt;p&gt;Once the map exists, four questions get easy:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Search&lt;/strong&gt; — FTS5 full-text search over step definitions and scenarios: &lt;em&gt;does a step for this already exist?&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Impact&lt;/strong&gt; — the blast radius of a change: which scenarios are affected if you touch a class, method, step, or endpoint.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Report&lt;/strong&gt; — a self-contained HTML drill-down of the whole map.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Map&lt;/strong&gt; — a self-contained project dependency graph.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Install it as a .NET global tool and point it at a solution:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;testatlas index path/to/YourSolution.sln
testatlas search &lt;span class="s2"&gt;"add a product to the cart"&lt;/span&gt; &lt;span class="nt"&gt;--steps&lt;/span&gt;
testatlas impact &lt;span class="nt"&gt;--class&lt;/span&gt; CartApiClient
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The answers are concrete. Ask about the existing step, and you get the exact binding:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;gt; testatlas search "the shop API is available" --steps
step definitions matching 'the shop API is available': 1
  [Given] the shop API is available  (CatalogApiSteps, CatalogApiSteps.cs:19)

&amp;gt; testatlas impact --class ProductsApiClient
Impact of class ProductsApiClient (api_client)
Affected: 2 step definition(s) · 3 scenario(s) · 2 feature(s)

Catalog API  (SampleShop.Tests.Api/Features/Catalog.feature)
  Add a product to the cart   via "the shop API is available"
  List available products     via "a request for the product list is made", "the shop API is available"
Identity API  (SampleShop.Tests.Api/Features/Identity.feature)
  Sign in and read profile    via "the shop API is available"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Giving the map to an AI agent (MCP)
&lt;/h2&gt;

&lt;p&gt;This is where the blind spot actually closes. TestAtlas ships an MCP server — &lt;code&gt;testatlas-mcp&lt;/code&gt; — that serves the map to any MCP-aware client (Claude, GitHub Copilot agent mode, and others) over stdio. Instead of stuffing source files into the model's context and hoping, the agent asks a precise question and gets an exact, structured answer straight from the &lt;code&gt;.db&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Ask it what breaks if you change &lt;code&gt;CartApiClient&lt;/code&gt;, and it answers with the actual scenarios at risk — three scenarios across the Catalog and Identity features. Now the agent knows what already exists before it writes a line — so it reuses the step, extends the right client, and puts the code where it belongs.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try it
&lt;/h2&gt;

&lt;p&gt;TestAtlas is open source under MIT, and both tools are on NuGet as .NET global tools:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;dotnet tool &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;--global&lt;/span&gt; TestAtlas.Cli
dotnet tool &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;--global&lt;/span&gt; TestAtlas.Mcp
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The repository includes a real sample solution — an eight-project shop with API tests, UI tests, and an end-to-end journey — so you can generate the report and dependency map on something concrete before pointing it at your own code.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;GitHub:&lt;/strong&gt; &lt;a href="https://github.com/Karzone/TestAtlas" rel="noopener noreferrer"&gt;https://github.com/Karzone/TestAtlas&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If your test-automation suite has grown past the point where any one person holds it in their head — or you want to give your coding agent a fighting chance — give it a map.&lt;/p&gt;

</description>
      <category>dotnet</category>
      <category>testing</category>
      <category>ai</category>
      <category>mcp</category>
    </item>
  </channel>
</rss>
