<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd" xmlns:googleplay="http://www.google.com/schemas/play-podcasts/1.0"><channel><title><![CDATA[Developing In Test]]></title><description><![CDATA[Developing In Test]]></description><link>https://www.developingintest.com</link><image><url>https://www.developingintest.com/img/substack.png</url><title>Developing In Test</title><link>https://www.developingintest.com</link></image><generator>Substack</generator><lastBuildDate>Fri, 31 Jul 2026 18:14:54 GMT</lastBuildDate><atom:link href="https://www.developingintest.com/feed" rel="self" type="application/rss+xml"/><copyright><![CDATA[Nathan Thompson]]></copyright><language><![CDATA[en]]></language><webMaster><![CDATA[developingintest@substack.com]]></webMaster><itunes:owner><itunes:email><![CDATA[developingintest@substack.com]]></itunes:email><itunes:name><![CDATA[Nathan Thompson]]></itunes:name></itunes:owner><itunes:author><![CDATA[Nathan Thompson]]></itunes:author><googleplay:owner><![CDATA[developingintest@substack.com]]></googleplay:owner><googleplay:email><![CDATA[developingintest@substack.com]]></googleplay:email><googleplay:author><![CDATA[Nathan Thompson]]></googleplay:author><itunes:block><![CDATA[Yes]]></itunes:block><item><title><![CDATA[Teaching AI To Test: The Organization]]></title><description><![CDATA[Continuing from my previous post about teaching an AI agent to test your app, I&#8217;ll outline ways I&#8217;ve organized those teachings for future agents.]]></description><link>https://www.developingintest.com/p/teaching-ai-to-test-the-organization</link><guid isPermaLink="false">https://www.developingintest.com/p/teaching-ai-to-test-the-organization</guid><dc:creator><![CDATA[Nathan Thompson]]></dc:creator><pubDate>Mon, 20 Jul 2026 15:15:36 GMT</pubDate><content:encoded><![CDATA[<p>Hey folks, continuing from <a href="https://www.developingintest.com/p/teaching-ai-to-test-the-process">my previous post</a> about teaching an AI agent to test your app, today I&#8217;ll outline ways I&#8217;ve organized those teachings for future agents. This post will largely focus on my personal efforts to create an effective and efficient testing agent, but general lessons can be extracted for your own work.</p><p>The naive organization, which is absolutely what I did on my first pass, is to heap all of the instructions you&#8217;ve generated into markdown files in the .ai directory of your repository. When you launch your agent it will automatically parse these instructions and add them to its context window. There&#8217;s a few problems with this approach:</p><ol><li><p>That eats up context tokens for every agent you launch, regardless of whether you intend to use it for testing.</p></li><li><p>It leaves the decision of when to use those instructions up to the agent rather than providing it with clear guidelines and reminders to use them.</p></li><li><p>It breaks <a href="https://www.developingintest.com/p/developing-the-qa-mindset-distance">the most fundamental rule of entering the QA mindset</a> by having the author agent test its own code.</p></li></ol><p>During my first attempt, I asked an agent to implement and test a relatively simple feature change. It needed to update text in a toast notification of a website and place that new text behind a feature flag using our A/B testing system. Reading the Jira ticket, accessing the designs, and implementing change used about 20k tokens in Claude Code. The remaining work of testing the change and providing a recording as proof of that verification required another ~97k tokens, and the artifacts were pretty bad. What should have been a couple simple videos of displaying the toast in each experiment variant turned into a six minute odyssey of the agent roaming about the site intermixed with unexplained lengths of inactivity. What&#8217;s worse, when the agent opened a draft pull request of the change for review, a reviewer agent quickly identified an edge case that had not been accounted for.</p><p>Thus I began a complete overhaul of the structure of the instructions. Since I was using Claude Code I decided to create a skill as the primary entry point rather than writing a wordy prompt to kick things off. The skill was called /complete-ticket and it accepted a Jira ticket as the argument. This skill instructed the agent to complete the following steps:</p><ol><li><p>Review the Jira ticket, associated designs, and relevant areas of the code.</p></li><li><p>Make the code changes necessary to complete the ticket.</p></li><li><p>Spin up a subagent that should complete a /user-acceptance-testing skill.</p></li><li><p>Address any feedback from the subagent, repeating step 3 if necessary.</p></li><li><p>Open a pull request.</p></li></ol><p>Notice that I began leveraging a subagent for testing in step 3 instead of the author agent. This increased the distance from the code in order to address the problem of broken edge cases going unnoticed. The /user-acceptance-testing skill itself was another entry point. It began by instructing the testing subagent to review Jira for itself to determine if the code change met the definition of done for the ticket. It then told the testing subagent to create a test plan in a markdown file that it could refer back to. The plan was to include specific testing skills for each step. These concrete skills related to features of the application, such as /ab-feature-testing and /metered-feature-testing. By reorganizing the instructions as skills and telling the testing agent to create a disciplined test plan, I eliminated the wasted tokens on start up and ensured the testing practices were top of mind when the agent needed them.</p><p>With the new organization in place, I asked a new agent to pull the Jira ticket using the /complete-ticket skill. Once again the implementation used about 20k tokens. However, the testing portion burned only ~60k tokens this time. The verification evidence it produced were two 15 second videos showing the toast text in each A/B variant. When the pull request was opened, the reviewer agent found no missing edge cases in the implementation. Given the goal was to create proof-of-testing artifacts to boost developer confidence for an AI-generated pull request, the simple act of reorganizing instructions to be more AI-ready improved those outcomes by leaps and bounds.</p><p>Ultimately, this was a pretty exciting result to see, though I would be remiss were I to gloss over the cost of this process. The act of testing a change and iterating on the solution was three times that of simply reading a ticket and implementing the code. In my next post I&#8217;ll spend some time reflecting on this expense.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.developingintest.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Developing In Test! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p></p>]]></content:encoded></item><item><title><![CDATA[Teaching AI To Test: The Process]]></title><description><![CDATA[In this post I dig into ways to have agents perform higher order testing, increasing the efficiency gains of using AI compared to simply having it write code.]]></description><link>https://www.developingintest.com/p/teaching-ai-to-test-the-process</link><guid isPermaLink="false">https://www.developingintest.com/p/teaching-ai-to-test-the-process</guid><dc:creator><![CDATA[Nathan Thompson]]></dc:creator><pubDate>Mon, 06 Jul 2026 15:15:44 GMT</pubDate><content:encoded><![CDATA[<p>Hey folks, in <a href="https://www.developingintest.com/p/teaching-ai-to-test?r=4fy75q">my last post</a> I spoke about why the return on AI investment is low when you only incorporate agents into the coding portion of software development. In this post, I&#8217;ll be digging into practical ways to enable agents to perform higher order testing. For this blog I&#8217;ll be focusing on end-to-end style testing of a web application, but the basic principles are applicable to other fields of software development.</p><p>First of all, let&#8217;s talk about the technical setup. In the realm of web development the highest order testing is loading the application in an actual browser. You can quickly bootstrap a testing harness for this using Claude Code, <a href="https://playwright.dev/docs/intro">Playwright</a>, and the <a href="https://playwright.dev/docs/getting-started-cli">playwright-cli</a> binary / Claude skill. If you also install Xvfb then this whole setup can run headlessly on a virtual environment, allowing you to manage work on multiple features at once.</p><p>Now that we have the tech sorted out we should talk about what we&#8217;re trying to accomplish. Let&#8217;s say our goal is to enable AI to work on features fully autonomously. With a single command we want an agent to complete the following steps:</p><ol><li><p>Review the work ticket, associated designs, and relevant areas of the code.</p></li><li><p>Make the code changes necessary to complete the ticket.</p></li><li><p>Execute user acceptance testing.</p></li><li><p>Make any additional changes based on the testing outcome.</p></li><li><p>Record itself running a final verification of the code changes.</p></li><li><p>Open a pull request for human review.</p></li><li><p>Post the verification records to the pull request.</p></li></ol><p>Steps 3 and 4 are intended to improve the quality of the change set prior to human review to limit the amount of time we sink into correcting the agent. Additionally, steps 5 and 7 ensure the human receives proof in the pull request that satisfactory testing was completed. For our web app example this takes the form of screenshots / screencasts from the latest testing attempt that demonstrate the feature meets the acceptance criteria described in the ticket.</p><p>So how do we give the agent the context necessary to perform that testing? You might be inclined to open a text editor and write page after page of instructions about how your feature works and the best ways to test it. Resist that urge. Instead, boot up Claude Code, ask it to launch Playwright, and instruct it to navigate to your application. Give it a guided exploration of your area of the codebase. For instance, try sending it prompts like these:</p><blockquote><p>What do you think the purpose of this page is?</p><p>Notice there&#8217;s a button with a gear icon in the corner. What does that do?</p><p>Try switching to a different mode. How does that change the experience?</p><p>The following is the URL for our admin panel. Notice that is has the capability to reset metered features. How could that be helpful for testing?</p></blockquote><p>Once the agent has a sense of how the app works at a high level, we can introduce it to some of the deeper inner workings like the database. After all, being able to insert a test account into a database is much faster and less error-prone than registering one through the UI. Connect Claude Code to your codebase and a development database&#8212;<em>not</em> your Production database&#8212;and explore the schemas and ORMs that underly your test data:</p><blockquote><p>Inspect the contents of the Users table. Notice there are different types of users. How would that come in to play when testing a feature?</p><p>The following is the ORM definition for a User. How could you use that to insert a new user into the database?</p></blockquote><p>Now that you&#8217;ve spent some time exploring your feature, ask the agent that did the exploration to write the skill for you:</p><blockquote><p>We have a lot of useful knowledge about this feature. Write a new skill that captures all of that knowledge so future agents can use it as well.</p></blockquote><p>Working through this process will give the agent a great start for testing your feature, but remember that setting up high-level test harnesses requires time and effort. Teaching an agent to test your application is no different. Many developers find Selenium-style tests hard to write compared to unit tests because Selenium-style tests are running on an environment that behaves in a non-deterministic way. Autonomous agent testing compounds the problem as the agent itself behaves in a non-deterministic way:</p><ul><li><p><strong>Unit Tests:</strong> Deterministic tool, deterministic environment</p></li><li><p><strong>Selenium:</strong> Deterministic tool, non-deterministic environment</p></li><li><p><strong>Autonomous Agents:</strong> Non-deterministic tool, non-deterministic environment</p></li></ul><p>This means the best advice for writing solid Selenium tests also applies to writing solid autonomous agent testing skills. You must run them over and over again to see what breaks. Concretely, follow these steps:</p><ol><li><p>Identify a ticket that would require your new skill to test.</p></li><li><p>Have an agent write the code for that ticket, but have it pause at the testing stage.</p></li><li><p>Commit the code change from Step 2 to a branch.</p></li><li><p>Spin up a brand new development environment and launch a new Claude Code agent to ensure you&#8217;re starting with a clean context.</p></li><li><p>Check out the branch from Step 3.</p></li><li><p>Tell your agent it is on a branch with untested code changes for a particular ticket. Ask it to verify the change.</p></li><li><p>Observe the agent&#8217;s behavior, particularly what goes wrong.</p><ul><li><p>Does it get confused when it sees a 500 responses from ancillary services?</p></li><li><p>Does it get stuck in a loop because it missed an error message?</p></li><li><p>When something goes wrong, does the agent have a useful fallback strategy to complete its testing?</p></li></ul></li><li><p>Repeat Steps 4 through 7. Ideally run through this process five to ten times.</p></li></ol><p>The more you battle test your skills against actual agent-generated code in actual development environments, the more self-sufficient future agents will be in their testing process.</p><p>With that, we now have a process to teach an agent how to test your application. In the next post I&#8217;ll dig into practical tips for organizing these instructions so they are understandable and actionable by agents.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.developingintest.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Developing In Test! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p></p>]]></content:encoded></item><item><title><![CDATA[Teaching AI To Test]]></title><description><![CDATA[For this next series, I&#8217;m delving into the world of artificial intelligence to talk about how we can help agents be better testers.]]></description><link>https://www.developingintest.com/p/teaching-ai-to-test</link><guid isPermaLink="false">https://www.developingintest.com/p/teaching-ai-to-test</guid><dc:creator><![CDATA[Nathan Thompson]]></dc:creator><pubDate>Mon, 22 Jun 2026 15:15:26 GMT</pubDate><content:encoded><![CDATA[<p>Hey folks, for the past couple of months I&#8217;ve been discussing how we as developers can enter the QA mindset. For this next series, I&#8217;m delving into the world of artificial intelligence to talk about how we can help agents be better testers.</p><p>Let&#8217;s start with an obvious questions, why do we even want to do this? After all, with a little prompting an agent is more than happy to write and run unit tests for every change it makes. Do we really need to invest in any more capabilities than that?</p><p>The unfortunate reality is that unit tests are insufficient to cover the vast majority of production-grade software. Unit tests are fast and stable, which is why they serve as the foundation of the test automation pyramid. However, they are inherently limited in scope. If you have a micro-services architecture with high unit test coverage and low integration test coverage, then you likely won&#8217;t encounter many bugs within a single service, but you will be plagued with outages as services shift underneath each other. As any QA engineer will tell you, then only way to be certain the entire app will function is to test it as a whole.</p><p>A lack of effective testing often leads to reduced productivity. What I personally have observed is the phenomenon where AI-assisted development results in code being written quicker, but the pull requests for that code receive more pushback and ultimately take longer to land. In order to maintain a high standard of quality and achieve the promise of higher productivity through AI-accelerated development, we have a few options:</p><ol><li><p>Hire more QA engineers to test that code.</p></li><li><p>Shift our developer workforce to be more testing focused.</p></li><li><p>Have the agent writing the code perform better testing of its work.</p></li></ol><p>Plenty of discussion could take place around all three of those options, but for the purposes of this series I&#8217;ll focus on the practical steps to improve how an agent tests its code.</p><p>Now that we have an understanding of why we would want to impart better testing skills to agents, let&#8217;s quickly talk about why we even need to be the ones providing those instructions. After all, an agent fundamentally understands how to build an application, so aren&#8217;t Anthropic and OpenAI giving these models everything they need? What I&#8217;ve found is that the hardest part of enabling AI to test its own changes is not telling it how to test, it&#8217;s telling it how to test <em>my</em> app. Claude fundamentally understands what a feature flag is, but it doesn&#8217;t know about my admin dashboard for managing feature flags in the current session. We as developers have built tools and learned tricks that make testing much more efficient. Preloading that knowledge into an agent is essential if we want it to move as fast as a human.</p><p>In the next few posts I&#8217;ll walk through practical steps for teaching an agent about the intricacies of testing a given application, tips for organizing those learnings to be AI-ready, and the pitfalls of leveraging a machine as a substitute for human testing.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.developingintest.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Developing In Test! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p></p>]]></content:encoded></item><item><title><![CDATA[Developing the QA Mindset: Curiosity]]></title><description><![CDATA[In this final installment of the QA mindset series I'm providing some examples of how to bring curiosity to your exploration of software.]]></description><link>https://www.developingintest.com/p/developing-the-qa-mindset-curiosity</link><guid isPermaLink="false">https://www.developingintest.com/p/developing-the-qa-mindset-curiosity</guid><dc:creator><![CDATA[Nathan Thompson]]></dc:creator><pubDate>Mon, 08 Jun 2026 15:15:48 GMT</pubDate><content:encoded><![CDATA[<p>Hey folks, I&#8217;m back again with the final installment of the QA mindset series. So far I&#8217;ve talked a lot about how and why we step into the QA mindset, but I haven&#8217;t really touched on what it actually is. If I were to sum it up in one word, I would say it&#8217;s curiosity. The trouble with that answer is it&#8217;s very hard to try to tell someone how to be curious. For today&#8217;s post, I&#8217;m going to try to do so by looking outside of our day-to-day work and exploring a few examples of others applying curiosity to what they do.</p><p>The first example comes from a job many years ago. I worked at a two-sided market place, so our users were both people buying things and people selling things. The sellers were a particularly lucrative target for scammers. The ploy was simple: a scammer would create an account with an avatar and name that appeared to be a site admin, send the seller a message that a sale had failed to process, and ask the seller to provide updated bank account information. I was on a project that was trying to prevent those scammers from contacting our sellers.</p><p>The messages started off easy to identify. The body was plain text, the username was overt, the avatar was simply our company logo. We built an AI model that classified these as spam, and the rate of sellers opening these messages dropped precipitously. In response, the scam messages steadily became more obfuscated. The avatars were just the first letter of our company name in our classic font, then generic clip art of people in tech support. The body became images instead of plain text. As we rolled out optical character recognition, the scammers began tweaking the resolution of the image and tinting the background to try to evade detection while still appearing legitimate enough to convince our sellers.</p><p>The most frustrating part of this work was that the scammers always seemed to have a new tactic that we would have to account for. The relentless evolution of their attacks brought us to a boiling point when one of my team members openly suggested we could have a mole in our company. That&#8217;s when the director overseeing the project brought us back down to Earth. &#8220;It&#8217;s simple,&#8221; he said, &#8220;these scammers are just using the QA mindset to find our weaknesses.&#8221;</p><p>While I&#8217;m not suggesting you start an illegal social engineering ring, the analogy is apt. These scammers were constantly asking, what if? What if I swap out the avatar? What if I darken the image background? What if I tweaked the language here? While their actions had a very specific goal of thwarting our defenses, the crux of their success was relentless curiosity. We can apply that same curiosity to our own testing practices to head off bad actors from doing it themselves.</p><p>My second example isn&#8217;t quite so bleak. Instead of using the QA mindset for nefarious purposes, this creator uses it for entertainment. Josh Knoles of the YouTube channel Let&#8217;s Game It Out regularly posts videos in which he gets an early-access video game and, for lack of a better description, intentionally plays it wrong. He forces his way out of bounds, pushes the limits on all features, and in general finds any way possible to complete his tasks while avoiding what the developer intended. As an example, here he is playing <a href="https://www.youtube.com/watch?v=UuMFCfixvRw">Parcel Simulator</a>. I think this video is great. If you watch it, try to listen to Josh&#8217;s thought process as he goes through the game because it&#8217;s a fantastic model for how to approach an application with curiosity.</p><p>And that&#8217;s it! Four posts on the QA mindset. I hope you&#8217;ve gained some useful knowledge somewhere in all of this. I&#8217;ll be back again next time with a post on a new topic. In the meantime, feel free to keep the conversation going in the comments.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.developingintest.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Developing In Test! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p></p>]]></content:encoded></item><item><title><![CDATA[Developing the QA Mindset: Ample Time to Explore]]></title><description><![CDATA[In this installment of the QA mindset series I'm talking about why it's important to carve out time for exploratory testing.]]></description><link>https://www.developingintest.com/p/developing-the-qa-mindset-ample-time</link><guid isPermaLink="false">https://www.developingintest.com/p/developing-the-qa-mindset-ample-time</guid><dc:creator><![CDATA[Nathan Thompson]]></dc:creator><pubDate>Mon, 25 May 2026 15:15:52 GMT</pubDate><content:encoded><![CDATA[<p>Hey folks, I&#8217;m back again with another installment of the QA mindset series. Today I wanted to talk about the importance of allotting ample time to explore. This is a tricky one because it&#8217;s easy to spend a bunch of time testing without ever entering the QA mindset. In order to understand the nuances of testing, let&#8217;s discuss how and why we should be manually testing our application.</p><p>First off, let&#8217;s talk about three primary types of testing: regression, acceptance, and exploratory testing. Regression testing is when you know that a feature or flow has worked in the past and you are ensuring that it still works. Acceptance testing is when you are verifying that a new feature meets the needs outlined in its design. Exploratory testing is when you are trying out new flows that no one thought of before. This latter type once again puts you in <a href="https://www.developingintest.com/p/developing-the-qa-mindset">the role of the tester from the three amigos planning session</a>. Now that you have a functioning app in front of you, you seek out edge cases that no one considered.</p><p>While regression testing is incredibly important, it&#8217;s not reflective of the QA mindset. By the time you&#8217;ve gotten to this style of testing, you have a strong sense of what is supposed to happen. You might even have a complete test plan that you&#8217;ve already run through before. This style of testing can quickly become mindless box-checking that does not play to the strengths of a human. What&#8217;s more, regression testing also has quickly diminishing returns. <a href="https://astqb.org/istqb-foundation-level-seven-testing-principles/">The Pesticide Paradox</a> tells us that the more times you run the same test, the less likely it is to catch a bug. All of these are reasons why we strive to offload regression testing to automated tools that are much cheaper than manual testing.</p><p>Acceptance testing seems like it would involve the QA mindset, but it&#8217;s possible to sidestep that mode of thinking while still verifying the feature. Consider the practice of QA parties. The act of writing a test plan offers us the opportunity to enter the QA mindset when identifying test cases. However, test cases can easily be pulled from the acceptance criteria of the feature, effectively just translating a set of requirements into a series of actions. Similarly, a developer going off-script during the QA party to try a new flow is an exploration, but QA parties frequently involve multiple developers running the same set of tests across different browsers, limiting the class of bugs they can catch. Furthermore, when the person writing the test plan is the same person that wrote the code, then the plan is susceptible to <a href="https://www.developingintest.com/p/developing-the-qa-mindset-distance">the same attentional bias we talked about in the last post</a>.</p><p>So regression testing has a diminishing probability of catching bugs, and acceptance testing typically confirms what we already expected to be true. How do we create space to find the unexpected bug? Ultimately, the most valuable asset humans bring to testing is our novel thinking, and we need time to express that through exploratory testing. This helps ferret out difficult to anticipate failure conditions and creates an overall more polished product for our users. This is the power of the QA mindset. That&#8217;s why we need to intentionally carve out time for high-leverage exploratory testing as part of our standard process, and it&#8217;s the reason why I advocate for peer testing at the pull request stage.</p><p>That&#8217;s all for now. If you have any thoughts about creating space for testing, feel free to drop them in the thread or pop into the comments. Next post we&#8217;ll talk about the most difficult aspect of the QA mindset: how to bring curiosity to your testing. Until then!</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.developingintest.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Developing In Test! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p></p>]]></content:encoded></item><item><title><![CDATA[Developing the QA Mindset: Distance From The Code]]></title><description><![CDATA[Hey folks! Today I wanted to talk about a key factor for stepping into the QA mindset: distance from the code.]]></description><link>https://www.developingintest.com/p/developing-the-qa-mindset-distance</link><guid isPermaLink="false">https://www.developingintest.com/p/developing-the-qa-mindset-distance</guid><dc:creator><![CDATA[Nathan Thompson]]></dc:creator><pubDate>Mon, 11 May 2026 15:15:33 GMT</pubDate><content:encoded><![CDATA[<p>Hey folks! I&#8217;m back again with another installment of the QA mindset series. Today I wanted to talk about a key factor for stepping into the QA mindset: distance from the code.</p><p>You may be wondering, why is distance from the code so fundamental to the QA mindset? Speaking for myself, I was a QA / SDET for 7+ years. I am very capable of testing things well. However, the difference between when I&#8217;m testing my own code versus when I&#8217;m testing someone else&#8217;s code is night and day. If I just spent a day hammering on a problem, and I finally get it to work, then I often only spend my time on narrow acceptance testing. If I&#8217;m coming in fresh to a change I&#8217;ve never seen before, I&#8217;m much more capable of approaching the task with the curiosity necessary for effective exploratory testing.</p><p>So what accounts for this difference? I attribute this to a form of attentional bias. Attentional bias is the tendency to focus on a particular stimulus that grabs our attention or is somehow emotionally charged, at the expense of missing other, less gripping information. When we as developers have been hard at work writing code, we are more likely to focus on the satisfaction of finishing a difficult feature than the work of ferreting out bugs hidden in edge cases. This inhibits our ability to step into the QA mindset, and it&#8217;s why I always advocate that someone other than the code owner should test a change during the pull request stage. This process is not without its cost. The reviewer needs to fully context switch to review mode, often stashing their own in-flight changes to load up a feature branch in their development environment. However, the cost of not doing so is a test run with blinders on.</p><p>This is also why it&#8217;s so important to have someone play the role of tester in the planning phase. As I described in my last post, the tester is one of the three amigos of planning, and is tasked with thinking about edge cases. Their attention is intentionally drawn away from how the feature should work as they are encouraged to focus on how the feature will break. This can be a difficult role to step into at first, so let&#8217;s take a moment to talk about frameworks for planning and writing work tickets that can make this easier. I&#8217;m a proponent of the INVEST framework, which states a ticket should be:</p><ul><li><p>Independent</p></li><li><p>Negotiable</p></li><li><p>Valuable</p></li><li><p>Estimable</p></li><li><p>Small</p></li><li><p>Testable</p></li></ul><p>I like to apply this framework to any ticket that gets reviewed in refinement or team planning. For teams new to INVEST, I would even suggest explicitly asking these questions for each ticket. &#8220;Is it Independent? Is it Negotiable? Is it Valuable? &#8230;&#8221; As you build this muscle, discussions about story writing will naturally occur in planning. Whether you&#8217;re an expert in this process or giving it a try for the first time, you&#8217;ll likely find that asking whether a ticket is testable inevitably leads to questions of how you will test it and what you will test. This works wonders for improving feature quality. When we create space for these discussions and normalize this mode of thinking, we begin to expand our attention beyond the narrow criteria of the feature. We step into the QA mindset and see the broader space this work occupies in the whole system.</p><p>That&#8217;s it for this post. Next time we&#8217;ll pick up again with a discussion of carving out time for testing!</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.developingintest.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p></p>]]></content:encoded></item><item><title><![CDATA[Developing the QA Mindset]]></title><description><![CDATA[The QA mindset is a state you need to enter in order to effectively test, well, anything really. In this series, I&#8217;ll detail how I developed my QA mindset.]]></description><link>https://www.developingintest.com/p/developing-the-qa-mindset</link><guid isPermaLink="false">https://www.developingintest.com/p/developing-the-qa-mindset</guid><dc:creator><![CDATA[Nathan Thompson]]></dc:creator><pubDate>Mon, 27 Apr 2026 15:16:02 GMT</pubDate><content:encoded><![CDATA[<p>Welcome folks! To kick off this Substack I wanted to dig into some practical aspects of actually testing code, so I&#8217;m starting with a series about &#10024;The QA Mindset&#10024;</p><p>As the name suggests, the QA mindset is a state of mind that a person needs to enter in order to effectively test, well, anything really. It prepares you to look at a piece of software objectively so that you can identify if it is ready to be sent to our users. Stepping into the QA mindset is a skill unto itself, and interviews for Quality Assurance Engineers typically try to ferret out how well a candidate can leverage this mode of thinking.</p><p>Over the next few posts I&#8217;ll try to capture how I approached the QA mindset during the 7+ years when manual testing was a core function of my work. However, before we get into the what and how of the matter, it&#8217;s important to understand <em>when</em> this mode of thinking should be applied. The obvious answer is that you need it when you are testing a piece of software. While this is objectively correct, if you&#8217;re waiting until a story is dev complete to leverage the QA mindset, then you are likely days if not weeks behind the curve. Discussions about testing should at least happen during story refinement, and for larger initiatives they should take place during product design.</p><p>To understand what those conversations look like, it&#8217;s useful to refer to Cucumber and the tenets of Behavior-Driven Development. Many of you may have used Cucumber as a testing tool, and if so you probably hated it. There&#8217;s a simple reason for that: Cucumber is not a testing tool. As its creators have said, Cucumber is <a href="https://cucumber.io/blog/collaboration/the-worlds-most-misunderstood-collaboration-tool/">the world&#8217;s most misunderstood collaboration tool</a>. Viewed through that lens, it&#8217;s no surprise that <a href="https://bookshop.org/p/books/the-cucumber-book-behaviour-driven-development-for-testers-and-developers-aslak-hellesoy/0565698f84ba85cb">The Cucumber Book</a> spends a significant amount of time discussing the practice of testing. This portion in particular has always stuck with me:</p><blockquote><p><strong>Three Amigos</strong></p><p>The best [test] scenarios are created when the three amigos come together, bringing three very different perspectives:</p><p>- The first amigo is a tester, who thinks about how to break things. The tester will typically come up with lots of scenarios, sometimes covering obscure edge cases and sometimes covering very important ones that no one else had thought of.</p><p>- The second amigo is a programmer, who thinks about how to make things. The programmer will typically add steps to scenarios, as he asks clarifying questions about what exactly should happen.</p><p>- The third amigo is the product owner, who cares about scope. When the tester thinks of scenarios that hit edge cases the product owner doesn&#8217;t care about, she can tell the team to drop that scenario out of scope altogether, or the group can decide to test it with unit tests only. When the programmer explains that implementing a particular scenario will be complicated, the product owner has the authority to help decide on alternatives or to drop it altogether.</p></blockquote><p>You may be wondering, what does that mean for my company that has not hired dedicated Quality Assurance Engineers to be the first amigo? It&#8217;s important to remember that &#8220;tester&#8221; is not a job description. It&#8217;s a role that <em>must</em> be filled on a team. If we do not hire engineers who specialize in that role, then the folks we have must develop the skills necessary to play it themselves. That means it&#8217;s incumbent upon all of us to develop our QA mindset.</p><p>Over the next few posts, I&#8217;ll be digging into the three key factors for effectively entering and leveraging the QA mindset: distance from the code, ample time to explore, and curiosity. Stay tuned!</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.developingintest.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p></p>]]></content:encoded></item></channel></rss>