<?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[Optivem Journal: ATDD]]></title><description><![CDATA[Acceptance Test Driven Development]]></description><link>https://journal.optivem.com/s/atdd</link><image><url>https://substackcdn.com/image/fetch/$s_!0CjJ!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F9abead4c-3f54-46b1-96aa-7033849416df_200x200.png</url><title>Optivem Journal: ATDD</title><link>https://journal.optivem.com/s/atdd</link></image><generator>Substack</generator><lastBuildDate>Tue, 19 May 2026 00:21:42 GMT</lastBuildDate><atom:link href="https://journal.optivem.com/feed" rel="self" type="application/rss+xml"/><copyright><![CDATA[Valentina Jemuović, Optivem]]></copyright><language><![CDATA[en]]></language><webMaster><![CDATA[optivem@substack.com]]></webMaster><itunes:owner><itunes:email><![CDATA[optivem@substack.com]]></itunes:email><itunes:name><![CDATA[Valentina Jemuović]]></itunes:name></itunes:owner><itunes:author><![CDATA[Valentina Jemuović]]></itunes:author><googleplay:owner><![CDATA[optivem@substack.com]]></googleplay:owner><googleplay:email><![CDATA[optivem@substack.com]]></googleplay:email><googleplay:author><![CDATA[Valentina Jemuović]]></googleplay:author><itunes:block><![CDATA[Yes]]></itunes:block><item><title><![CDATA[Stop Duplicating Acceptance Tests]]></title><description><![CDATA[How to avoid double maintenance costs]]></description><link>https://journal.optivem.com/p/stop-duplicating-acceptance-tests</link><guid isPermaLink="false">https://journal.optivem.com/p/stop-duplicating-acceptance-tests</guid><dc:creator><![CDATA[Valentina Jemuović]]></dc:creator><pubDate>Thu, 30 Apr 2026 06:01:47 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/c5981a40-eea9-44e2-bd83-620c6fb11704_1000x666.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><em>&#128274; Hello, this is Valentina with a premium issue of the Optivem Journal. I help Engineering Leaders &amp; Senior Software Developers apply <a href="https://journal.optivem.com/p/tdd-in-legacy-code-transformation">TDD in Legacy Code</a>.</em></p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://journal.optivem.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://journal.optivem.com/subscribe?"><span>Subscribe now</span></a></p><div><hr></div><p>Most developers test the same behavior twice.</p><p>Once through the API.<br>Once through the UI.</p><p>Two separate tests suites.<br>Two sets of assertions.<br>Double the maintenance costs.</p><p>And sooner or later?&#8230;</p><p>The API tests pass.<br>The UI tests fail randomly.<br>Nobody fully trusts either.</p><h2>&#9888;&#65039;Duplication is risky</h2><p>If you test both channels, you end up with two completely separate test suites:</p><ul><li><p>An API test suite that sends HTTP requests and checks JSON responses</p></li><li><p>A UI test suite that drives a browser with Selenium or Playwright</p></li></ul><p>Same scenarios. No shared structure. No shared assertions.</p><p>When a requirement changes, you update two tests instead of one.</p><p>Worse &#8212; the two suites start contradicting each other.</p><p>The API tests check one set of scenarios.<br>The UI tests check a slightly different set.</p><p>Gaps appear. Bugs hide in the gaps.</p><div><hr></div><p><strong>Want to skip the pain and go straight to the solution?</strong></p><p>I&#8217;m running a live, hands-on workshop where we build acceptance tests that run against both the API and UI &#8212; compile-time safe, IDE-guided and refactor-proof.</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://optivem.thinkific.com/products/courses/2026-05-27-acceptance-testing-workshop&quot;,&quot;text&quot;:&quot;Join the workshop &#8594;&quot;,&quot;action&quot;:null,&quot;class&quot;:&quot;button-wrapper&quot;}" data-component-name="ButtonCreateButton"><a class="button primary button-wrapper" href="https://optivem.thinkific.com/products/courses/2026-05-27-acceptance-testing-workshop"><span>Join the workshop &#8594;</span></a></p><p>Limited spots. Register now with the early bird discount - <strong>100 EUR off with code EARLYBIRD100 </strong></p><div><hr></div><h2>&#128161;What Changed Everything for Me</h2><p>Instead of writing the same test twice&#8230;</p>
      <p>
          <a href="https://journal.optivem.com/p/stop-duplicating-acceptance-tests">
              Read more
          </a>
      </p>
   ]]></content:encoded></item><item><title><![CDATA[ATDD – How Do You Actually Start?]]></title><description><![CDATA[Write acceptance tests that catch real bugs]]></description><link>https://journal.optivem.com/p/atdd-how-do-you-actually-start</link><guid isPermaLink="false">https://journal.optivem.com/p/atdd-how-do-you-actually-start</guid><dc:creator><![CDATA[Valentina Jemuović]]></dc:creator><pubDate>Tue, 24 Mar 2026 07:02:56 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/e3f1f2e8-7c96-4355-9d4f-fc834f4a447e_1000x666.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>&#128075; <em>Hello, this is Valentina with the free edition of the Optivem Journal. I help Engineering Leaders &amp; Senior Software Developers apply <a href="https://journal.optivem.com/p/tdd-in-legacy-code-transformation">TDD in Legacy Code</a>.</em></p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://journal.optivem.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://journal.optivem.com/subscribe?"><span>Subscribe now</span></a></p><div><hr></div><p>Every time I write about acceptance testing, someone asks:</p><blockquote><p>This makes sense. But how do I actually start?</p></blockquote><p>I&#8217;ve gotten this in DMs. In comments. In conversations with Tech Leads.</p><p>They understand <em>why</em> acceptance tests matter.<br>They&#8217;ve felt the pain of shipping bugs.<br>They&#8217;ve read about ATDD.</p><p>But when they sit down to actually write one?</p><p>They stare at a blank file and think:</p><ul><li><p>Where do you put the acceptance tests?</p></li><li><p>How do you structure them so they don&#8217;t become as fragile as the E2E tests you&#8217;re trying to replace?</p></li><li><p>How do you design them so your whole team can write and maintain them &#8212; not just the one person who &#8220;gets testing&#8221;?</p></li></ul><div><hr></div><p>You want tests that are:</p><p><strong>Clean. Readable. Runs in seconds. Survives refactors.</strong></p><p>But&#8230;</p><ul><li><p>How do you build the DSL that makes it work?</p></li><li><p>How do you wire up the Drivers that connect these tests to your actual system?</p></li><li><p>How do you structure all of this so it scales across your whole team?</p></li></ul><div><hr></div><h2>Hands-On Acceptance Testing</h2><p>That&#8217;s why I built a live, hands-on workshop.</p><p>This isn&#8217;t a course you watch alone at 2x speed and forget by Friday.</p><p><strong>What you&#8217;ll learn:</strong></p><p><strong>1. The architecture.</strong> How acceptance tests are structured &#8212; DSL, Drivers, the layers that make them maintainable. You&#8217;ll understand <em>why</em> some acceptance tests become unmaintainable spaghetti and yours won&#8217;t.</p><p><strong>2. ATDD Cycle with AI.</strong> We&#8217;ll design an acceptance test together &#8212; from a business scenario all the way through to verification. You&#8217;ll get to see the layers (DSL &amp; Drivers) in practice.</p><p><strong>3. Apply it with your team.</strong> How to introduce acceptance testing into an existing project without stopping everything. How to get buy-in. How to start.<br></p><p><strong>When:</strong> May 25&#8211;26, 2026 | 2-4 PM CET <br><em>(FYI: May 27&#8211;28 </em>| <em>5-7 PM CET &#8212; Fully Booked)</em><br><strong>Where:</strong> Live on Zoom<br><strong>Duration:</strong> 4 hours (2 sessions x 2 hours)</p><p>&#128187; <strong>Who it&#8217;s for:</strong> Senior Engineers and Tech Leads who are tired of shipping bugs and ready to do something about it</p><p>&#128640; <strong>Register:</strong> <strong><a href="https://optivem.thinkific.com/products/courses/2026-05-27-acceptance-testing-workshop">ATDD &#8211; Acceptance Testing Workshop</a><br>Get &#8364;100 off with code</strong> <strong>EARLYBIRD100</strong></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://optivem.thinkific.com/products/courses/2026-05-27-acceptance-testing-workshop" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!mYju!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb92ebee2-ad87-403e-93e4-709ea70fedaf_1280x720.png 424w, https://substackcdn.com/image/fetch/$s_!mYju!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb92ebee2-ad87-403e-93e4-709ea70fedaf_1280x720.png 848w, https://substackcdn.com/image/fetch/$s_!mYju!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb92ebee2-ad87-403e-93e4-709ea70fedaf_1280x720.png 1272w, https://substackcdn.com/image/fetch/$s_!mYju!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb92ebee2-ad87-403e-93e4-709ea70fedaf_1280x720.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!mYju!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb92ebee2-ad87-403e-93e4-709ea70fedaf_1280x720.png" width="1280" height="720" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/b92ebee2-ad87-403e-93e4-709ea70fedaf_1280x720.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:720,&quot;width&quot;:1280,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:185160,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:&quot;https://optivem.thinkific.com/products/courses/2026-05-27-acceptance-testing-workshop&quot;,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://journal.optivem.com/i/190817885?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb92ebee2-ad87-403e-93e4-709ea70fedaf_1280x720.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!mYju!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb92ebee2-ad87-403e-93e4-709ea70fedaf_1280x720.png 424w, https://substackcdn.com/image/fetch/$s_!mYju!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb92ebee2-ad87-403e-93e4-709ea70fedaf_1280x720.png 848w, https://substackcdn.com/image/fetch/$s_!mYju!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb92ebee2-ad87-403e-93e4-709ea70fedaf_1280x720.png 1272w, https://substackcdn.com/image/fetch/$s_!mYju!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb92ebee2-ad87-403e-93e4-709ea70fedaf_1280x720.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Don&#8217;t spend next month debugging something that should have been caught before it shipped.</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://optivem.thinkific.com/products/courses/2026-05-27-acceptance-testing-workshop&quot;,&quot;text&quot;:&quot;Join the workshop &#8594;&quot;,&quot;action&quot;:null,&quot;class&quot;:&quot;button-wrapper&quot;}" data-component-name="ButtonCreateButton"><a class="button primary button-wrapper" href="https://optivem.thinkific.com/products/courses/2026-05-27-acceptance-testing-workshop"><span>Join the workshop &#8594;</span></a></p><p>Limited spots. Register now with the early bird discount - <strong>&#8364;100 off with code EARLYBIRD100</strong></p>]]></content:encoded></item><item><title><![CDATA[The Architecture Behind Acceptance Tests That Don’t Break]]></title><description><![CDATA[How four layers turn fragile tests into executable specifications]]></description><link>https://journal.optivem.com/p/the-architecture-behind-acceptance-tests</link><guid isPermaLink="false">https://journal.optivem.com/p/the-architecture-behind-acceptance-tests</guid><dc:creator><![CDATA[Valentina Jemuović]]></dc:creator><pubDate>Thu, 19 Mar 2026 07:02:47 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/b6fda881-9471-4375-84a3-c79b75928fc9_1000x666.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><em>&#128274; Hello, this is Valentina with a premium issue of the Optivem Journal. I help Engineering Leaders &amp; Senior Software Developers apply <a href="https://journal.optivem.com/p/tdd-in-legacy-code-transformation">TDD in Legacy Code</a>.</em></p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://journal.optivem.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://journal.optivem.com/subscribe?"><span>Subscribe now</span></a></p><div><hr></div><p>This test doesn&#8217;t lie:</p><pre><code><code>scenario
    .given().product().withUnitPrice(20.00)
    .and().country().withCode("US").withTaxRate(0.08)
    .when().placeOrder().withQuantity(5).withCountry("US")
    .then().shouldSucceed()
    .and().order()
        .hasBasePrice(100.00)
        .hasTaxAmount(8.00)
        .hasTotalPrice(108.00);</code></code></pre><p>Clean. Readable. Runs in seconds. Survives refactors.</p><p>But how does it actually <em>work</em>?</p><p>What&#8217;s behind <code>.given().product().withUnitPrice(20.00)</code>? How does the same test run against both the API and the UI? Where does the &#8220;magic&#8221; come from?</p><p>I&#8217;m going to take this test apart, layer by layer, and show you exactly how the DSL is built.</p><div><hr></div><p><strong>&#9889;Ready to see this in action?</strong></p><p>I&#8217;m running a live, hands-on workshop where we build acceptance tests using this exact architecture. <strong>Every Release Is a Nightmare</strong> doesn&#8217;t have to be your reality.</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://optivem.thinkific.com/products/courses/2026-05-27-acceptance-testing-workshop&quot;,&quot;text&quot;:&quot;Join the workshop &#8594;&quot;,&quot;action&quot;:null,&quot;class&quot;:&quot;button-wrapper&quot;}" data-component-name="ButtonCreateButton"><a class="button primary button-wrapper" href="https://optivem.thinkific.com/products/courses/2026-05-27-acceptance-testing-workshop"><span>Join the workshop &#8594;</span></a></p><p>Limited spots. Register now with the early bird discount - <strong>100 EUR off with code EARLYBIRD100</strong></p><div><hr></div><h2>The four layers</h2><p>An acceptance test DSL has four layers. Each layer has one job, and they only talk to the layer directly below them:</p><pre><code><code>Test           &#8594;  what we're testing (the scenario)
DSL            &#8594;  how we express it (the fluent API)
Driver Port    &#8594;  what we need from the system (interfaces)
Driver Adapter &#8594;  how we interact with the system (API calls, browser clicks)</code></code></pre><p>This separation is the entire reason acceptance tests are maintainable. Remove any layer and the whole thing falls apart.</p><div><hr></div><h2>Layer 1: The Test</h2><p>This is what you&#8217;ve already seen. A test method that reads like a business scenario:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;java&quot;,&quot;nodeId&quot;:&quot;678b799c-be8a-40bc-9c92-5d0c0a1152ed&quot;}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-java">@TestTemplate
@Channel({ChannelType.UI, ChannelType.API})
void shouldCalculateCorrectTotalWithTaxRate() {
    scenario
        .given().product()
            .withUnitPrice(20.00)
        .and().country()
            .withCode("US")
            .withTaxRate(0.08)
        .when().placeOrder()
            .withQuantity(5)
            .withCountry("US")
        .then().shouldSucceed()
        .and().order()
            .hasBasePrice(100.00)
            .hasTaxAmount(8.00)
            .hasTotalPrice(108.00);
}</code></pre></div><p>Notice what&#8217;s <em>not</em> here:</p><ul><li><p>No URLs</p></li><li><p>No HTTP calls</p></li><li><p>No CSS selectors</p></li><li><p>No database queries</p></li><li><p>No setup or teardown</p></li></ul><p>The test only knows <em>what</em> it&#8217;s testing. It has no idea <em>how</em> the system works under the hood. That&#8217;s the point.</p><p>The <code>@Channel</code> annotation is interesting &#8212; it tells the test runner to execute this same test once through the API and once through the UI. Same scenario, same assertions, two completely different ways of talking to the system. Here&#8217;s how it actually works.</p>
      <p>
          <a href="https://journal.optivem.com/p/the-architecture-behind-acceptance-tests">
              Read more
          </a>
      </p>
   ]]></content:encoded></item><item><title><![CDATA[Unit Tests passed. The bug shipped anyway.]]></title><description><![CDATA[The Pipeline was green. All the unit tests passed. All the E2E Tests passed. Yet the feature was broken.]]></description><link>https://journal.optivem.com/p/unit-tests-passed-the-bug-shipped</link><guid isPermaLink="false">https://journal.optivem.com/p/unit-tests-passed-the-bug-shipped</guid><dc:creator><![CDATA[Valentina Jemuović]]></dc:creator><pubDate>Tue, 17 Mar 2026 07:02:09 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/8f43f40f-784c-4318-a654-30f46e384716_1000x666.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>&#128075; <em>Hello, this is Valentina with the free edition of the Optivem Journal. I help Engineering Leaders &amp; Senior Software Developers apply <a href="https://journal.optivem.com/p/tdd-in-legacy-code-transformation">TDD in Legacy Code</a>.</em></p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://journal.optivem.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://journal.optivem.com/subscribe?"><span>Subscribe now</span></a></p><div><hr></div><p>Marco stared at the Slack message from support.</p><p>&#8220;Customer says they were charged $110 on a $100 order. Tax should have been $8, not $10.&#8221;</p><p>He pulled up the dashboard. All tests green. CI/CD pipeline &#8212; clean. Not a single failure in weeks.</p><p>And yet, the tax calculation was wrong.</p><div><hr></div><p>Marco spent the next hour tracing the bug. The tax calculation itself was correct. The unit test proved it: pass in a rate, get back the right amount. No issues there.</p><p>The problem was simpler than that. And worse.</p><p>The developer who built the order service had hardcoded the tax rate as a constant &#8212; 10% &#8212; while working on the feature. The plan was to pull it from the country configuration later.</p><p>But &#8220;later&#8221; never came.</p><p>The feature shipped, the tests passed, and nobody noticed.</p><p>The unit test for the tax calculation? It tested the math. And the math was right. 10% of $100 is $10. Test passes.</p><p>But the <em>feature</em> was wrong. The customer was in a state with an 8% tax rate, and the system charged 10% because it never actually looked up the rate.</p><p>E2E tests? They had those too. But the E2E test just checked that the confirmation page appeared after placing an order. It never verified the actual total.</p><p><strong>The feature was broken. And no test caught it.</strong></p><div><hr></div><p>Here&#8217;s the uncomfortable truth most teams don&#8217;t talk about:</p><p><strong>Unit tests</strong> verify that individual components work. They can&#8217;t tell you whether the <em>feature</em> works. Marco&#8217;s tax calculation was correct &#8212; it just used the wrong input.</p><p><strong>E2E tests</strong> verify the happy path through the UI. But they&#8217;re slow, fragile, and they often check that <em>something</em> shows up on screen, not that the <em>right thing</em> shows up.</p><p>There&#8217;s a massive gap between &#8220;all my unit tests pass&#8221; and &#8220;this feature actually works as the customer expects.&#8221;</p><p>That gap is where your production bugs live.</p><div><hr></div><h2>There&#8217;s a test type that fills this gap</h2><p>It&#8217;s called an <strong>acceptance test</strong>.</p><p>Not another E2E test. Something fundamentally different.</p><p>An acceptance test is an executable specification of system behavior. It answers one question: <em>does this feature work the way the business expects?</em></p><p>Here&#8217;s what Marco&#8217;s E2E test looked like:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;java&quot;,&quot;nodeId&quot;:&quot;f33e61f9-46d3-4427-a4d4-80449890cf4c&quot;}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-java">@Test
void testPlaceOrder() {
    driver.get(baseUrl + "/products");
    driver.findElement(By.id("product-1")).click();
    driver.findElement(By.id("add-to-cart")).click();
    driver.findElement(By.id("quantity")).sendKeys("5");
    driver.findElement(By.id("checkout")).click();
    driver.findElement(By.id("place-order")).click();

    WebElement confirmation = driver.findElement(By.id("confirmation"));
    assertTrue(confirmation.isDisplayed());
}</code></pre></div><p>Brittle. Tied to the UI. Breaks if someone renames a button. And it only checks if the confirmation page shows up &#8212; it never verified the actual total.</p><p>Here&#8217;s the same scenario as an acceptance test:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;java&quot;,&quot;nodeId&quot;:&quot;b587750e-fb39-4b9f-b945-4590bcf507a9&quot;}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-java">@Test
void shouldCalculateCorrectTotalWithTaxRate() {
    scenario
        .given().product()
            .withUnitPrice(20.00)
        .and().country()
            .withCode("US")
            .withTaxRate(0.08)
        .when().placeOrder()
            .withQuantity(5)
            .withCountry("US")
        .then().shouldSucceed()
        .and().order()
            .hasBasePrice(100.00)
            .hasTaxAmount(8.00)
            .hasTotalPrice(108.00);
}</code></pre></div><p>No browser. No CSS selectors. No flaky waits.</p><p>Just a clear business scenario: <em>given a product at $20, a quantity of 5, and a country with 8% tax &#8212; the base price should be $100, the tax should be $8, and the total should be $108.</em></p><p>This test would have caught Marco&#8217;s bug immediately. The system would return a total of $110 instead of $108 &#8212; test fails. The hardcoded constant would have been found before it ever reached a customer.</p><p>Marco&#8217;s team? After they introduced acceptance tests, customer-reported bugs dropped dramatically in the first few months. Not because they wrote more tests &#8212; but because they wrote the <em>right</em> tests.</p><div><hr></div><h2>Want to learn how to write tests like this?</h2><p>I&#8217;m running a live workshop: <strong><a href="https://optivem.thinkific.com/products/courses/2026-05-27-acceptance-testing-workshop">Stop Shipping Bugs: Acceptance Tests Workshop</a></strong>.</p><p>4 hours. Two evenings. Live on Zoom, with me.</p><p>&#9889;I&#8217;ll walk you through the full architecture &#8212; DSL, Drivers, how it all fits together &#8212; and by the end, you&#8217;ll have written a real acceptance test from scenario to assertion.</p><p>&#128197; May 27-28, 5:00-7:00 PM CET</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://optivem.thinkific.com/products/courses/2026-05-27-acceptance-testing-workshop&quot;,&quot;text&quot;:&quot;Join the workshop &#8594;&quot;,&quot;action&quot;:null,&quot;class&quot;:&quot;button-wrapper&quot;}" data-component-name="ButtonCreateButton"><a class="button primary button-wrapper" href="https://optivem.thinkific.com/products/courses/2026-05-27-acceptance-testing-workshop"><span>Join the workshop &#8594;</span></a></p><p>Limited spots. Register now with the early bird discount - <strong>100 EUR off with code EARLYBIRD100</strong></p><p>&#8212; Valentina</p>]]></content:encoded></item><item><title><![CDATA[Stop Writing Fragile Gherkin]]></title><description><![CDATA[The Gherkin maintenance nightmare and how to solve it]]></description><link>https://journal.optivem.com/p/stop-writing-fragile-gherkin</link><guid isPermaLink="false">https://journal.optivem.com/p/stop-writing-fragile-gherkin</guid><dc:creator><![CDATA[Valentina Jemuović]]></dc:creator><pubDate>Fri, 06 Mar 2026 07:02:50 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/04d4e881-6a81-4643-b30e-770a52a748bf_1000x666.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><em>&#128274; Hello, this is Valentina with a premium issue of the Optivem Journal. I help Engineering Leaders &amp; Senior Software Developers apply <a href="https://journal.optivem.com/p/tdd-in-legacy-code-transformation">TDD in Legacy Code</a>.</em></p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://journal.optivem.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://journal.optivem.com/subscribe?"><span>Subscribe now</span></a></p><div><hr></div><p>If you&#8217;ve ever written acceptance tests in plain-text Gherkin, you probably had the same thought I did:</p><p>&#8220;This looks clean&#8230; so why is it so painful to maintain?&#8221;</p><p>Gherkin was supposed to let product owners write specifications.</p><p>But in reality?</p><p>Almost never happens.</p><p>Developers write the <code>.feature</code> files.<br>Developers maintain them.<br>Developers debug them at runtime.</p><p>Most teams follow the usual setup: they write Gherkin scenarios in <code>.feature</code> files using Cucumber (Java), SpecFlow (.NET) or Cucumber.js (TypeScript).</p><p>At first glance, it looks great:</p><p>English sentences.<br>Given / When / Then.</p><p>But&#8230; </p><h2>&#9888;&#65039;The Hidden Cost of Textual Gherkin</h2><p>Scenario files look readable, but become a maintenance burden:</p><pre><code><code>Scenario: Calculate base price as product of unit price and quantity
  Given a product with unit price $20.00
  When an order is placed for that product with quantity 5
  Then the order placement should succeed
  And the order base price should be $100.00</code></code></pre><p><strong>Duplication everywhere</strong></p><p>That sentence in the <code>.feature</code> file?</p><p>You repeat it again in step definitions (&#8220;glue code&#8220;).</p><p>Change one word?<br>Now you change it in multiple places:</p><ul><li><p>Change it in the step definition</p></li><li><p>Change it in all affected test scenarios</p></li></ul><p><strong>Typos = runtime failure</strong></p><p>Misspell a word?</p><p>You won&#8217;t know until you run the test.</p><p>The compiler doesn&#8217;t help you.</p><p>Your IDE doesn&#8217;t help you.</p><p>You only find out after everything compiles&#8230; and then fails.</p><p><strong>You&#8217;re on your own.</strong></p><p>No auto-complete.<br>No &#8220;what comes next?&#8221;<br>No guardrails.</p><p>You have to remember exact sentences.</p><p>And nothing prevents you from:</p><ul><li><p>Writing two <code>When</code> steps</p></li><li><p>Writing steps that don&#8217;t exist</p></li><li><p>Mixing domain concepts accidentally</p></li></ul><p>It&#8217;s fragile by design.</p><div><hr></div><p><strong>Want to skip the pain and go straight to the solution?</strong></p><p>I&#8217;m running a live workshop where we build acceptance tests that are compile-time safe, IDE-guided, and refactor-proof &#8212; no .feature files, no glue code.</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://optivem.thinkific.com/products/courses/2026-05-27-acceptance-testing-workshop&quot;,&quot;text&quot;:&quot;Join the workshop &#8594;&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://optivem.thinkific.com/products/courses/2026-05-27-acceptance-testing-workshop"><span>Join the workshop &#8594;</span></a></p><p>Limited spots. Register now with the early bird discount - <strong>100 EUR off with code EARLYBIRD100 </strong></p><div><hr></div><h2>&#128161;What Changed Everything for Me</h2><p>Instead of writing English sentences and matching them with strings&#8230;</p>
      <p>
          <a href="https://journal.optivem.com/p/stop-writing-fragile-gherkin">
              Read more
          </a>
      </p>
   ]]></content:encoded></item><item><title><![CDATA[Fluent DSL for Acceptance Tests: No More Typos, No More Try/Catch]]></title><description><![CDATA[Tests failed for all the wrong reasons&#8212;like typos]]></description><link>https://journal.optivem.com/p/fluent-dsl-for-acceptance-tests</link><guid isPermaLink="false">https://journal.optivem.com/p/fluent-dsl-for-acceptance-tests</guid><dc:creator><![CDATA[Valentina Jemuović]]></dc:creator><pubDate>Tue, 23 Dec 2025 07:01:25 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/d03a109a-b91c-44e4-ae49-883c77b129f0_1000x666.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>&#128197; Join me for <strong><a href="https://optivem.thinkific.com/products/live_events/2026-02-25-acceptance-testing-live-training">Acceptance Testing (Live Training)</a></strong> on Wed 25th Feb (17:00 - 19:00 CET) <em>(100% discount for Optivem Journal paid members)</em></p><div><hr></div><p><em>&#128274; Hello, this is Valentina with a premium issue of the Optivem Journal. I help Engineering Leaders &amp; Senior Software Developers apply <a href="https://journal.optivem.com/p/tdd-in-legacy-code-transformation">TDD in Legacy Code</a>.</em></p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://journal.optivem.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://journal.optivem.com/subscribe?"><span>Subscribe now</span></a></p><div><hr></div><p>I used to hate writing acceptance tests.</p><p>I&#8217;d spend hours writing tests that either:</p><ul><li><p>failed for silly reasons (&#8220;Did I spell that parameter right?&#8221;), or</p></li><li><p>passed even though they shouldn&#8217;t (&#8220;Why is this green? That&#8217;s broken!&#8221;)</p></li></ul><p>It was frustrating, demotivating, and exhausting. And the worst part? I wasn&#8217;t even learning anything from the tests.</p><h2>The Old Way: What I used to do</h2><p>Here&#8217;s a typical test I used to write:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;java&quot;,&quot;nodeId&quot;:&quot;773337f3-72d0-4bae-92c8-ca0957773de5&quot;}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-java">@Test
@Channel(UI, API)
public void shouldPlaceOrder() {
    erp.setupProduct("sku: ABC", "unitPrice: 2.00");
    shop.placeOrder("orderNumber: ORD-1001", "sku: ABC", "quantity: 5");
    shop.assertOrderDetails("orderNumber: ORD-1001", "totalPrice": "10.00");
}</code></pre></div><ul><li><p><strong>Parameter names everywhere</strong>&#8212;I had to remember exact strings like <code>&#8220;InvoiceSubmitter1&#8221;</code> or <code>&#8220;invoice1&#8221;</code>. One typo and the test failed or, worse, passed incorrectly.</p></li></ul><p>For errors, I&#8217;d need to have try/catch:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;java&quot;,&quot;nodeId&quot;:&quot;35007e94-553a-4c9e-93ef-4fc460dcc84f&quot;}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-java">@Test
@Channel(UI, API)
public void shouldNotBeAbleToPlaceOrderWithNegativeQuantity() {
    try {
        erp.setupProduct("sku: ABC", "unitPrice: 2.00");
        shop.placeOrder("orderNumber: ORD-1001", "sku: ABC", "quantity: -2");
    } catch(Exception ex) {
        assertEquals("Quantity must be positive", ex.getMessage());
    }
}</code></pre></div><ul><li><p><strong>Too much try/catch</strong>&#8212;I had to catch exceptions just to check if something failed.</p></li></ul><p>Sound familiar?</p><p>It worked&#8230;sort of. But it was frustrating.</p><h2>Writing Tests Without the Headache</h2><p>I realized the problem wasn&#8217;t testing itself.</p><p>The problem was how I was writing the tests.</p><p>I wanted the IDE to guide me while writing tests&#8212;so mistakes show up at compile time, not during a test run.</p>
      <p>
          <a href="https://journal.optivem.com/p/fluent-dsl-for-acceptance-tests">
              Read more
          </a>
      </p>
   ]]></content:encoded></item><item><title><![CDATA[ATDD: 90% test automation with AI]]></title><description><![CDATA[&#8220;We spent so much time on maintenance when using Selenium, and we spend nearly zero time with maintenance using testRigor.&#8221; - Keith Powe, VP of Engineering, IDT]]></description><link>https://journal.optivem.com/p/atdd-90-test-automation-with-ai</link><guid isPermaLink="false">https://journal.optivem.com/p/atdd-90-test-automation-with-ai</guid><dc:creator><![CDATA[Valentina Jemuović]]></dc:creator><pubDate>Tue, 25 Nov 2025 07:01:50 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/1d148bb4-f49e-447f-b281-719095ca42c8_1000x666.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>&#128075; <em>Hello, this is Valentina with the free edition of the Optivem Journal. I help Engineering Leaders &amp; Senior Software Developers apply <a href="https://journal.optivem.com/p/tdd-in-legacy-code-transformation">TDD in Legacy Code</a>.</em></p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://journal.optivem.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://journal.optivem.com/subscribe?"><span>Subscribe now</span></a></p><div><hr></div><p><em>This post is sponsored by <a href="https://testrigor.com/request-demo/?utm_source=valentina">testRigor</a>, the #1 Generative AI-based Test Automation Tool.</em></p><h2>The problem with Manual QA Testing</h2><p>Many teams are still stuck with manual regression testing. QA Engineers document test procedures in Word, Confluence, etc., and spend most of their time executing tests. This is repetitive, slow, and error-prone.</p><p>For example, a two-week manual QA cycle often repeats: QA finds regression bugs &#8594; developers fix the regression bugs &#8594; QA retests &#8594; QA discovers new regression bugs. This can continue indefinitely. Consequently, these problems occur:</p><ol><li><p><strong>Slow Delivery</strong> - Manual regression testing cycles take too long, which delays the entire delivery process. Business is frustrated, blaming IT for being too slow.</p></li><li><p><strong>Production Bugs</strong> - Due to release deadlines, timeboxed testing means some tests are skipped, letting regression bugs reach production.</p></li><li><p><strong>Compliance Risks </strong>- In highly regulated industries (e.g., medical/healthcare), manual screenshot documentation slows down QA and risks human error and non-compliance.</p></li><li><p><strong>Salary Costs</strong> - As the software grows, the number of regression bugs increases. Companies have to hire more QA engineers just to keep up, but it&#8217;s never enough.</p></li></ol><h2>Why Test Automation is too expensive</h2><p><strong>Attempt 1: E2E Tests with Selenium (or Playwright, Cypress, etc.)</strong></p><p>Companies may buy record-and-play tools that generate Selenium E2E tests, or their QA Automation Engineers write Selenium tests by hand.</p><p>But these tests are fragile since they&#8217;re tightly coupled to implementation details. Small UI changes (e.g., changing a button&#8217;s CSS) can break many tests, forcing QA Automation Engineers to spend a lot of time fixing up those failing tests, leaving little time to test new functionality. For example, a company may have automated 30% of tests in the first year, 35% of tests in the second year, but then stalled because maintenance costs were too high.</p><p><strong>Attempt 2: E2E Tests with AI Tools</strong></p><p>Writing and maintaining Selenium Tests was too expensive, so teams turned to AI tools that looked promising - you could write the tests in plain English, instead of Selenium. Manual QA Engineers could automate tests without QA Automation Engineers.</p><p>But those AI tools may lack abstraction, i.e., be coupled to UI implementation details (XPath or CSS Selectors), so UI changes break the tests.</p><p>Even worse, when the tool can&#8217;t find a UI element, it falls back to using AI. But AI can hallucinate&#8212;generate incorrect or misleading test results that require human intervention to fix&#8212;which can be <strong>more expensive than manual testing</strong>. For example, AI can give the wrong coordinates of an element.</p><h2>Why Test Automation doesn&#8217;t solve high rework cost</h2><p>Traditional test automation happens <strong>after</strong> code is written. If QA discovers developers misinterpreted specs, it&#8217;s too late. QA Automation Engineers end up writing tests that follow the implementation, even though it&#8217;s wrong. When misinterpretations are caught, developers have to fix the code, and QA Automation Engineers have to play catch-up by updating the tests.</p><p>Meanwhile, the team is working on the next sprint, so the QA Automation Engineer is now both catching up on existing features <strong>and</strong> writing tests for new ones. This is not sustainable.</p><h2>ATDD is the solution</h2><ol><li><p><strong>Tests must be abstracted away from implementation details. </strong>We want to write tests in plain English &#8212; not tied to CSS selectors or XPath.</p></li><li><p><strong>Tests should be written before coding starts. </strong>We want to ensure that the whole team (PO, Developers, QA Engineers) is aligned on the specifications before coding begins, to avoid costly rework later.</p></li></ol><p>With ATDD, we start with a specification, convert it into an executable specification (acceptance test), and write code to make the tests pass. Thus, with ATDD, test automation is done <strong>before</strong> coding. You write executable specifications in plain English, so Product Owners can review and correct them before the developers start coding. This step alone can save <strong>30&#8211;35% of engineering time</strong> due to precise requirements.</p><h2>ATDD with the Four Layer Model</h2><p>The most well-known approach for ATDD uses Dave Farley&#8217;s <a href="https://dojoconsortium.org/assets/ATDD%20-%20How%20to%20Guide.pdf">Four Layer Model</a>. Tests are written in a DSL decoupled from implementation, thus the tests are readable as requirements. The DSL calls Drivers, e.g., Web UI Drivers (using Selenium with XPath/CSS), API Drivers (using HTTP Client), Mobile App Drivers, CLI Drivers, etc. Furthermore, by annotating tests with channels, we can write a test once and execute it against multiple channels.</p><p>Designing this maintainable Acceptance Test Architecture requires a strong design skillset and time investment. Anyone can write these tests (e.g., QA Engineer), but Developers need to maintain the &#8220;plumbing&#8221; (DSL, Channels &amp; Drivers) and fix test failures. In case of changes to the UI, Developers need to update Drivers without having to change tests; this helps reduce maintenance costs.</p><p>The reality is that in many teams, executives want results &#8220;right now&#8221;; they want to immediately convert their whole Manual QA Test Suite into automated testing. This can&#8217;t be done overnight with the Four Layer Model.</p><h2>ATDD with testRigor</h2><p>In testRigor, tests are written in plain English, decoupled from UI implementation details. Manual QA Engineers can write the tests themselves. There&#8217;s no &#8220;plumbing&#8221; code, which means that (1) Developers and QA Automation Engineers aren&#8217;t needed to write tests, (2) when developers change the UI, the tests don&#8217;t have to be changed.</p><p>When adopting ATDD with testRigor, QA Engineers write a failing test in plain English, and developers can write code (or let testRigor generate code) to make the test pass.</p><p><em>Note: testRigor usually detects UI elements from plain English steps. If it fails, you can add custom code, creating &#8220;plumbing&#8221; to maintain. The amount of maintenance needed depends on your product and how often custom detection is required.</em></p><h3>Phase 1 - Migrating Manual Tests to testRigor</h3><p>Manual QA Engineers can import their Manual Test Procedures into testRigor (which recognizes plain-English steps). We can connect testRigor to our test source (e.g., JIRA / TestRail, etc.), or we can create the tests ourselves in testRigor.</p><p><em>Note: If we do not have documented test cases, we can use testRigor to generate test cases by providing our application URL and a description of the application domain. Then testRigor uses AI to generate the test cases.</em></p><p>We can view and edit the imported tests, e.g., &#8216;Find and add Kindle to the shopping cart&#8217;:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!WknT!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb20ef295-3973-4812-922f-18c4f643a30f_1822x818.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!WknT!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb20ef295-3973-4812-922f-18c4f643a30f_1822x818.png 424w, https://substackcdn.com/image/fetch/$s_!WknT!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb20ef295-3973-4812-922f-18c4f643a30f_1822x818.png 848w, https://substackcdn.com/image/fetch/$s_!WknT!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb20ef295-3973-4812-922f-18c4f643a30f_1822x818.png 1272w, https://substackcdn.com/image/fetch/$s_!WknT!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb20ef295-3973-4812-922f-18c4f643a30f_1822x818.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!WknT!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb20ef295-3973-4812-922f-18c4f643a30f_1822x818.png" width="1456" height="654" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/b20ef295-3973-4812-922f-18c4f643a30f_1822x818.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:654,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:177146,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://journal.optivem.com/i/174917222?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb20ef295-3973-4812-922f-18c4f643a30f_1822x818.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!WknT!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb20ef295-3973-4812-922f-18c4f643a30f_1822x818.png 424w, https://substackcdn.com/image/fetch/$s_!WknT!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb20ef295-3973-4812-922f-18c4f643a30f_1822x818.png 848w, https://substackcdn.com/image/fetch/$s_!WknT!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb20ef295-3973-4812-922f-18c4f643a30f_1822x818.png 1272w, https://substackcdn.com/image/fetch/$s_!WknT!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb20ef295-3973-4812-922f-18c4f643a30f_1822x818.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Above, several steps were successfully recognized by testRigor, and are thus able to be executed deterministically (no AI involved).</p><p>However, when a step is not recognized (e.g., the last one), we can fall back to AI by clicking &#8220;Use AI to complete creating this test&#8221;:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!lxG8!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faf1178ba-3698-4c95-975f-94923ca93495_1028x381.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!lxG8!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faf1178ba-3698-4c95-975f-94923ca93495_1028x381.png 424w, https://substackcdn.com/image/fetch/$s_!lxG8!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faf1178ba-3698-4c95-975f-94923ca93495_1028x381.png 848w, https://substackcdn.com/image/fetch/$s_!lxG8!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faf1178ba-3698-4c95-975f-94923ca93495_1028x381.png 1272w, https://substackcdn.com/image/fetch/$s_!lxG8!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faf1178ba-3698-4c95-975f-94923ca93495_1028x381.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!lxG8!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faf1178ba-3698-4c95-975f-94923ca93495_1028x381.png" width="1028" height="381" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/af1178ba-3698-4c95-975f-94923ca93495_1028x381.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:381,&quot;width&quot;:1028,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:95613,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://journal.optivem.com/i/174917222?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faf1178ba-3698-4c95-975f-94923ca93495_1028x381.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!lxG8!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faf1178ba-3698-4c95-975f-94923ca93495_1028x381.png 424w, https://substackcdn.com/image/fetch/$s_!lxG8!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faf1178ba-3698-4c95-975f-94923ca93495_1028x381.png 848w, https://substackcdn.com/image/fetch/$s_!lxG8!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faf1178ba-3698-4c95-975f-94923ca93495_1028x381.png 1272w, https://substackcdn.com/image/fetch/$s_!lxG8!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faf1178ba-3698-4c95-975f-94923ca93495_1028x381.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Then AI generates UI steps for the unrecognized custom step above:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!y6NX!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F122f5d05-e844-48ee-b960-4f4783263880_1694x1078.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!y6NX!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F122f5d05-e844-48ee-b960-4f4783263880_1694x1078.png 424w, https://substackcdn.com/image/fetch/$s_!y6NX!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F122f5d05-e844-48ee-b960-4f4783263880_1694x1078.png 848w, https://substackcdn.com/image/fetch/$s_!y6NX!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F122f5d05-e844-48ee-b960-4f4783263880_1694x1078.png 1272w, https://substackcdn.com/image/fetch/$s_!y6NX!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F122f5d05-e844-48ee-b960-4f4783263880_1694x1078.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!y6NX!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F122f5d05-e844-48ee-b960-4f4783263880_1694x1078.png" width="1456" height="927" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/122f5d05-e844-48ee-b960-4f4783263880_1694x1078.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:927,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:212891,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://journal.optivem.com/i/174917222?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F122f5d05-e844-48ee-b960-4f4783263880_1694x1078.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!y6NX!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F122f5d05-e844-48ee-b960-4f4783263880_1694x1078.png 424w, https://substackcdn.com/image/fetch/$s_!y6NX!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F122f5d05-e844-48ee-b960-4f4783263880_1694x1078.png 848w, https://substackcdn.com/image/fetch/$s_!y6NX!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F122f5d05-e844-48ee-b960-4f4783263880_1694x1078.png 1272w, https://substackcdn.com/image/fetch/$s_!y6NX!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F122f5d05-e844-48ee-b960-4f4783263880_1694x1078.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>The QA Engineer can review and correct the generated steps. When AI &#8220;hallucinates&#8221;, the QA Engineer can manually correct steps. After the QA Engineer&#8217;s cleanup, here&#8217;s the updated test:</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!0X_u!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6ed84f22-2bc6-4128-9a84-45accd750e8e_1698x352.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!0X_u!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6ed84f22-2bc6-4128-9a84-45accd750e8e_1698x352.png 424w, https://substackcdn.com/image/fetch/$s_!0X_u!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6ed84f22-2bc6-4128-9a84-45accd750e8e_1698x352.png 848w, https://substackcdn.com/image/fetch/$s_!0X_u!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6ed84f22-2bc6-4128-9a84-45accd750e8e_1698x352.png 1272w, https://substackcdn.com/image/fetch/$s_!0X_u!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6ed84f22-2bc6-4128-9a84-45accd750e8e_1698x352.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!0X_u!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6ed84f22-2bc6-4128-9a84-45accd750e8e_1698x352.png" width="1456" height="302" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/6ed84f22-2bc6-4128-9a84-45accd750e8e_1698x352.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:302,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:59597,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://journal.optivem.com/i/174917222?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6ed84f22-2bc6-4128-9a84-45accd750e8e_1698x352.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!0X_u!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6ed84f22-2bc6-4128-9a84-45accd750e8e_1698x352.png 424w, https://substackcdn.com/image/fetch/$s_!0X_u!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6ed84f22-2bc6-4128-9a84-45accd750e8e_1698x352.png 848w, https://substackcdn.com/image/fetch/$s_!0X_u!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6ed84f22-2bc6-4128-9a84-45accd750e8e_1698x352.png 1272w, https://substackcdn.com/image/fetch/$s_!0X_u!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6ed84f22-2bc6-4128-9a84-45accd750e8e_1698x352.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p>The test passes!</p><p><em>Note: This new step becomes a reusable step, recognized when parsing further Manual QA test procedures, even if sentences aren&#8217;t identical.</em></p><p>To summarize, we import a batch of Manual Test Procedures, clean them up, and then repeat with the next batch. This means we can quickly automate a high percentage of Manual Tests.</p><h3>Phase 2 - Applying ATDD with TestRigor</h3><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Q9fO!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbdc3b6ad-ad69-4f8b-8270-3a24e3c2ac16_1337x747.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Q9fO!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbdc3b6ad-ad69-4f8b-8270-3a24e3c2ac16_1337x747.png 424w, https://substackcdn.com/image/fetch/$s_!Q9fO!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbdc3b6ad-ad69-4f8b-8270-3a24e3c2ac16_1337x747.png 848w, https://substackcdn.com/image/fetch/$s_!Q9fO!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbdc3b6ad-ad69-4f8b-8270-3a24e3c2ac16_1337x747.png 1272w, https://substackcdn.com/image/fetch/$s_!Q9fO!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbdc3b6ad-ad69-4f8b-8270-3a24e3c2ac16_1337x747.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Q9fO!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbdc3b6ad-ad69-4f8b-8270-3a24e3c2ac16_1337x747.png" width="498" height="278.23934181002244" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/bdc3b6ad-ad69-4f8b-8270-3a24e3c2ac16_1337x747.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:747,&quot;width&quot;:1337,&quot;resizeWidth&quot;:498,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!Q9fO!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbdc3b6ad-ad69-4f8b-8270-3a24e3c2ac16_1337x747.png 424w, https://substackcdn.com/image/fetch/$s_!Q9fO!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbdc3b6ad-ad69-4f8b-8270-3a24e3c2ac16_1337x747.png 848w, https://substackcdn.com/image/fetch/$s_!Q9fO!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbdc3b6ad-ad69-4f8b-8270-3a24e3c2ac16_1337x747.png 1272w, https://substackcdn.com/image/fetch/$s_!Q9fO!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbdc3b6ad-ad69-4f8b-8270-3a24e3c2ac16_1337x747.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p><strong>RED - Write the failing test</strong></p><p>For a user story, write testable acceptance criteria. Based on this, the QA Engineer writes a test in plain English, and inputs it into testRigor. As testRigor executes the test, the QA Engineer can edit custom steps. If AI hallucinates, the QA Engineer can make corrections and clean up the steps, then ask AI to continue until the test is successfully written down.</p><p>When testRigor runs the test, it should fail because the functionality isn&#8217;t implemented yet - causing testRigor to report an error:</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!kGqs!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3ffc0026-3e23-4915-bd05-15faf0c3c388_2906x408.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!kGqs!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3ffc0026-3e23-4915-bd05-15faf0c3c388_2906x408.png 424w, https://substackcdn.com/image/fetch/$s_!kGqs!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3ffc0026-3e23-4915-bd05-15faf0c3c388_2906x408.png 848w, https://substackcdn.com/image/fetch/$s_!kGqs!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3ffc0026-3e23-4915-bd05-15faf0c3c388_2906x408.png 1272w, https://substackcdn.com/image/fetch/$s_!kGqs!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3ffc0026-3e23-4915-bd05-15faf0c3c388_2906x408.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!kGqs!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3ffc0026-3e23-4915-bd05-15faf0c3c388_2906x408.png" width="1456" height="204" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/3ffc0026-3e23-4915-bd05-15faf0c3c388_2906x408.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:204,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:120035,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://journal.optivem.com/i/174917222?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3ffc0026-3e23-4915-bd05-15faf0c3c388_2906x408.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!kGqs!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3ffc0026-3e23-4915-bd05-15faf0c3c388_2906x408.png 424w, https://substackcdn.com/image/fetch/$s_!kGqs!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3ffc0026-3e23-4915-bd05-15faf0c3c388_2906x408.png 848w, https://substackcdn.com/image/fetch/$s_!kGqs!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3ffc0026-3e23-4915-bd05-15faf0c3c388_2906x408.png 1272w, https://substackcdn.com/image/fetch/$s_!kGqs!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3ffc0026-3e23-4915-bd05-15faf0c3c388_2906x408.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p><em>Note: When writing Acceptance Tests, we need to stub out external systems. To support us, testRigor provides a way to mock APIs on the network, see <a href="https://testrigor.com/docs/language#mocking_api_calls">mocking api calls</a>.</em></p><p><strong>GREEN - Write the code to make the test pass</strong></p><p>We can use testRigor to generate code to make the tests pass. For a failing test, click &#8220;Fix code for me&#8221; so that AI can generate the necessary code:</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Py6m!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffa021fcd-ff08-4742-b71e-0bc31b52fa25_940x176.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Py6m!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffa021fcd-ff08-4742-b71e-0bc31b52fa25_940x176.png 424w, https://substackcdn.com/image/fetch/$s_!Py6m!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffa021fcd-ff08-4742-b71e-0bc31b52fa25_940x176.png 848w, https://substackcdn.com/image/fetch/$s_!Py6m!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffa021fcd-ff08-4742-b71e-0bc31b52fa25_940x176.png 1272w, https://substackcdn.com/image/fetch/$s_!Py6m!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffa021fcd-ff08-4742-b71e-0bc31b52fa25_940x176.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Py6m!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffa021fcd-ff08-4742-b71e-0bc31b52fa25_940x176.png" width="262" height="49.05531914893617" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/fa021fcd-ff08-4742-b71e-0bc31b52fa25_940x176.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:176,&quot;width&quot;:940,&quot;resizeWidth&quot;:262,&quot;bytes&quot;:24029,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://journal.optivem.com/i/174917222?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffa021fcd-ff08-4742-b71e-0bc31b52fa25_940x176.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!Py6m!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffa021fcd-ff08-4742-b71e-0bc31b52fa25_940x176.png 424w, https://substackcdn.com/image/fetch/$s_!Py6m!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffa021fcd-ff08-4742-b71e-0bc31b52fa25_940x176.png 848w, https://substackcdn.com/image/fetch/$s_!Py6m!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffa021fcd-ff08-4742-b71e-0bc31b52fa25_940x176.png 1272w, https://substackcdn.com/image/fetch/$s_!Py6m!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffa021fcd-ff08-4742-b71e-0bc31b52fa25_940x176.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p>testRigor generates code and checks if the test passes. If the test still fails, testRigor retries until the test passes. Finally, the test passes:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!jg2c!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1a93f9ac-be9e-4bd0-9345-5e6786ea726a_2892x752.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!jg2c!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1a93f9ac-be9e-4bd0-9345-5e6786ea726a_2892x752.png 424w, https://substackcdn.com/image/fetch/$s_!jg2c!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1a93f9ac-be9e-4bd0-9345-5e6786ea726a_2892x752.png 848w, https://substackcdn.com/image/fetch/$s_!jg2c!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1a93f9ac-be9e-4bd0-9345-5e6786ea726a_2892x752.png 1272w, https://substackcdn.com/image/fetch/$s_!jg2c!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1a93f9ac-be9e-4bd0-9345-5e6786ea726a_2892x752.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!jg2c!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1a93f9ac-be9e-4bd0-9345-5e6786ea726a_2892x752.png" width="1456" height="379" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/1a93f9ac-be9e-4bd0-9345-5e6786ea726a_2892x752.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:379,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:172815,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://journal.optivem.com/i/174917222?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1a93f9ac-be9e-4bd0-9345-5e6786ea726a_2892x752.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!jg2c!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1a93f9ac-be9e-4bd0-9345-5e6786ea726a_2892x752.png 424w, https://substackcdn.com/image/fetch/$s_!jg2c!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1a93f9ac-be9e-4bd0-9345-5e6786ea726a_2892x752.png 848w, https://substackcdn.com/image/fetch/$s_!jg2c!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1a93f9ac-be9e-4bd0-9345-5e6786ea726a_2892x752.png 1272w, https://substackcdn.com/image/fetch/$s_!jg2c!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1a93f9ac-be9e-4bd0-9345-5e6786ea726a_2892x752.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p><strong>REFACTOR - Refactor the code</strong></p><p>After the test passes, testRigor creates a PR for a developer to review the generated code. The developer may review and/or refactor the code.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!e281!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F17e40bc2-1fdc-4a80-9200-8c1ad198b19d_3330x2080.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!e281!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F17e40bc2-1fdc-4a80-9200-8c1ad198b19d_3330x2080.png 424w, https://substackcdn.com/image/fetch/$s_!e281!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F17e40bc2-1fdc-4a80-9200-8c1ad198b19d_3330x2080.png 848w, https://substackcdn.com/image/fetch/$s_!e281!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F17e40bc2-1fdc-4a80-9200-8c1ad198b19d_3330x2080.png 1272w, https://substackcdn.com/image/fetch/$s_!e281!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F17e40bc2-1fdc-4a80-9200-8c1ad198b19d_3330x2080.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!e281!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F17e40bc2-1fdc-4a80-9200-8c1ad198b19d_3330x2080.png" width="1456" height="909" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/17e40bc2-1fdc-4a80-9200-8c1ad198b19d_3330x2080.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:909,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:666516,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://journal.optivem.com/i/174917222?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F17e40bc2-1fdc-4a80-9200-8c1ad198b19d_3330x2080.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!e281!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F17e40bc2-1fdc-4a80-9200-8c1ad198b19d_3330x2080.png 424w, https://substackcdn.com/image/fetch/$s_!e281!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F17e40bc2-1fdc-4a80-9200-8c1ad198b19d_3330x2080.png 848w, https://substackcdn.com/image/fetch/$s_!e281!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F17e40bc2-1fdc-4a80-9200-8c1ad198b19d_3330x2080.png 1272w, https://substackcdn.com/image/fetch/$s_!e281!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F17e40bc2-1fdc-4a80-9200-8c1ad198b19d_3330x2080.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><h4>How can you overcome AI limitations with testRigor?</h4><p>testRigor is fully AI-first, letting QA Engineers correct hallucinations in plain English and continue building tests. Its AI framework handles hallucinations automatically for single-step actions, enabling testing of charts, diagrams, AI features, and previously untestable apps like Flutter, Citrix, Oracle EBS, and games.</p><p>You don&#8217;t need to learn any prompting techniques - testRigor will do it for you. All you need is to be crystal clear on what exactly needs to be done. testRigor will do all the AI tricks for you and will correct the hallucinations in 99.95% of the cases for one-step scenarios.</p><h4>What are the time savings with testRigor?</h4><p>Development time is reduced:</p><ul><li><p>testRigor enables ATDD, and because there is no reliance on implementation details, you can write tests before developers write code &#8594; using ATDD saves 35% of development time on rewriting by reducing requirement gaps</p></li><li><p>testRigor generates code until the test passes and creates a PR for developers to review, so they can interact with it like with another developer by providing code reviews</p></li></ul><p>QA Time is reduced:</p><ul><li><p>testRigor lets QA Engineers import manual tests from test management systems</p></li><li><p>testRigor lets Manual QA Engineers build test automation 4.5 times faster than professional QA Automation Engineers (see <a href="https://testrigor.com/case-study-idt/">IDT Case Study</a>)</p></li><li><p>QA time is reduced because testRigor generates test steps (based on the test description inputs by the QA Engineer), and then the QA Engineer reviews the test</p></li><li><p>Test maintenance is almost eliminated since tests don&#8217;t rely on implementation details</p></li></ul><p>Compliance risks are reduced:</p><ul><li><p>testRigor is HIPAA compliant, esp. helping medical companies automate 21 CFR Part 11 Compliance 4 - enabling automation on all media, including Web, Native Mobile, Native Desktop, Mainframes, API, Phone call, Text messages, 2FA authentication, etc</p></li></ul><h4>How IDT achieved 90% automation with testRigor?</h4><p>IDT achieved <strong>90% automation in one year using testRigor</strong>. You can watch the video <a href="https://www.youtube.com/watch?v=jbItbIUtgFQ&amp;t=10s">How IDT was able to achieve 90% automation in under a year with testRigor</a> and read the case study <a href="https://testrigor.com/case-study-idt/">How IDT Corporation went from 34% automation to 91% automation in 9 months.</a></p><h2>Try out testRigor</h2><p>&#128073; <strong><a href="https://testrigor.com/request-demo/?utm_source=valentina">Request a demo</a></strong> &#8212; and see how testRigor can help your team automate manual tests and start with ATDD.</p><p>Use the code &#8220;VALENTINA42&#8221; to get a 10% discount.</p><p><em>This post is sponsored by <a href="https://testrigor.com/request-demo/?utm_source=valentina">testRigor</a>, the #1 Generative AI-based Test Automation Tool.</em></p>]]></content:encoded></item><item><title><![CDATA[E2E Tests are dangerous]]></title><description><![CDATA[Many companies try to replace Manual QA by E2E Tests. The result? Disaster.]]></description><link>https://journal.optivem.com/p/e2e-tests-are-dangerous</link><guid isPermaLink="false">https://journal.optivem.com/p/e2e-tests-are-dangerous</guid><dc:creator><![CDATA[Valentina Jemuović]]></dc:creator><pubDate>Thu, 20 Nov 2025 16:05:40 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/6a1e39c4-14e5-4855-9186-0bb7a1f43d6f_1000x666.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><em>&#128274; Hello, this is Valentina with a premium issue of the Optivem Journal. I help Engineering Leaders &amp; Senior Software Developers apply <a href="https://journal.optivem.com/p/tdd-in-legacy-code-transformation">TDD in Legacy Code</a>.</em></p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://journal.optivem.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://journal.optivem.com/subscribe?"><span>Subscribe now</span></a></p><div><hr></div><p>End&#8209;to&#8209;end (E2E) tests are supposed to be the safety net that proves a product actually works as expected.</p><p>In practice, many E2E suites become slow, brittle, and expensive to maintain &#8212; full of fragile selectors, flaky assertions, and tests that depend on uncontrollable external systems. Teams end up with a noisy test pipeline that slows delivery and provides little real confidence.</p><p>Let&#8217;s look at why typical E2E tests fail teams more often than they help, using a concrete example of a price&#8209;calculation test that flounders because of ERP dependencies, brittle UI locators, and vague assertions.</p><p>&#128992; <strong>Problem #1: Limited verification</strong></p><p><strong>&#128992; Problem #2: Fragility</strong></p><p><strong>&#128992; Problem #3: Poor readability</strong></p><p>Then, we&#8217;ll see a pragmatic alternative: move precise verification into unit and integration tests, isolate external systems with test doubles or contract tests, and keep E2E tests narrow, resilient, and intent&#8209;focused.</p><p>Read on for practical patterns, concrete refactor examples, and a checklist for making tests reliable, readable, and low&#8209;maintenance &#8212; so testing becomes a productivity multiplier instead of a drag on delivery.</p><h2>Typical bad E2E Test</h2><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;java&quot;,&quot;nodeId&quot;:&quot;42d32849-3ffb-44fd-a37a-7e7b3c730075&quot;}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-java">@Test
void shouldCalculateOriginalOrderPrice() {
    // Act
    page.navigate(baseUrl + &#8220;/shop.html&#8221;);

    var productIdInput = page.locator(&#8221;[aria-label=&#8217;Product ID&#8217;]&#8221;);
    productIdInput.fill(&#8221;HP-15&#8221;);

    var quantityInput = page.locator(&#8221;[aria-label=&#8217;Quantity&#8217;]&#8221;);
    quantityInput.fill(&#8221;5&#8221;);

    var placeOrderButton = page.locator(&#8221;[aria-label=&#8217;Place Order&#8217;]&#8221;);
    placeOrderButton.click();

    // Wait for confirmation message to appear
    var confirmationMessage = page.locator(&#8221;[role=&#8217;alert&#8217;]&#8221;);
    confirmationMessage.waitFor(new Locator.WaitForOptions().setTimeout(TestConfiguration.getWaitSeconds() * 1000));

    var confirmationMessageText = confirmationMessage.textContent();

    var pattern = Pattern.compile(&#8221;Success! Order has been created with Order Number ([\\w-]+) and Original Price \\$(\\d+(?:\\.\\d{2})?)&#8221;);
    var matcher = pattern.matcher(confirmationMessageText);

    assertTrue(matcher.find(), &#8220;Confirmation message should match expected pattern. Actual: &#8220; + confirmationMessageText);

    var totalPriceString = matcher.group(2);
    var totalPrice = Double.parseDouble(totalPriceString);
    assertTrue(originalPrice &gt; 0, &#8220;Total price should be positive&#8221;);
}</code></pre></div><h2>Problem #1: Limited verification</h2><p>When the user places an order for a SKU and quantity, we need to lookup order price from the ERP.</p><p>Unfortunately, the ERP does not allow us to control unit prices.</p><p>Therefore, we can&#8217;t assert the total price value. We can only do a weak assertion that it&#8217;s positive. </p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;java&quot;,&quot;nodeId&quot;:&quot;a71ad1aa-100d-4f7b-8cf3-3a9b456a1803&quot;}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-java">assertTrue(originalPrice &gt; 0, &#8220;Total price should be positive&#8221;);</code></pre></div>
      <p>
          <a href="https://journal.optivem.com/p/e2e-tests-are-dangerous">
              Read more
          </a>
      </p>
   ]]></content:encoded></item><item><title><![CDATA[ATDD: Don’t skip tests even for simple code]]></title><description><![CDATA[Learning the hard way: even &#8220;simple&#8221; code needs tests. Automated testing isn't just for big complex projects.]]></description><link>https://journal.optivem.com/p/atdd-dont-skip-tests-even-for-simple-code</link><guid isPermaLink="false">https://journal.optivem.com/p/atdd-dont-skip-tests-even-for-simple-code</guid><dc:creator><![CDATA[Valentina Jemuović]]></dc:creator><pubDate>Tue, 30 Sep 2025 06:01:23 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/0bc3f14e-656d-48a4-9861-e5e9ceb525ac_1000x666.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>&#128075; <em>Hello, this is Valentina with the free edition of the Optivem Journal. I help Engineering Leaders &amp; Senior Software Developers apply <a href="https://journal.optivem.com/p/tdd-in-legacy-code-transformation">TDD in Legacy Code</a>.</em></p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://journal.optivem.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://journal.optivem.com/subscribe?"><span>Subscribe now</span></a></p><div><hr></div><p>As I was building a template generator - a task that should be <em>very simple</em> - I first gave the manual procedure to Copilot to implement. It implemented it wrong.</p><div><hr></div><p>As I&#8217;m running the first cohort of <a href="https://atdd-accelerator.optivem.com/">ATDD Accelerator for 2025</a>, because it&#8217;s practical, one of the first things we do, is TDD sandbox setup. Now, the trouble is that even setting up a simple project takes time. Setting up a pipeline takes time.</p><p>So I thought, to make it easier for everyone, I&#8217;d make a template. It&#8217;s a multi-language template, and I&#8217;m basically automating it. To automate this, I have a GitHub template, and I want to automate the process of creating a new repository from that template and then doing some post-processing on top.</p><h2>The Simple Task That Wasn&#8217;t So Simple</h2><p>First, I documented everything manually through my quickstart. Then I wanted to automate it. I went with PowerShell. And since I&#8217;m not really an active PowerShell user, I decided to use Copilot to help me generate the code. I gave it the quickstart, it generated the script, I ran it - and it didn&#8217;t work.</p><p>I thought, &#8220;Well, it&#8217;s simple. I&#8217;ll spend a few hours and get it to work.&#8221; But what happened was, as I was trying to get it to work, every time I needed to do manual testing: open up the generated repository in GitHub, check which folders were there, verify if substitutions were done or not, and then manually delete the repository. </p><p>None of this was complex - it was simple, repetitive work - but it ended up taking me hours. And after all those hours, I still didn&#8217;t have anything actually working.</p><h2>AI Wrote Meaningless Tests</h2><p>So I thought, &#8220;Okay, let&#8217;s try AI again. Maybe I should start with tests first.&#8221; I gave Copilot the quickstart and asked it to generate test cases. It generated lots of them, but when I looked, many were meaningless. Some were too tightly coupled to the setup steps in my quickstart, and not really asserting end results. And the tests were hard to read.</p><h2>Back to Basics: The First Test</h2><p>That was the wake-up call. ATDD isn&#8217;t just for big company projects - it applies even here. Even for this silly, simple script, ATDD is the way to go.</p><p>So I scrapped everything Copilot had done before and started over. I wrote the very first test - &#8220;hello world,&#8221; basically just checking if the repository was even created. Then I added the next test, verifying whether a certain folder exists or doesn&#8217;t exist after post-processing. And then I asked the AI to make the test pass.</p><p>At first, Copilot generated way too much code - more than was needed to make the test pass. Then I refined the prompts to ask it for only the <em>minimal</em> code required. That worked better.</p><h2>Slow Start, Fast Momentum</h2><p>Yes, the first setup took time. Writing those first tests, creating the DSL for interfacing with GitHub CLI, wiring it up to the template generator script, and setting up GitHub Actions - all of that took hours. It was slow in the beginning. But once the foundation was in place, writing the next test was super fast - within a minute I could write the test and then have the AI generate just enough code to pass it.</p><p>So that&#8217;s how I accelerated my own development: on one hand, I built maintainable acceptance tests, which made it cheap to add the next test. On the other hand, I minimized coding time by using Copilot incrementally. Ultimately, that reduced overall development time.</p><div><hr></div><p>&#128640; Join the <strong><a href="https://atdd.optivem.com/">ATDD Accelerator waitlist</a></strong></p>]]></content:encoded></item><item><title><![CDATA[Stop Breaking Production: ATDD in Legacy Code]]></title><description><![CDATA[Testing legacy code can feel like walking through a minefield. One wrong step, and you&#8217;ve introduced a bug that only shows up in production - right after your deployment.]]></description><link>https://journal.optivem.com/p/stop-breaking-production-atdd-in-legacy-code</link><guid isPermaLink="false">https://journal.optivem.com/p/stop-breaking-production-atdd-in-legacy-code</guid><dc:creator><![CDATA[Valentina Jemuović]]></dc:creator><pubDate>Mon, 18 Aug 2025 06:02:03 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/1a6b3e7b-b971-4906-86b4-a30f3c4fe562_1000x666.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Are you stuck with legacy code? If you:</p><ul><li><p>Hesitate to change code because you fear breaking something</p></li><li><p>Spent hours debugging a failure in a system you barely understand</p></li><li><p>Tried adding automated tests to an old system only to give up in frustration</p></li></ul><p>&#8230;then you already know the core problem: <strong>testing legacy code is hard.</strong></p><p>But here&#8217;s the thing - it doesn&#8217;t have to be that way.</p><div><hr></div><h2>Why Teams Struggle With Legacy Code</h2><p>I&#8217;ve spent years coaching teams that ship changes to fragile, business-critical systems. Most of those teams avoided changing code in certain areas because &#8220;it&#8217;s too risky.&#8221; They also relied on Manual QA to verify those &#8220;risky&#8220; changes.</p><p>They didn&#8217;t trust automated tests. The irony? That&#8217;s exactly where tests are most needed.</p><p>Over the years, I&#8217;ve developed and refined a safe, incremental approach to <strong>Acceptance Test-Driven Development (ATDD)</strong> for legacy systems - one that can improve quality <strong>without slowing delivery</strong>.</p><p>This helps engineering teams to escape legacy code, even in high-pressure environments.</p><div><hr></div><h2>What You&#8217;ll Learn</h2><p>In this <strong>free live Lightning Lesson</strong>, I&#8217;ll show you:</p><ul><li><p><strong>Why Unit Tests &amp; E2E Tests don't protect us in production</strong></p><p>Discover why many test automation initatives fail in reducing regression bugs</p></li><li><p><strong>Implement User Stories without breaking functionality</strong></p><p>Deliver new business features while preserving the stability of existing workflows</p></li><li><p><strong>Fix Bugs without causing new Regression Bugs</strong></p><p>Resolve defects in a way that prevents regressions and unintended side effects</p></li><li><p><strong>Redesign the UX/UI whilst whilst keeping the system working</strong></p><p>Refresh the user interface and experience without disrupting core system behavior</p></li><li><p><strong>Modernize your System Architecture &amp; Tech Stack safely</strong></p><p>Upgrade legacy architecture incrementally while ensuring ongoing reliability and business continuity</p></li></ul><div><hr></div><h2>Event Details</h2><p>&#128197; <strong>Date &amp; Time:</strong> Wed, Sep 24, 2025 5:00PM<br>&#128205; <strong>Where:</strong> Live on Maven (online)<br>&#128176; <strong>Cost:</strong> Free</p><p>&#128279; <strong>Register here:</strong> <a href="https://maven.com/p/f39276/stop-breaking-production-atdd-in-legacy-code">Stop Breaking Production: ATDD in Legacy Code</a></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://maven.com/p/f39276/stop-breaking-production-atdd-in-legacy-code" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Vv77!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F894e5060-ed08-485f-9820-6f7d84a07b2a_3200x1800.png 424w, https://substackcdn.com/image/fetch/$s_!Vv77!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F894e5060-ed08-485f-9820-6f7d84a07b2a_3200x1800.png 848w, https://substackcdn.com/image/fetch/$s_!Vv77!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F894e5060-ed08-485f-9820-6f7d84a07b2a_3200x1800.png 1272w, https://substackcdn.com/image/fetch/$s_!Vv77!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F894e5060-ed08-485f-9820-6f7d84a07b2a_3200x1800.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Vv77!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F894e5060-ed08-485f-9820-6f7d84a07b2a_3200x1800.png" width="1456" height="819" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/894e5060-ed08-485f-9820-6f7d84a07b2a_3200x1800.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:819,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1155802,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:&quot;https://maven.com/p/f39276/stop-breaking-production-atdd-in-legacy-code&quot;,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://journal.optivem.com/i/171045723?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F894e5060-ed08-485f-9820-6f7d84a07b2a_3200x1800.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!Vv77!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F894e5060-ed08-485f-9820-6f7d84a07b2a_3200x1800.png 424w, https://substackcdn.com/image/fetch/$s_!Vv77!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F894e5060-ed08-485f-9820-6f7d84a07b2a_3200x1800.png 848w, https://substackcdn.com/image/fetch/$s_!Vv77!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F894e5060-ed08-485f-9820-6f7d84a07b2a_3200x1800.png 1272w, https://substackcdn.com/image/fetch/$s_!Vv77!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F894e5060-ed08-485f-9820-6f7d84a07b2a_3200x1800.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><div><hr></div><h2>Who Should Join</h2><p>This lesson is for Engineering Managers, Tech Leads &amp; Senior Software Engineers working with legacy systems who want to improve quality without introducing new risks. Whether you&#8217;re new to ATDD or looking for ways to apply it in challenging environments, you&#8217;ll leave with actionable strategies you can use immediately.</p><div><hr></div><h2>Meet Your Coach</h2><p>I&#8217;m Valentina - a technical coach and former software engineer who&#8217;s spent years helping teams adopt modern quality practices in complex legacy systems. I&#8217;ve guided teams to reduce production bugs and accelerate delivery.</p><p>I built this Lightning Lesson to give you practical techniques - not abstract theory - so you can finally stop fearing your legacy codebase and start improving it.</p><div><hr></div><h2>Break Free From Legacy Code</h2><p>If you want to:</p><ul><li><p>Ship changes with confidence</p></li><li><p>Catch regressions before they cause trouble</p></li><li><p>Build tests that actually protect your system</p></li></ul><p>&#8230;then I&#8217;ll see you in the live session.</p><p>&#128204; <strong>Register here:</strong> <a href="https://maven.com/p/f39276/stop-breaking-production-atdd-in-legacy-code">Stop Breaking Production: ATDD in Legacy Code</a></p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://maven.com/p/f39276/stop-breaking-production-atdd-in-legacy-code&quot;,&quot;text&quot;:&quot;Register now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://maven.com/p/f39276/stop-breaking-production-atdd-in-legacy-code"><span>Register now</span></a></p><p></p>]]></content:encoded></item><item><title><![CDATA[ATDD - Dirty code & architecture is ok]]></title><description><![CDATA[But should we skip tests?]]></description><link>https://journal.optivem.com/p/atdd-dirty-code-and-architecture-is-ok</link><guid isPermaLink="false">https://journal.optivem.com/p/atdd-dirty-code-and-architecture-is-ok</guid><dc:creator><![CDATA[Valentina Jemuović]]></dc:creator><pubDate>Tue, 29 Jul 2025 06:00:39 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/43f7701a-80a3-4fb7-91bd-71d84a916366_1000x666.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><em>&#128075; Hello, this is Valentina with the free edition of the Optivem Journal. I&#8217;ll help you apply TDD to escape the nightmare of Legacy Code. Join our paid community of 160+ senior engineers &amp; leaders for support on your TDD journey, plus instant access to group chat and live Q&amp;As:</em></p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://journal.optivem.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://journal.optivem.com/subscribe?"><span>Subscribe now</span></a></p><div><hr></div><p>The business wanted it done yesterday - and deployed today. </p><p>The dev is told: &#8220;I don&#8217;t care how, just get it working.&#8221;</p><p>But that speed comes at a cost: messy code.</p><p>So what do we do?</p><p>We take shortcuts. We write dirty code. We skip design decisions. And in many cases - <strong>that&#8217;s completely okay</strong>.</p><h2>You don&#8217;t need to start with Unit Tests</h2><p>It&#8217;s not possible to write unit tests if there&#8217;s high coupling between business logic and I/O logic. And even worse - many developers write fragile unit tests that are tightly coupled to internal implementation details. So when the design changes, those tests break, and developers have to rewrite them. And there&#8217;s no time for this.</p><p>But even effective unit tests break when you change the public API (whereas bad unit tests also break when you change the internal implementation). If you redesign the API, the tests still have to be updated.</p><p>So does that mean we have to skip tests entirely?</p><p><strong>No &#8212; it means we need a different kind of test.</strong></p><h2>Acceptance Tests Don't Care About Messy Code</h2><p>Unlike unit tests, acceptance tests stay stable - they only care about user behavior.</p><p>Acceptance tests validate <em>user-facing behavior</em>, not <em>developer-facing behavior</em>.</p><p>That means, for Acceptance tests:</p><ul><li><p>It doesn&#8217;t matter how messy your code is.</p></li><li><p>It doesn&#8217;t matter if your architecture is bad.</p></li><li><p>As long as the functionality works &#8212; the Acceptance test passes.</p></li></ul><p>So even if you're delivering fast and writing quick-and-dirty code to get things working &#8212; <strong>your acceptance tests still give you assurance that the system behaves correctly</strong>.</p><h2>Clean It Up Later (Without Fear)</h2><p>Let&#8217;s say you come back in a few sprints. You now understand the domain better. You&#8217;ve seen how the code evolved. You&#8217;re ready to clean up the mess.</p><p>Great. Because your acceptance tests are <em>stable</em>, you can redesign, refactor, and re-architect &#8212; <strong>without breaking the acceptance tests</strong>. They still describe the same user-facing behavior, regardless of how the code underneath is structured.</p><h2>Defer Design Decisions - The Power of ATDD</h2><ul><li><p>Start with user behavior and write high-level acceptance tests</p></li><li><p>Implement quickly - even with &#8220;dirty&#8221; code</p></li><li><p>Refactor and improve the design <em>later</em>, with full test protection</p></li></ul><p>That&#8217;s why ATDD is powerful: you can ship fast, defer clean-up, and still have confidence your system works.</p><p>Protect behavior first - with high-level acceptance tests. Improve your architecture &amp; design later.</p><h2>Want to Learn How?</h2><p>How can you introduce acceptance tests into your development process?</p><p>See the <a href="https://journal.optivem.com/p/tdd-in-legacy-code-outline">TDD in Legacy Code</a> series, where we have a section ATDD in Legacy Code.</p><p>Want the full roadmap? I'm hosting a workshop breaking down exactly how to implement this. I&#8217;ll show you how to align the team regarding requirements and eliminate manual QA regression testing, so that you&#8217;ll reduce delivery time and reduce regression bugs. </p><p>&#128640;Join me on <strong>Wed 6th Aug (17:00 - 19:00 CEST)</strong>, I&#8217;m hosting <strong>ATDD in Legacy Code Roadmap (Live Workshop)</strong>. During this workshop you&#8217;ll learn:</p><ol><li><p>Why ATDD will reduce software delivery time and reduce regression bugs, by aligning the team regarding requirements &amp; replacing manual regression testing</p></li><li><p>How to introduce ATDD in Legacy Code in an incremental way, while still keeping up with existing feature delivery</p></li><li><p>How to convince Engineering Managers, Software Engineers and QA Engineers to adopt ATDD in Legacy Code</p></li></ol><p>Let's transform your development process together!</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://lu.ma/vg945412&quot;,&quot;text&quot;:&quot;&#127942; Register now&quot;,&quot;action&quot;:null,&quot;class&quot;:&quot;button-wrapper&quot;}" data-component-name="ButtonCreateButton"><a class="button primary button-wrapper" href="https://lu.ma/vg945412"><span>&#127942; Register now</span></a></p><p><em>P.S. Regular price: $97 (free access for Optivem Journal paid subscribers - see event description for details)</em></p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://journal.optivem.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://journal.optivem.com/subscribe?"><span>Subscribe now</span></a></p>]]></content:encoded></item><item><title><![CDATA[Live Workshop: ATDD in Legacy Code Roadmap]]></title><description><![CDATA[How can you eliminate manual QA, align your team, and deliver safely - without rewriting the entire codebase?]]></description><link>https://journal.optivem.com/p/live-workshop-atdd-in-legacy-code</link><guid isPermaLink="false">https://journal.optivem.com/p/live-workshop-atdd-in-legacy-code</guid><dc:creator><![CDATA[Valentina Jemuović]]></dc:creator><pubDate>Tue, 22 Jul 2025 06:02:31 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/1fe44efb-1a06-46c8-bdda-7e3b79fb14c5_1000x666.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>&#128293; You're drowning in legacy code. Here's the fastest way out.</p><p>If your team is stuck in a legacy system, you know the feeling:<br>&#8230; Every release is a risk.<br>Manual regression testing takes days (or weeks).<br>End-to-end tests break if someone makes the smallest change.<br>And unit tests? Try covering the whole codebase before 2030.</p><p>So what do you do when:</p><ul><li><p>You <em>can&#8217;t</em> stop shipping features</p></li><li><p>You <em>need</em> safety and fast feedback</p></li><li><p>And your test automation strategy is going nowhere?</p></li></ul><h3>Join me for a live workshop on <strong>ATDD in Legacy Code</strong></h3><p>In this 2-hour session, I&#8217;ll walk you through a <strong>practical and safe roadmap</strong> for introducing <strong>Acceptance Test-Driven Development</strong> into a legacy system &#8212; <em>without pausing feature work or risking production.</em></p><div><hr></div><h3>&#128161; You&#8217;ll learn:</h3><p>&#9989; How to eliminate manual QA by replacing it with automated <strong>system-level acceptance tests</strong><br>&#9989; How to introduce ATDD safely while keeping up with feature delivery<br>&#9989; Why <strong>acceptance tests give you the highest ROI</strong> (much faster than unit or E2E tests)<br>&#9989; How to align your PO, developers, and QA around <strong>executable specifications</strong> that reduce rework and waste</p><div><hr></div><h3>&#127919; Who is this for?</h3><p>This session is for technical leaders and senior engineers who need to get things moving &#8212; now.</p><ul><li><p><strong>CTOs &amp; Engineering Managers</strong> who want to reduce QA costs <em>without</em> risking the product roadmap</p></li><li><p><strong>Team Leads &amp; Senior Developers</strong> who need to position ATDD internally and handle counterarguments like:</p></li></ul><blockquote><p>&#8220;Why not just write more E2E tests?&#8221;<br>&#8220;We don&#8217;t have time for unit tests&#8221;</p></blockquote><div><hr></div><h3>&#127873; Free for Paid Optivem Journal Members</h3><p>If you're already a <strong>paid member</strong>, this workshop is <strong>included for free</strong>.<br>&#128073; <a href="https://journal.optivem.com/p/discount">Click here to claim your 100% discount</a></p><p>Not a member yet? You can upgrade now and get immediate access to the session (plus replays and future events).<br>&#128073; <a href="https://journal.optivem.com/subscribe">Upgrade to Paid Membership</a></p><div><hr></div><h3>&#128197; When:</h3><p><em>Wednesday, 6th Aug, 5-7pm CEST</em></p><p>Replay will be available to Optivem Journal Paid members.</p><div><hr></div><p><strong>&#128073; Spots are limited &#8211; <a href="https://journal.optivem.com/p/discount">Sign up here</a></strong></p><p>Let&#8217;s stop wasting time on flaky tests and manual QA.<br>Let&#8217;s build something better &#8212; even in legacy code.</p><p>See you there,<br>Valentina<br>Technical Coach, Optivem</p>]]></content:encoded></item><item><title><![CDATA[TDD in Legacy Code - ATDD for External System API Changes]]></title><description><![CDATA[When the External System API is changed, our System stops working. How should we safely adapt our System to the changed External System API?]]></description><link>https://journal.optivem.com/p/atdd-in-legacy-code-external-system-api-changes-unplanned</link><guid isPermaLink="false">https://journal.optivem.com/p/atdd-in-legacy-code-external-system-api-changes-unplanned</guid><dc:creator><![CDATA[Valentina Jemuović]]></dc:creator><pubDate>Fri, 14 Feb 2025 07:01:01 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/8d65584b-f2f1-4d56-b78f-7a5ac1734d8d_1000x666.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><em>&#128274;Hello, this is Valentina with a premium issue of the Optivem Journal. I help Engineering Leaders &amp; Senior Software Developers apply TDD in Legacy Code. This article is part of the <a href="https://journal.optivem.com/p/tdd-in-legacy-code-outline">TDD in Legacy Code</a> series. </em></p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://journal.optivem.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://journal.optivem.com/subscribe?"><span>Subscribe now</span></a></p><div><hr></div><h2>Adapting to External System API Changes is risky without tests</h2><p>Suppose that the External System API has changed. But we don&#8217;t have any External System Contract Tests. It means we&#8217;d find out our System is broken when users start reporting Production Bugs. We&#8217;d then have to wait for the slow-running Manual QA Testing to reproduce those bugs, and then discover - it&#8217;s due to External Systems!</p><p>So now that we have to adapt our System, we&#8217;re faced with additional challenges - our Legacy Project doesn&#8217;t have tests, and the business logic is often coupled to communication with External Systems. Thus, when an External System changes its API, if we try to adapt to the updated External System API, we may need to make broad changes, and it&#8217;s very risky&#8230; when there&#8217;s no tests. </p><h2>How to use ATDD for handling External System API Changes</h2><p>When implementing User Stories, applying ATDD involves writing a failing Acceptance Test to specify the behavior, implementing the behavior, and verifying that the Acceptance Test passes. A similar process happened with implementing Bug fixes, since both User Stories &amp; Bugs are concerned with <strong>behavioral changes</strong>.</p><p>But how do we handle <strong>structural changes</strong> - such as External System API changes, e.g. there might be a change in their URL routes, or changes to the data input/output structures. It&#8217;s just a structural change, not a behavioral change.</p><p>How ATDD differs:</p><ul><li><p>For behavioral changes, applying ATDD means that we start with writing a failing Acceptance Test, then we try to implement the System to make the test pass.</p></li><li><p>Regarding structural changes (External System API Change), we do NOT write an Acceptance Test. Instead, we update the External System API Driver to reflect the updated API, which causes multiple Acceptance Tests to fail. Then we try to &#8220;adapt&#8220; our System so that the Acceptance Tests can pass again.</p></li></ul><p>Let&#8217;s illustrate the ATDD cycle for External System API Change Tasks:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!F2eH!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5321e1a2-20fa-45a9-9224-1716b35bdc34_1397x715.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!F2eH!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5321e1a2-20fa-45a9-9224-1716b35bdc34_1397x715.png 424w, https://substackcdn.com/image/fetch/$s_!F2eH!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5321e1a2-20fa-45a9-9224-1716b35bdc34_1397x715.png 848w, https://substackcdn.com/image/fetch/$s_!F2eH!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5321e1a2-20fa-45a9-9224-1716b35bdc34_1397x715.png 1272w, https://substackcdn.com/image/fetch/$s_!F2eH!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5321e1a2-20fa-45a9-9224-1716b35bdc34_1397x715.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!F2eH!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5321e1a2-20fa-45a9-9224-1716b35bdc34_1397x715.png" width="1397" height="715" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/5321e1a2-20fa-45a9-9224-1716b35bdc34_1397x715.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:715,&quot;width&quot;:1397,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:92719,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!F2eH!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5321e1a2-20fa-45a9-9224-1716b35bdc34_1397x715.png 424w, https://substackcdn.com/image/fetch/$s_!F2eH!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5321e1a2-20fa-45a9-9224-1716b35bdc34_1397x715.png 848w, https://substackcdn.com/image/fetch/$s_!F2eH!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5321e1a2-20fa-45a9-9224-1716b35bdc34_1397x715.png 1272w, https://substackcdn.com/image/fetch/$s_!F2eH!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5321e1a2-20fa-45a9-9224-1716b35bdc34_1397x715.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!ojck!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F98504b2d-90eb-4f65-996f-6268d1b88b0c_4820x1239.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!ojck!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F98504b2d-90eb-4f65-996f-6268d1b88b0c_4820x1239.png 424w, https://substackcdn.com/image/fetch/$s_!ojck!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F98504b2d-90eb-4f65-996f-6268d1b88b0c_4820x1239.png 848w, https://substackcdn.com/image/fetch/$s_!ojck!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F98504b2d-90eb-4f65-996f-6268d1b88b0c_4820x1239.png 1272w, https://substackcdn.com/image/fetch/$s_!ojck!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F98504b2d-90eb-4f65-996f-6268d1b88b0c_4820x1239.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!ojck!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F98504b2d-90eb-4f65-996f-6268d1b88b0c_4820x1239.png" width="1456" height="374" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/98504b2d-90eb-4f65-996f-6268d1b88b0c_4820x1239.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:374,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:283966,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!ojck!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F98504b2d-90eb-4f65-996f-6268d1b88b0c_4820x1239.png 424w, https://substackcdn.com/image/fetch/$s_!ojck!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F98504b2d-90eb-4f65-996f-6268d1b88b0c_4820x1239.png 848w, https://substackcdn.com/image/fetch/$s_!ojck!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F98504b2d-90eb-4f65-996f-6268d1b88b0c_4820x1239.png 1272w, https://substackcdn.com/image/fetch/$s_!ojck!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F98504b2d-90eb-4f65-996f-6268d1b88b0c_4820x1239.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p><p>Here are the steps to introduce ATDD for External System Changes in Legacy Code. I&#8217;ll provide you with step-by-step guidance on how to handle External System Changes in your GitHub Sandbox Project. &#11015;&#65039;&#11015;&#65039;&#11015;&#65039;</p>
      <p>
          <a href="https://journal.optivem.com/p/atdd-in-legacy-code-external-system-api-changes-unplanned">
              Read more
          </a>
      </p>
   ]]></content:encoded></item><item><title><![CDATA[TDD in Legacy Code - ATDD for System API Redesign]]></title><description><![CDATA[When the development team decides to redesign the API, teams have the risk of introducing regression bugs. How should we implement a API Redesign in a safe way?]]></description><link>https://journal.optivem.com/p/atdd-in-legacy-code-system-api-redesign</link><guid isPermaLink="false">https://journal.optivem.com/p/atdd-in-legacy-code-system-api-redesign</guid><dc:creator><![CDATA[Valentina Jemuović]]></dc:creator><pubDate>Fri, 31 Jan 2025 07:00:38 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/4879b46b-fce6-4c49-aa2b-40281b7f679c_1000x666.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><em>&#128274;Hello, this is Valentina with a premium issue of the Optivem Journal. I help Engineering Leaders &amp; Senior Software Developers apply TDD in Legacy Code. This article is part of the <a href="https://journal.optivem.com/p/tdd-in-legacy-code-outline">TDD in Legacy Code</a> series. </em></p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://journal.optivem.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://journal.optivem.com/subscribe?"><span>Subscribe now</span></a></p><div><hr></div><h2>API Redesign is risky without tests</h2><p>API Redesign (in the case of public-facing APIs) is risky because it could cause regression bugs.</p><h2>How to use ATDD for API Redesign</h2><p>When implementing User Stories, applying ATDD involved writing a failing Acceptance Test to specify the behavior, implementing the behavior, and verifying that the Acceptance Test passes. A similar process happened with implementing Bug fixes, since both User Stories &amp; Bugs are concerned with <strong>behavioral changes</strong>.</p><p>But how do we handle <strong>structural changes</strong> - such as API Redesign? Example, for splitting one field (e.g. &#8220;name&#8220;) into two fields (&#8220;first name&#8220; and &#8220;last name&#8220;). It&#8217;s just a structural change, not a behavioral change.</p><p>How ATDD differs:</p><ul><li><p>For behavioral changes, applying ATDD meant that we start with writing a failing Acceptance Test.</p></li><li><p>Regarding structural changes (System API Redesign), we do NOT write an Acceptance Test. Instead, we update the System API Driver to reflect the updated API, which causes multiple Acceptance Tests to fail.</p></li></ul><p>Let&#8217;s illustrate the ATDD cycle for System API Redesign Tasks:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!jLe9!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fac0ca12e-efdb-496d-b42e-6d84d2259a3e_1310x763.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!jLe9!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fac0ca12e-efdb-496d-b42e-6d84d2259a3e_1310x763.png 424w, https://substackcdn.com/image/fetch/$s_!jLe9!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fac0ca12e-efdb-496d-b42e-6d84d2259a3e_1310x763.png 848w, https://substackcdn.com/image/fetch/$s_!jLe9!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fac0ca12e-efdb-496d-b42e-6d84d2259a3e_1310x763.png 1272w, https://substackcdn.com/image/fetch/$s_!jLe9!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fac0ca12e-efdb-496d-b42e-6d84d2259a3e_1310x763.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!jLe9!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fac0ca12e-efdb-496d-b42e-6d84d2259a3e_1310x763.png" width="1310" height="763" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/ac0ca12e-efdb-496d-b42e-6d84d2259a3e_1310x763.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:763,&quot;width&quot;:1310,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:89580,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!jLe9!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fac0ca12e-efdb-496d-b42e-6d84d2259a3e_1310x763.png 424w, https://substackcdn.com/image/fetch/$s_!jLe9!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fac0ca12e-efdb-496d-b42e-6d84d2259a3e_1310x763.png 848w, https://substackcdn.com/image/fetch/$s_!jLe9!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fac0ca12e-efdb-496d-b42e-6d84d2259a3e_1310x763.png 1272w, https://substackcdn.com/image/fetch/$s_!jLe9!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fac0ca12e-efdb-496d-b42e-6d84d2259a3e_1310x763.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!kySW!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F06ce5670-ca7a-477a-9a78-c80480cf19c6_4820x1239.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!kySW!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F06ce5670-ca7a-477a-9a78-c80480cf19c6_4820x1239.png 424w, https://substackcdn.com/image/fetch/$s_!kySW!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F06ce5670-ca7a-477a-9a78-c80480cf19c6_4820x1239.png 848w, https://substackcdn.com/image/fetch/$s_!kySW!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F06ce5670-ca7a-477a-9a78-c80480cf19c6_4820x1239.png 1272w, https://substackcdn.com/image/fetch/$s_!kySW!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F06ce5670-ca7a-477a-9a78-c80480cf19c6_4820x1239.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!kySW!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F06ce5670-ca7a-477a-9a78-c80480cf19c6_4820x1239.png" width="1456" height="374" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/06ce5670-ca7a-477a-9a78-c80480cf19c6_4820x1239.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:374,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:283966,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!kySW!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F06ce5670-ca7a-477a-9a78-c80480cf19c6_4820x1239.png 424w, https://substackcdn.com/image/fetch/$s_!kySW!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F06ce5670-ca7a-477a-9a78-c80480cf19c6_4820x1239.png 848w, https://substackcdn.com/image/fetch/$s_!kySW!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F06ce5670-ca7a-477a-9a78-c80480cf19c6_4820x1239.png 1272w, https://substackcdn.com/image/fetch/$s_!kySW!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F06ce5670-ca7a-477a-9a78-c80480cf19c6_4820x1239.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Here are the steps to introduce ATDD for API Redesign in Legacy Code. I&#8217;ll provide you with step-by-step guidance on how to introduce ATDD in your GitHub Sandbox Project. &#11015;&#65039;&#11015;&#65039;&#11015;&#65039;</p>
      <p>
          <a href="https://journal.optivem.com/p/atdd-in-legacy-code-system-api-redesign">
              Read more
          </a>
      </p>
   ]]></content:encoded></item><item><title><![CDATA[TDD in Legacy Code - ATDD for System UI Redesign]]></title><description><![CDATA[When the UX/UI Designer changes the redesign, teams have the risk of introducing regression bugs. How should we implement a UX/UI Redesign in a safe way?]]></description><link>https://journal.optivem.com/p/atdd-in-legacy-code-system-ui-redesign</link><guid isPermaLink="false">https://journal.optivem.com/p/atdd-in-legacy-code-system-ui-redesign</guid><dc:creator><![CDATA[Valentina Jemuović]]></dc:creator><pubDate>Wed, 22 Jan 2025 07:02:10 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/b20c070e-1d69-40f6-91b6-8f643fe95e67_1000x666.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><em>&#128274;Hello, this is Valentina with a premium issue of the Optivem Journal. I help Engineering Leaders &amp; Senior Software Developers apply TDD in Legacy Code. This article is part of the <a href="https://journal.optivem.com/p/tdd-in-legacy-code-outline">TDD in Legacy Code</a> series.</em></p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://journal.optivem.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://journal.optivem.com/subscribe?"><span>Subscribe now</span></a></p><div><hr></div><h2>UX/UI Redesign is risky without tests</h2><p>UX/UI Redesign is more than just changing colors and fonts, more than just moving elements around. It can involve changing the identifiers and types of UI elements, moving elements across screens, or splitting one UI element into multiple UI elements. These are UI Structural Changes that can easily cause Regression Bugs.</p><h2>How to use ATDD for UX/UI Redesign</h2><p>When implementing User Stories, applying ATDD involved writing a failing Acceptance Test to specify the behavior, implementing the behavior, and verifying that the Acceptance Test passes. This is similar to implementing Bug fixes, since both User Stories &amp; Bugs are concerned with <strong>behavioral changes</strong>.</p><p>But how do we handle <strong>structural changes</strong> - such as UX/UI Redesign? This kind of change affects how the UI looks like but, from end user perspective, the functionality is the same, just the way it&#8217;s presented on the UI is different (e.g. instead of inputting data on one screen we&#8217;d input it over 5 screens with a &#8220;Next&#8220; button separator; or instead of inputting the full name on one field it would be inputted over two fields - first name &amp; last name). It&#8217;s just a structural change, not a behavioral change.</p><p>How ATDD differs:</p><ul><li><p>For behavioral changes, when applying ATDD we start with writing a failing Acceptance Test.</p></li><li><p>Regarding structural changes (System UI Redesign), we do NOT write an Acceptance Test. Instead, we update the System UI Driver to reflect the updated UI, and that in turn causes multiple Acceptance Tests to fail.</p></li></ul><p>Let&#8217;s illustrate the ATDD cycle for System UI Redesign Tasks:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!0K3s!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F441ab758-9b42-4b86-a133-2bc811094380_1605x622.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!0K3s!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F441ab758-9b42-4b86-a133-2bc811094380_1605x622.png 424w, https://substackcdn.com/image/fetch/$s_!0K3s!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F441ab758-9b42-4b86-a133-2bc811094380_1605x622.png 848w, https://substackcdn.com/image/fetch/$s_!0K3s!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F441ab758-9b42-4b86-a133-2bc811094380_1605x622.png 1272w, https://substackcdn.com/image/fetch/$s_!0K3s!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F441ab758-9b42-4b86-a133-2bc811094380_1605x622.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!0K3s!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F441ab758-9b42-4b86-a133-2bc811094380_1605x622.png" width="1456" height="564" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/441ab758-9b42-4b86-a133-2bc811094380_1605x622.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:564,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:82747,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!0K3s!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F441ab758-9b42-4b86-a133-2bc811094380_1605x622.png 424w, https://substackcdn.com/image/fetch/$s_!0K3s!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F441ab758-9b42-4b86-a133-2bc811094380_1605x622.png 848w, https://substackcdn.com/image/fetch/$s_!0K3s!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F441ab758-9b42-4b86-a133-2bc811094380_1605x622.png 1272w, https://substackcdn.com/image/fetch/$s_!0K3s!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F441ab758-9b42-4b86-a133-2bc811094380_1605x622.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!1Fhr!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F760ce57a-feec-4d8f-b2b4-fe87bb632347_4820x1239.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!1Fhr!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F760ce57a-feec-4d8f-b2b4-fe87bb632347_4820x1239.png 424w, https://substackcdn.com/image/fetch/$s_!1Fhr!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F760ce57a-feec-4d8f-b2b4-fe87bb632347_4820x1239.png 848w, https://substackcdn.com/image/fetch/$s_!1Fhr!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F760ce57a-feec-4d8f-b2b4-fe87bb632347_4820x1239.png 1272w, https://substackcdn.com/image/fetch/$s_!1Fhr!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F760ce57a-feec-4d8f-b2b4-fe87bb632347_4820x1239.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!1Fhr!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F760ce57a-feec-4d8f-b2b4-fe87bb632347_4820x1239.png" width="1456" height="374" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/760ce57a-feec-4d8f-b2b4-fe87bb632347_4820x1239.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:374,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:283966,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!1Fhr!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F760ce57a-feec-4d8f-b2b4-fe87bb632347_4820x1239.png 424w, https://substackcdn.com/image/fetch/$s_!1Fhr!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F760ce57a-feec-4d8f-b2b4-fe87bb632347_4820x1239.png 848w, https://substackcdn.com/image/fetch/$s_!1Fhr!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F760ce57a-feec-4d8f-b2b4-fe87bb632347_4820x1239.png 1272w, https://substackcdn.com/image/fetch/$s_!1Fhr!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F760ce57a-feec-4d8f-b2b4-fe87bb632347_4820x1239.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Here are the steps to introduce ATDD for System UI Redesign in Legacy Code. I&#8217;ll provide you with step-by-step guidance on how to apply ATDD in your GitHub Sandbox Project. &#11015;&#65039;&#11015;&#65039;&#11015;&#65039;</p>
      <p>
          <a href="https://journal.optivem.com/p/atdd-in-legacy-code-system-ui-redesign">
              Read more
          </a>
      </p>
   ]]></content:encoded></item><item><title><![CDATA[TDD in Legacy Code - ATDD for Bugs]]></title><description><![CDATA[Developers sometimes try to solve bugs without first having reproduced the bug. There can also be miscommunication between Developers & QA Engineer regarding bugs. How do we reach alignment? Use ATDD.]]></description><link>https://journal.optivem.com/p/atdd-in-legacy-code-bugs</link><guid isPermaLink="false">https://journal.optivem.com/p/atdd-in-legacy-code-bugs</guid><dc:creator><![CDATA[Valentina Jemuović]]></dc:creator><pubDate>Thu, 16 Jan 2025 07:00:59 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/8d8d158a-6e26-40fb-ab73-54742dc838ca_1000x666.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><em>&#128274;Hello, this is Valentina with a premium issue of the Optivem Journal. I help Engineering Leaders &amp; Senior Software Developers apply TDD in Legacy Code. This article is part of the <a href="https://journal.optivem.com/p/tdd-in-legacy-code-outline">TDD in Legacy Code</a> series.</em></p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://journal.optivem.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://journal.optivem.com/subscribe?"><span>Subscribe now</span></a></p><div><hr></div><h2>Problem #1: The bug isn&#8217;t solved?!</h2><p>Sometimes when Developers get a Bug ticket, they immediately jump to the &#8220;solution&#8220; (they immediately think of the bug fix in their mind), open up the code straightaway, make the changes, and as soon as possible, hand it over to QA Engineers. But then the QA Engineer tests the fix, and says that the bug wasn&#8217;t actually solved. Or it may even pass the QA testing, but the User complains that the bug wasn&#8217;t fixed.</p><p>Why? The developer hadn&#8217;t actually reproduced the bug BEFORE attempting to fix the bug.</p><h2>Problem #2: The bugs keep re-reoccurring!</h2><p>Many teams face the challenge of fixing a bug, having it tested by QA, and having the fix deployed to Production&#8230; But then, some months later, the same bug appears in the system! What&#8217;s even worse is that the bug keeps coming back, it&#8217;s unstoppable.</p><p>Why? The bug fix was only verified manually, with no automated verification. This means that when we introduce the bug again, we have no idea.</p><h2>Solution: Use ATDD for reliable Bug Fixing</h2><p>By applying ATDD to fix bugs, it helps us solve problems:</p><ul><li><p>Through the Bug report, we translate the expected behavior into a failing Acceptance Test, to prove that we&#8217;ve reproduced the bug</p></li><li><p>Then, when we implement the bug fix, and the Acceptance Test passes, we can be sure that we&#8217;ve fixed the bug</p></li><li><p>Lastly, the Acceptance Test remains in our Test Suite, so if the bug accidentally ever occurs again, it will be caught by the Acceptance Test (thus, the bug won&#8217;t reach the QA Engineer, and won&#8217;t reach the End User)</p></li></ul><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!K9Uy!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe1305dc0-875c-4456-9e60-1ca8a751ed4d_4820x1239.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!K9Uy!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe1305dc0-875c-4456-9e60-1ca8a751ed4d_4820x1239.png 424w, https://substackcdn.com/image/fetch/$s_!K9Uy!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe1305dc0-875c-4456-9e60-1ca8a751ed4d_4820x1239.png 848w, https://substackcdn.com/image/fetch/$s_!K9Uy!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe1305dc0-875c-4456-9e60-1ca8a751ed4d_4820x1239.png 1272w, https://substackcdn.com/image/fetch/$s_!K9Uy!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe1305dc0-875c-4456-9e60-1ca8a751ed4d_4820x1239.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!K9Uy!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe1305dc0-875c-4456-9e60-1ca8a751ed4d_4820x1239.png" width="1456" height="374" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/e1305dc0-875c-4456-9e60-1ca8a751ed4d_4820x1239.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:374,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:283966,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:&quot;&quot;,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!K9Uy!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe1305dc0-875c-4456-9e60-1ca8a751ed4d_4820x1239.png 424w, https://substackcdn.com/image/fetch/$s_!K9Uy!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe1305dc0-875c-4456-9e60-1ca8a751ed4d_4820x1239.png 848w, https://substackcdn.com/image/fetch/$s_!K9Uy!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe1305dc0-875c-4456-9e60-1ca8a751ed4d_4820x1239.png 1272w, https://substackcdn.com/image/fetch/$s_!K9Uy!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe1305dc0-875c-4456-9e60-1ca8a751ed4d_4820x1239.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Here are the steps to introduce ATDD for Bug Fixes in Legacy Code. I&#8217;ll provide you with step-by-step guidance on how to introduce ATDD in your GitHub Sandbox Project. &#11015;&#65039;&#11015;&#65039;&#11015;&#65039;</p>
      <p>
          <a href="https://journal.optivem.com/p/atdd-in-legacy-code-bugs">
              Read more
          </a>
      </p>
   ]]></content:encoded></item><item><title><![CDATA[73% reduction in Production Bugs @ Carlo Gavazzi Controls (Alessandro Fardin)]]></title><description><![CDATA[Many companies make the mistake - let&#8217;s just write Unit Tests, get 80% Code Coverage&#8230;]]></description><link>https://journal.optivem.com/p/acceptance-tests-carlo-gavazzi-controls-alessandro-fardin</link><guid isPermaLink="false">https://journal.optivem.com/p/acceptance-tests-carlo-gavazzi-controls-alessandro-fardin</guid><dc:creator><![CDATA[Valentina Jemuović]]></dc:creator><pubDate>Mon, 13 Jan 2025 09:18:48 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/3b724508-c371-4c08-a052-b15d5d372f9d_1000x666.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><em>&#128075; Hello, this is Valentina with the free edition of the Optivem Journal. I help Engineering Leaders &amp; Senior Software Developers apply <a href="https://journal.optivem.com/p/tdd-in-legacy-code-transformation">TDD in Legacy Code</a>.</em></p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://journal.optivem.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://journal.optivem.com/subscribe?"><span>Subscribe now</span></a></p><div><hr></div><h2>4000 Acceptance Tests in &lt; 1h</h2><p>Alessandro Fardin, Software Engineering Team Lead at Carlo Gavazzi Controls, Italy, <a href="https://journal.optivem.com/p/tdd-rewriting-3-million-lines-of-code/comment/75496260">has shared his success story</a> of using Acceptance Tests on <a href="https://journal.optivem.com/p/tdd-rewriting-3-million-lines-of-code/comment/75496260">Substack</a> discussion.</p><blockquote><p>&#8220;&#8230; some years ago we start a Continuous Delivery transformation journey.</p><p>Our application is a iiot gateway Linux embedded device</p><p>We change lots of things in our behavior, we had only manual tests then we started to add automatic acceptance tests, now we have a suite of 4000 tests that run in parallel in about 30 minutes.&#8221;</p></blockquote><p>He summarized the transformation:</p><blockquote><p>&#8220;from late phase manual test --&gt; frequent and early manual test</p><p>from manual test --&gt; continuous automatic accepting test</p><p>continuous automatic accepting test (14 hours)---&gt; fast parallel accepting test (40 minutes)&#8221;</p></blockquote><h2>Lessons Learnt #1</h2><p>It&#8217;s ok to start with manual testing. Indeed, that&#8217;s where most companies are.</p><p>Here&#8217;s the transition process:</p><ol><li><p>Most companies start with late phase manual testing, typically testing in preparation for a production release. This might delay the release by several months.</p></li><li><p>The first point of improvement is to switch to earlier and more frequent manual testing, rather than doing it all at the end.</p></li><li><p>We&#8217;ll then start feeling the pain of manual testing, and realize it&#8217;s too expensive to do it earlier and more frequently. So then we need to replace Manual QA testing by automated Acceptance Testing.</p></li><li><p>Lastly, we want to reduce the runtime of automated Acceptance Testing. By parallelizing these tests, it goes a long way forward.</p></li></ol><h2>Acceptance Tests in Continuous Delivery</h2><p>Acceptance Tests are a crucial part of Continuous Delivery, and they have the biggest impact, compared to other lower-level tests.</p><p>Many companies make the mistake - let&#8217;s just write Unit Tests, get 80% Code Coverage&#8230; but yet Acceptance Testing is still done manually - by the QA Engineers.</p><p>Fortunately, Alessandro&#8217;s team took the right approach, starting top down with Acceptance Tests as a replacement of Manual Regression Testing. This has the highest visible impact - it has the biggest impact in reducing the delivery cycle length AND also reducing production bugs.</p><p>Acceptance Testing is crucial in reducing the overall system-level feedback loop and removing the waste of Manual Regression Testing.</p><p>Alessandro Fardin <a href="https://www.linkedin.com/feed/update/urn:li:activity:7161881106881982464/">shared his story</a> (here's the version translated to English):</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!vWBr!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbfef7acc-4fdc-4f27-ba4d-4c193f167738_574x790.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!vWBr!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbfef7acc-4fdc-4f27-ba4d-4c193f167738_574x790.png 424w, https://substackcdn.com/image/fetch/$s_!vWBr!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbfef7acc-4fdc-4f27-ba4d-4c193f167738_574x790.png 848w, https://substackcdn.com/image/fetch/$s_!vWBr!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbfef7acc-4fdc-4f27-ba4d-4c193f167738_574x790.png 1272w, https://substackcdn.com/image/fetch/$s_!vWBr!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbfef7acc-4fdc-4f27-ba4d-4c193f167738_574x790.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!vWBr!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbfef7acc-4fdc-4f27-ba4d-4c193f167738_574x790.png" width="574" height="790" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/bfef7acc-4fdc-4f27-ba4d-4c193f167738_574x790.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:790,&quot;width&quot;:574,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:73998,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!vWBr!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbfef7acc-4fdc-4f27-ba4d-4c193f167738_574x790.png 424w, https://substackcdn.com/image/fetch/$s_!vWBr!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbfef7acc-4fdc-4f27-ba4d-4c193f167738_574x790.png 848w, https://substackcdn.com/image/fetch/$s_!vWBr!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbfef7acc-4fdc-4f27-ba4d-4c193f167738_574x790.png 1272w, https://substackcdn.com/image/fetch/$s_!vWBr!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbfef7acc-4fdc-4f27-ba4d-4c193f167738_574x790.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><h2>What are the results?</h2><p>Some key ingredients included:</p><ul><li><p>Pipeline</p></li><li><p>Acceptance Tests</p></li></ul><p>See the <a href="https://garygruver.com/docs/whitepapers/Carlo-Gavazzi-Controls-Black-Belt-Case-Study.pdf">Carlo Gavazzi Controls Black Belt Case Study</a>.</p><p>The result was a 43% reduction in defects found in production. The feedback cycle was reduced from several months to 40 mins, and deployment from 6 months to 1 month. Developers also reduced time spent on bug fixing by 30%.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!9S7_!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffba33dc7-99b3-4b46-9193-82ca96aff89a_436x256.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!9S7_!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffba33dc7-99b3-4b46-9193-82ca96aff89a_436x256.png 424w, https://substackcdn.com/image/fetch/$s_!9S7_!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffba33dc7-99b3-4b46-9193-82ca96aff89a_436x256.png 848w, https://substackcdn.com/image/fetch/$s_!9S7_!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffba33dc7-99b3-4b46-9193-82ca96aff89a_436x256.png 1272w, https://substackcdn.com/image/fetch/$s_!9S7_!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffba33dc7-99b3-4b46-9193-82ca96aff89a_436x256.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!9S7_!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffba33dc7-99b3-4b46-9193-82ca96aff89a_436x256.png" width="436" height="256" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/fba33dc7-99b3-4b46-9193-82ca96aff89a_436x256.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:256,&quot;width&quot;:436,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:30750,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!9S7_!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffba33dc7-99b3-4b46-9193-82ca96aff89a_436x256.png 424w, https://substackcdn.com/image/fetch/$s_!9S7_!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffba33dc7-99b3-4b46-9193-82ca96aff89a_436x256.png 848w, https://substackcdn.com/image/fetch/$s_!9S7_!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffba33dc7-99b3-4b46-9193-82ca96aff89a_436x256.png 1272w, https://substackcdn.com/image/fetch/$s_!9S7_!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffba33dc7-99b3-4b46-9193-82ca96aff89a_436x256.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Source: <a href="https://garygruver.com/docs/whitepapers/Carlo-Gavazzi-Controls-Black-Belt-Case-Study.pdf">Carlo Gavazzi Controls Black Belt Case Study</a></p><h2>Lessons Learnt #2</h2><p>If you&#8217;re going to start automated tests, starting with Acceptance Tests. They are the tests with highest visible ROI - testing the system from the End User perspective, testing User Story Acceptance Criteria and it has a direct impact on Bug Tickets.</p><p>After you do this, then sure, look at lower level tests.</p><p>That&#8217;s the same sequence I follow as part of the <a href="https://journal.optivem.com/p/tdd-in-legacy-code-outline">TDD in Legacy Code</a> series. We start with the System Level first (Acceptance Testing &amp; ATDD) before we go onto apply TDD at the lower levels (Component Testing &amp; CTDD, Unit Testing &amp; TDD).</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://journal.optivem.com/p/acceptance-tests-carlo-gavazzi-controls-alessandro-fardin/comments&quot;,&quot;text&quot;:&quot;Leave a comment&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://journal.optivem.com/p/acceptance-tests-carlo-gavazzi-controls-alessandro-fardin/comments"><span>Leave a comment</span></a></p><h2>Share your success story</h2><p>I&#8217;d like to feature TDD success stories in future editions. To share your story, write a comment below. &#128170;</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://journal.optivem.com/p/acceptance-tests-carlo-gavazzi-controls-alessandro-fardin/comments&quot;,&quot;text&quot;:&quot;Leave a comment&quot;,&quot;action&quot;:null,&quot;class&quot;:&quot;button-wrapper&quot;}" data-component-name="ButtonCreateButton"><a class="button primary button-wrapper" href="https://journal.optivem.com/p/acceptance-tests-carlo-gavazzi-controls-alessandro-fardin/comments"><span>Leave a comment</span></a></p><div><hr></div><h4>Want to apply TDD in practice?</h4><p>You tried TDD, but it didn&#8217;t work. That's why I'm going to help you practice TDD step-by-step. Apply TDD on a sandbox project. <a href="https://journal.optivem.com/p/tdd-in-legacy-code-transformation">Access TDD in Legacy Code.</a></p><div><hr></div><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://journal.optivem.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">TDD &#183; Hexagonal Architecture &#183; Clean Architecture. Join 5K+ subscribers</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[TDD in Legacy Code - ATDD for User Stories - External System DSL]]></title><description><![CDATA[How do we apply ATDD when the External System DSL isn't implemented yet? We'll then need to implement the External System DSL & Driver, before we can implement the System.]]></description><link>https://journal.optivem.com/p/atdd-in-legacy-code-user-stories-external-system-dsl</link><guid isPermaLink="false">https://journal.optivem.com/p/atdd-in-legacy-code-user-stories-external-system-dsl</guid><dc:creator><![CDATA[Valentina Jemuović]]></dc:creator><pubDate>Fri, 10 Jan 2025 07:01:25 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/e6c22949-fe94-46f1-9692-916f6a9b2972_1000x666.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><em>&#128274;Hello, this is Valentina with a premium issue of the Optivem Journal. I help Engineering Leaders &amp; Senior Software Developers apply TDD in Legacy Code. This article is part of the <a href="https://journal.optivem.com/p/tdd-in-legacy-code-outline">TDD in Legacy Code</a> series. To get these articles in your inbox every week, subscribe:</em></p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://journal.optivem.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://journal.optivem.com/subscribe?"><span>Subscribe now</span></a></p><div><hr></div><h2>How to handle implementing External System DSL?</h2><p>Previously, we covered the core process of applying <a href="https://journal.optivem.com/p/atdd-in-legacy-code-user-stories">ATDD for User Stories</a>. However, in that core process, we assumed that the DSL already exists.</p><p>However, what happens when the External System DSL doesn&#8217;t exist? We need to implement the External System DSL and the External System Driver before going towards System implementation.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!dQNJ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5551efc2-103a-4da7-88dd-67c65e3b854c_1258x794.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!dQNJ!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5551efc2-103a-4da7-88dd-67c65e3b854c_1258x794.png 424w, https://substackcdn.com/image/fetch/$s_!dQNJ!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5551efc2-103a-4da7-88dd-67c65e3b854c_1258x794.png 848w, https://substackcdn.com/image/fetch/$s_!dQNJ!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5551efc2-103a-4da7-88dd-67c65e3b854c_1258x794.png 1272w, https://substackcdn.com/image/fetch/$s_!dQNJ!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5551efc2-103a-4da7-88dd-67c65e3b854c_1258x794.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!dQNJ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5551efc2-103a-4da7-88dd-67c65e3b854c_1258x794.png" width="1258" height="794" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/5551efc2-103a-4da7-88dd-67c65e3b854c_1258x794.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:794,&quot;width&quot;:1258,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:97179,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!dQNJ!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5551efc2-103a-4da7-88dd-67c65e3b854c_1258x794.png 424w, https://substackcdn.com/image/fetch/$s_!dQNJ!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5551efc2-103a-4da7-88dd-67c65e3b854c_1258x794.png 848w, https://substackcdn.com/image/fetch/$s_!dQNJ!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5551efc2-103a-4da7-88dd-67c65e3b854c_1258x794.png 1272w, https://substackcdn.com/image/fetch/$s_!dQNJ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5551efc2-103a-4da7-88dd-67c65e3b854c_1258x794.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!K9Uy!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe1305dc0-875c-4456-9e60-1ca8a751ed4d_4820x1239.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!K9Uy!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe1305dc0-875c-4456-9e60-1ca8a751ed4d_4820x1239.png 424w, https://substackcdn.com/image/fetch/$s_!K9Uy!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe1305dc0-875c-4456-9e60-1ca8a751ed4d_4820x1239.png 848w, https://substackcdn.com/image/fetch/$s_!K9Uy!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe1305dc0-875c-4456-9e60-1ca8a751ed4d_4820x1239.png 1272w, https://substackcdn.com/image/fetch/$s_!K9Uy!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe1305dc0-875c-4456-9e60-1ca8a751ed4d_4820x1239.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!K9Uy!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe1305dc0-875c-4456-9e60-1ca8a751ed4d_4820x1239.png" width="1456" height="374" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/e1305dc0-875c-4456-9e60-1ca8a751ed4d_4820x1239.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:374,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:283966,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:&quot;&quot;,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!K9Uy!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe1305dc0-875c-4456-9e60-1ca8a751ed4d_4820x1239.png 424w, https://substackcdn.com/image/fetch/$s_!K9Uy!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe1305dc0-875c-4456-9e60-1ca8a751ed4d_4820x1239.png 848w, https://substackcdn.com/image/fetch/$s_!K9Uy!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe1305dc0-875c-4456-9e60-1ca8a751ed4d_4820x1239.png 1272w, https://substackcdn.com/image/fetch/$s_!K9Uy!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe1305dc0-875c-4456-9e60-1ca8a751ed4d_4820x1239.png 1456w" sizes="100vw"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Here are the steps to introduce ATDD for new User Stories in Legacy Code, in the case where the External System DSL does not exist. I&#8217;ll provide you with step-by-step guidance on how to introduce ATDD in your GitHub Sandbox Project. &#11015;&#65039;&#11015;&#65039;&#11015;&#65039;</p>
      <p>
          <a href="https://journal.optivem.com/p/atdd-in-legacy-code-user-stories-external-system-dsl">
              Read more
          </a>
      </p>
   ]]></content:encoded></item><item><title><![CDATA[TDD in Legacy Code - ATDD for User Stories - System DSL]]></title><description><![CDATA[How do we apply ATDD when the System DSL isn't implemented yet? We need to implement the System DSL & Driver, before we can implement the System.]]></description><link>https://journal.optivem.com/p/atdd-in-legacy-code-user-stories-system-dsl</link><guid isPermaLink="false">https://journal.optivem.com/p/atdd-in-legacy-code-user-stories-system-dsl</guid><dc:creator><![CDATA[Valentina Jemuović]]></dc:creator><pubDate>Fri, 03 Jan 2025 07:01:24 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/793e1bc6-ac09-4d70-862b-470bc4c32602_1000x666.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><em>&#128274;Hello, this is Valentina with a premium issue of the Optivem Journal. I help Engineering Leaders &amp; Senior Software Developers apply TDD in Legacy Code. This article is part of the <a href="https://journal.optivem.com/p/tdd-in-legacy-code-outline">TDD in Legacy Code</a> series. To get these articles in your inbox every week, subscribe:</em></p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://journal.optivem.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://journal.optivem.com/subscribe?"><span>Subscribe now</span></a></p><div><hr></div><h2>How to handle implementing System DSL?</h2><p>Previously, we covered the core process of applying <a href="https://journal.optivem.com/p/atdd-in-legacy-code-user-stories">ATDD for User Stories</a>, where we assumed that the DSL exists.</p><p>However, what if the System DSL doesn&#8217;t exist? We need to implement the System DSL and the System Driver before going towards System implementation.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!rO5v!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff7653071-864a-4b64-83f5-09d96d91fa3f_1473x678.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!rO5v!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff7653071-864a-4b64-83f5-09d96d91fa3f_1473x678.png 424w, https://substackcdn.com/image/fetch/$s_!rO5v!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff7653071-864a-4b64-83f5-09d96d91fa3f_1473x678.png 848w, https://substackcdn.com/image/fetch/$s_!rO5v!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff7653071-864a-4b64-83f5-09d96d91fa3f_1473x678.png 1272w, https://substackcdn.com/image/fetch/$s_!rO5v!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff7653071-864a-4b64-83f5-09d96d91fa3f_1473x678.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!rO5v!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff7653071-864a-4b64-83f5-09d96d91fa3f_1473x678.png" width="1456" height="670" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/f7653071-864a-4b64-83f5-09d96d91fa3f_1473x678.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:670,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:96606,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!rO5v!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff7653071-864a-4b64-83f5-09d96d91fa3f_1473x678.png 424w, https://substackcdn.com/image/fetch/$s_!rO5v!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff7653071-864a-4b64-83f5-09d96d91fa3f_1473x678.png 848w, https://substackcdn.com/image/fetch/$s_!rO5v!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff7653071-864a-4b64-83f5-09d96d91fa3f_1473x678.png 1272w, https://substackcdn.com/image/fetch/$s_!rO5v!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff7653071-864a-4b64-83f5-09d96d91fa3f_1473x678.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!K9Uy!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe1305dc0-875c-4456-9e60-1ca8a751ed4d_4820x1239.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!K9Uy!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe1305dc0-875c-4456-9e60-1ca8a751ed4d_4820x1239.png 424w, https://substackcdn.com/image/fetch/$s_!K9Uy!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe1305dc0-875c-4456-9e60-1ca8a751ed4d_4820x1239.png 848w, https://substackcdn.com/image/fetch/$s_!K9Uy!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe1305dc0-875c-4456-9e60-1ca8a751ed4d_4820x1239.png 1272w, https://substackcdn.com/image/fetch/$s_!K9Uy!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe1305dc0-875c-4456-9e60-1ca8a751ed4d_4820x1239.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!K9Uy!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe1305dc0-875c-4456-9e60-1ca8a751ed4d_4820x1239.png" width="1456" height="374" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/e1305dc0-875c-4456-9e60-1ca8a751ed4d_4820x1239.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:374,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:283966,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!K9Uy!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe1305dc0-875c-4456-9e60-1ca8a751ed4d_4820x1239.png 424w, https://substackcdn.com/image/fetch/$s_!K9Uy!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe1305dc0-875c-4456-9e60-1ca8a751ed4d_4820x1239.png 848w, https://substackcdn.com/image/fetch/$s_!K9Uy!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe1305dc0-875c-4456-9e60-1ca8a751ed4d_4820x1239.png 1272w, https://substackcdn.com/image/fetch/$s_!K9Uy!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe1305dc0-875c-4456-9e60-1ca8a751ed4d_4820x1239.png 1456w" sizes="100vw"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Here are the steps to introduce ATDD for new User Stories in Legacy Code, where where the System DSL does not exist. I&#8217;ll provide you with step-by-step guidance on how to introduce ATDD in your GitHub Sandbox Project. &#11015;&#65039;&#11015;&#65039;&#11015;&#65039;</p>
      <p>
          <a href="https://journal.optivem.com/p/atdd-in-legacy-code-user-stories-system-dsl">
              Read more
          </a>
      </p>
   ]]></content:encoded></item><item><title><![CDATA[TDD in Legacy Code - ATDD for User Stories]]></title><description><![CDATA[Miscommunication about requirements is a huge problem in software development - causing conflict between the PO, Developers & QA Engineer. How do we reach alignment? Use ATDD.]]></description><link>https://journal.optivem.com/p/atdd-in-legacy-code-user-stories</link><guid isPermaLink="false">https://journal.optivem.com/p/atdd-in-legacy-code-user-stories</guid><dc:creator><![CDATA[Valentina Jemuović]]></dc:creator><pubDate>Thu, 26 Dec 2024 07:01:05 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/7223878f-b9e2-43ea-86c3-697ed30198b9_1000x666.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><em>&#128274;Hello, this is Valentina with a premium issue of the Optivem Journal. I help Engineering Leaders &amp; Senior Software Developers apply TDD in Legacy Code. This article is part of the <a href="https://journal.optivem.com/p/tdd-in-legacy-code-outline">TDD in Legacy Code</a> series. To get these articles in your inbox every week, subscribe:</em></p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://journal.optivem.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://journal.optivem.com/subscribe?"><span>Subscribe now</span></a></p><div><hr></div><h2>Writing Acceptance Tests at the end? Chaos.</h2><p>When working in Legacy Code, the team was used to a siloed way of working, where developers do coding, and then QA does testing. So they see testing as something that comes at the end.</p><p>This means, even after learning automated Acceptance Testing, we might be drawn to old habits - writing those Acceptance Tests at the end.</p><p>But what happens when we write Acceptance Tests at the end?</p><ul><li><p>We may discover that we actually don&#8217;t understand the Acceptance Criteria, that the Acceptance Criteria wasn&#8217;t written in a testable way</p></li><li><p>We may discover that the PO had one interpretation of an Acceptance Criteria, Developers had another interpretation, and QA Engineer had yet another interpretation</p></li></ul><h2>Writing Acceptance Tests at the start? Alignment.</h2><p>So how do we solve the problem of misinterpretations and misunderstandings?</p><p>Start by eliminating silos. Even though the PO has ownership over Acceptance Criteria, the whole team should be involved in <a href="https://journal.optivem.com/p/backlog-refinement-in-legacy-code">Backlog Refinement</a>, so that the Acceptance Criteria is written in a testable way.</p><p>Since we have testable Acceptance Criteria, we can convert it to Acceptance Tests before starting implementation. For new User Stories, we should be applying ATDD.</p><h2>How to practice ATDD on User Stories</h2><p>After refinement, a User Story should have testable Acceptance Criteria. We can incrementally take each Acceptance Criteria, one by one: convert the Acceptance Criteria into an Acceptance Test, implement code changes to the System so that the Acceptance Test is passing (indeed, all the Acceptance Tests should pass), and finally refactor if needed (ensuring that all the Acceptance Tests are still passing).</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!DvNv!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F60fa3c54-26c7-481d-a716-79218a0f13fa_1880x531.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!DvNv!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F60fa3c54-26c7-481d-a716-79218a0f13fa_1880x531.png 424w, https://substackcdn.com/image/fetch/$s_!DvNv!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F60fa3c54-26c7-481d-a716-79218a0f13fa_1880x531.png 848w, https://substackcdn.com/image/fetch/$s_!DvNv!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F60fa3c54-26c7-481d-a716-79218a0f13fa_1880x531.png 1272w, https://substackcdn.com/image/fetch/$s_!DvNv!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F60fa3c54-26c7-481d-a716-79218a0f13fa_1880x531.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!DvNv!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F60fa3c54-26c7-481d-a716-79218a0f13fa_1880x531.png" width="1456" height="411" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/60fa3c54-26c7-481d-a716-79218a0f13fa_1880x531.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:411,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:72436,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!DvNv!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F60fa3c54-26c7-481d-a716-79218a0f13fa_1880x531.png 424w, https://substackcdn.com/image/fetch/$s_!DvNv!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F60fa3c54-26c7-481d-a716-79218a0f13fa_1880x531.png 848w, https://substackcdn.com/image/fetch/$s_!DvNv!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F60fa3c54-26c7-481d-a716-79218a0f13fa_1880x531.png 1272w, https://substackcdn.com/image/fetch/$s_!DvNv!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F60fa3c54-26c7-481d-a716-79218a0f13fa_1880x531.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p><div><hr></div><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Rfe0!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd8b2ee20-cfad-4eb5-a163-a221d44cf86f_1358x736.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Rfe0!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd8b2ee20-cfad-4eb5-a163-a221d44cf86f_1358x736.png 424w, https://substackcdn.com/image/fetch/$s_!Rfe0!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd8b2ee20-cfad-4eb5-a163-a221d44cf86f_1358x736.png 848w, https://substackcdn.com/image/fetch/$s_!Rfe0!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd8b2ee20-cfad-4eb5-a163-a221d44cf86f_1358x736.png 1272w, https://substackcdn.com/image/fetch/$s_!Rfe0!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd8b2ee20-cfad-4eb5-a163-a221d44cf86f_1358x736.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Rfe0!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd8b2ee20-cfad-4eb5-a163-a221d44cf86f_1358x736.png" width="1358" height="736" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/d8b2ee20-cfad-4eb5-a163-a221d44cf86f_1358x736.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:736,&quot;width&quot;:1358,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:89881,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!Rfe0!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd8b2ee20-cfad-4eb5-a163-a221d44cf86f_1358x736.png 424w, https://substackcdn.com/image/fetch/$s_!Rfe0!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd8b2ee20-cfad-4eb5-a163-a221d44cf86f_1358x736.png 848w, https://substackcdn.com/image/fetch/$s_!Rfe0!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd8b2ee20-cfad-4eb5-a163-a221d44cf86f_1358x736.png 1272w, https://substackcdn.com/image/fetch/$s_!Rfe0!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd8b2ee20-cfad-4eb5-a163-a221d44cf86f_1358x736.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!K9Uy!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe1305dc0-875c-4456-9e60-1ca8a751ed4d_4820x1239.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!K9Uy!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe1305dc0-875c-4456-9e60-1ca8a751ed4d_4820x1239.png 424w, https://substackcdn.com/image/fetch/$s_!K9Uy!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe1305dc0-875c-4456-9e60-1ca8a751ed4d_4820x1239.png 848w, https://substackcdn.com/image/fetch/$s_!K9Uy!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe1305dc0-875c-4456-9e60-1ca8a751ed4d_4820x1239.png 1272w, https://substackcdn.com/image/fetch/$s_!K9Uy!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe1305dc0-875c-4456-9e60-1ca8a751ed4d_4820x1239.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!K9Uy!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe1305dc0-875c-4456-9e60-1ca8a751ed4d_4820x1239.png" width="1456" height="374" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/e1305dc0-875c-4456-9e60-1ca8a751ed4d_4820x1239.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:374,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:283966,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!K9Uy!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe1305dc0-875c-4456-9e60-1ca8a751ed4d_4820x1239.png 424w, https://substackcdn.com/image/fetch/$s_!K9Uy!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe1305dc0-875c-4456-9e60-1ca8a751ed4d_4820x1239.png 848w, https://substackcdn.com/image/fetch/$s_!K9Uy!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe1305dc0-875c-4456-9e60-1ca8a751ed4d_4820x1239.png 1272w, https://substackcdn.com/image/fetch/$s_!K9Uy!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe1305dc0-875c-4456-9e60-1ca8a751ed4d_4820x1239.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Here are the steps to introduce ATDD for new User Stories in Legacy Code. I&#8217;ll provide you with step-by-step guidance on how to introduce ATDD in your GitHub Sandbox Project. &#11015;&#65039;&#11015;&#65039;&#11015;&#65039;</p>
      <p>
          <a href="https://journal.optivem.com/p/atdd-in-legacy-code-user-stories">
              Read more
          </a>
      </p>
   ]]></content:encoded></item></channel></rss>