<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: Michalina Graczyk</title>
    <description>The latest articles on Forem by Michalina Graczyk (@michalina_graczyk).</description>
    <link>https://forem.com/michalina_graczyk</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F2496326%2Fd9c06588-0ee8-4c9c-873b-93e3bafefdc2.jpg</url>
      <title>Forem: Michalina Graczyk</title>
      <link>https://forem.com/michalina_graczyk</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/michalina_graczyk"/>
    <language>en</language>
    <item>
      <title>Shift Left Done Right: QA in the Modern SDLC</title>
      <dc:creator>Michalina Graczyk</dc:creator>
      <pubDate>Fri, 11 Apr 2025 20:51:56 +0000</pubDate>
      <link>https://forem.com/michalina_graczyk/shift-left-done-right-qa-in-the-modern-sdlc-5c24</link>
      <guid>https://forem.com/michalina_graczyk/shift-left-done-right-qa-in-the-modern-sdlc-5c24</guid>
      <description>&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;Someone recently told me this could make for a solid tech talk 🤔. But before I think about that, let me start with the article first.&lt;/p&gt;

&lt;p&gt;“Shift Left” is a proactive approach to quality assurance that embeds testing and quality checks early in the software development lifecycle (SDLC). Instead of testing after the fact, the goal is to build quality from the ground up - during planning, design, and development phases.&lt;/p&gt;

&lt;p&gt;If you’re wondering how to actually &lt;em&gt;do that&lt;/em&gt; across a team or an organization, you’re in the right place. This article breaks down the process, what’s involved, and how you can start shifting left in your own context.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Shift Left?
&lt;/h2&gt;

&lt;p&gt;In many companies, QA is treated as a final checkpoint, the last step before release. This leads to bugs being discovered late, expensive fixes, rushed patches, and a general lack of confidence in production quality.&lt;/p&gt;

&lt;p&gt;Shifting Left solves this by moving quality ownership to the beginning of the SDLC. It creates space for collaboration, predictability, and shared responsibility, long before the first line of code is written.&lt;/p&gt;

&lt;p&gt;Here are some of the benefits:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Catch issues early and reduce post-release bugs&lt;/li&gt;
&lt;li&gt;Boost developer confidence in releases&lt;/li&gt;
&lt;li&gt;Speed up CI/CD pipelines by removing late-stage bottlenecks&lt;/li&gt;
&lt;li&gt;Shift the mindset - quality is &lt;em&gt;everyone’s&lt;/em&gt; responsibility&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  How to Introduce Shift Left in an Organization
&lt;/h2&gt;

&lt;p&gt;Here’s a high-level guide to designing a Shift Left approach that works beyond just your QA team.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Map Your Current SDLC and Find the Gaps
&lt;/h3&gt;

&lt;p&gt;Start by mapping how your current development process looks from ideation to release. Where do bugs typically show up? When is QA brought into the picture? How are changes verified?&lt;/p&gt;

&lt;p&gt;Look for indicators like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Testing concentrated only at the end&lt;/li&gt;
&lt;li&gt;Manual verification of business flows&lt;/li&gt;
&lt;li&gt;Lack of API or integration test coverage&lt;/li&gt;
&lt;li&gt;Missing metrics for bugs, flaky tests, or regressions&lt;/li&gt;
&lt;li&gt;Refinements without proper edge case consideration&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This will help you uncover bottlenecks and missed opportunities for earlier quality gates.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Define a Shift Left Version of Your SDLC
&lt;/h3&gt;

&lt;p&gt;Once you know what’s missing, redesign your SDLC by shifting quality checkpoints at each phase:&lt;/p&gt;

&lt;h3&gt;
  
  
  🧩 &lt;strong&gt;Planning &amp;amp; Refinement Phase&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;QA joins the requirement and design reviews&lt;/li&gt;
&lt;li&gt;Define what questions &lt;strong&gt;must&lt;/strong&gt; be asked during the business refinement&lt;/li&gt;
&lt;li&gt;Early identification of UI/UX risks&lt;/li&gt;
&lt;li&gt;Define acceptance criteria&lt;/li&gt;
&lt;li&gt;Define test scope, test cases, and edge cases before development&lt;/li&gt;
&lt;li&gt;Propose early metrics for observability&lt;/li&gt;
&lt;li&gt;Capture everything in documentation before implementation begins&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  👩🏽‍💻 &lt;strong&gt;Development Phase&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Developers start from well-defined requirements&lt;/li&gt;
&lt;li&gt;Code reviews include quality and testability checks&lt;/li&gt;
&lt;li&gt;Unit tests are written alongside code&lt;/li&gt;
&lt;li&gt;CI runs automated tests on every PR&lt;/li&gt;
&lt;li&gt;Docs are updated continuously&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  🧪 &lt;strong&gt;Testing Phase&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Automated regression and integration tests execute reliably&lt;/li&gt;
&lt;li&gt;Manual testing only where needed (complex UX or edge cases)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  ⚒️ &lt;strong&gt;Deployment &amp;amp; Maintenance Phase&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Release testing confirms production readiness&lt;/li&gt;
&lt;li&gt;Monitoring is set up for performance and usage metrics&lt;/li&gt;
&lt;li&gt;Post-release issues inform the feedback loop&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;As you can see, most of the real quality work happens &lt;em&gt;before&lt;/em&gt; the testing phase. That’s the essence of shifting left.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Overhaul Your Test Strategy
&lt;/h3&gt;

&lt;p&gt;You can’t Shift Left without rethinking how and where you test. That often includes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Moving from end-to-end UI tests to API or UI-integration tests with mocked data&lt;/li&gt;
&lt;li&gt;Tracking flakiness&lt;/li&gt;
&lt;li&gt;Mapping release flows to spot CI issues&lt;/li&gt;
&lt;li&gt;Defining clear ownership for test cases and post-release metrics&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Test automation should enable your team, not slow it down. You want fast feedback loops, reliable signals, and minimal overhead.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Success Can Look Like
&lt;/h2&gt;

&lt;p&gt;When done well, Shift Left can radically change how your teams work:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Better Refinements&lt;/strong&gt; - guided by quality-focused questions, not just deadlines&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Docs Before Code&lt;/strong&gt; - developers know what to build before they start&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Early Visibility&lt;/strong&gt; - teams measure what matters and address risks up front&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Faster Releases&lt;/strong&gt; - less testing at the end means more predictable deployments&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Empowered QA&lt;/strong&gt; - no longer a bottleneck, QA becomes an enabler of quality at every stage&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And the biggest win? &lt;strong&gt;A shared understanding that quality isn’t owned by QA - it’s owned by the entire team.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Final Thoughts
&lt;/h2&gt;

&lt;p&gt;Implementing Shift Left wasn’t about adding extra process, it was about changing how teams &lt;em&gt;think&lt;/em&gt; about quality.&lt;/p&gt;

&lt;p&gt;It’s about shifting critical conversations earlier, embedding quality into planning, and treating it as a shared responsibility from day one. It's about thinking from the user’s perspective before a single line of code is written. About building integration-ready, testable software and spotting potential risks early instead of firefighting later.&lt;/p&gt;

&lt;p&gt;This approach enables teams to move faster &lt;em&gt;and&lt;/em&gt; with more confidence. It reduces waste, clarifies expectations, and creates a culture where quality is designed, not just tested.&lt;/p&gt;

&lt;p&gt;Because at the end of the day, &lt;strong&gt;&lt;em&gt;quality is everyone’s responsibility&lt;/em&gt;&lt;/strong&gt; 🎀&lt;/p&gt;

&lt;p&gt;If you’re thinking about driving a Shift Left transformation in your organization, I’d be happy to talk. &lt;/p&gt;

&lt;p&gt;Let’s connect 👇&lt;/p&gt;

</description>
      <category>shiftleft</category>
      <category>qualityassurance</category>
      <category>testing</category>
      <category>softwareengineering</category>
    </item>
    <item>
      <title>From Cypress to Playwright - Saleor’s Voyage</title>
      <dc:creator>Michalina Graczyk</dc:creator>
      <pubDate>Fri, 29 Nov 2024 11:05:23 +0000</pubDate>
      <link>https://forem.com/saleor/from-cypress-to-playwright-saleors-voyage-5d8f</link>
      <guid>https://forem.com/saleor/from-cypress-to-playwright-saleors-voyage-5d8f</guid>
      <description>&lt;p&gt;This is the story of our path from our early days of automated testing, to adapting to new tools, and finally to where we stand today with a more robust and efficient testing framework.&lt;/p&gt;

&lt;p&gt;Saleor recently migrated our end-to-end test suite from Cypress to Playwright. In this article we share our journey, the challenges we encountered, and how the transition unfolded.&lt;/p&gt;

&lt;p&gt;The decision to make the switch from one tool to another is never taken lightly. It needs to be carefully weighed up as it can impact the entire workflow and stability of our projects.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;How it started&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Let’s take a trip back to 2020. It’s the beginning of the pandemic and I’m diving into adding the first storefront end-to-end tests written in Cypress. Back then, we didn't have a CI/CD setup - GitHub history shows that our deployment workflow was established in 2021.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Why we decided to use Cypress in 2020&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Well, one thing was certain, we needed automation. There weren’t many tools to choose between on the market, so the decision was straightforward. Selenium’s ongoing problems with drivers and debugging made it a no-go for us. Cypress was more user-friendly and was on top at the time - the future seemed bright for end-to-end automation.&lt;/p&gt;

&lt;p&gt;As the years passed, our QA team grew and we had more and more tests. Around 2022 we decided to upgrade to the paid version of Cypress to use the dashboard (now Cloud). It was a significant improvement for us, finally we could run tests in parallel!&lt;/p&gt;

&lt;p&gt;Test results were visible, we did some automation with Github. We are still using bots that tell us if the release has some failed tests or not.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Playwright was on the horizon&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;As with every successful tech company, we keep an eye on ‘new-tech’ news. Playwright was gaining some attention and I became intrigued by this new tool. I was also a bit hesitant -  with PlayWright being a new tool, the community was only just starting to grow. In comparison, Cypress was more mature and well-documented, the community was more established, and we had experience with it.&lt;/p&gt;

&lt;p&gt;Even though we had encountered slowdowns and issues with Cypress, I was wary of making a rushed decision to switch test frameworks. Also, who would find the time to rewrite all our Cypress tests to Playwright?!&lt;/p&gt;

&lt;p&gt;Day by day, article by article, it became clear that we would eventually need to make the move. We were running tests so frequently and across so many versions that the cost of Cypress Cloud was becoming prohibitive. We tasked one of our QA team members to experiment with PW in their project. Tests ran faster, and a lot of the issues we experienced with Cypress seemed to vanish.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Cypress vs Playwright&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Let’s take a look at a comparison between the two:&lt;/p&gt;

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

&lt;h2&gt;
  
  
  &lt;strong&gt;Test structures&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Let’s compare the test structures in Playwright and Cypress.&lt;/p&gt;

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

&lt;p&gt;At first, you can notice that PW uses &lt;code&gt;test&lt;/code&gt; to define the test case and &lt;code&gt;expect&lt;/code&gt; from its testing library for assertions.&lt;/p&gt;

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

&lt;p&gt;Cypress uses &lt;strong&gt;&lt;code&gt;it&lt;/code&gt;&lt;/strong&gt; to define the test case and Chai (&lt;strong&gt;&lt;code&gt;expect&lt;/code&gt;&lt;/strong&gt;) for assertions.&lt;/p&gt;

&lt;p&gt;As you can see, the test code looks different. Playwright uses a way of writing code called async/await, which is built into JavaScript. Cypress, on the other hand, has its own method for dealing with tasks that happen at different times, so you don't always need async/await. Assertions with PW uses Jest’s library, whereas Cypress uses its built-in assertion library, powered by Chai.&lt;/p&gt;

&lt;p&gt;Additionally, Playwright features a built-in auto-wait strategy. If the anticipated checks fail to materialize within the designated timeout, the action is flagged with a TimeoutError, mitigating flakiness. In contrast, Cypress is engineered to wait automatically for elements to be present in the Document Object Model (DOM) prior to executing actions such as clicking or form submission. However, this can extend the test duration.&lt;/p&gt;

&lt;p&gt;One of the advantages of PW is iFrame support, Cypress has problems with that which leads to having to do workarounds.&lt;/p&gt;

&lt;p&gt;These examples give you an idea of how Cypress and Playwright differ, but there's much more to explore.&lt;/p&gt;

&lt;h2&gt;
  
  
  Decision and struggling
&lt;/h2&gt;

&lt;p&gt;So, in the middle of 2023, I began discussing the transition to PW with the QA team. We prioritized rewriting the most critical paths first and then tackled less critical but still important tests. During this refactor, we also cleaned up our tests, reducing the number of end-to-end tests in favor of more integration tests.&lt;/p&gt;

&lt;p&gt;As of 2024, we're still grappling with some configuration and workflow issues.&lt;/p&gt;

&lt;p&gt;Our first challenge was adding new workflows for running Playwright on the main branch, on pull requests and keeping workflows for Cypress since we still support older versions of Saleor. We want to keep posting test results on Slack and receive concise information about whether tests pass or fail on the release pull request.&lt;/p&gt;

&lt;p&gt;Currently each pull request trigger the PlayWright tests in parallel. This ensure us that only the most recent changes are tested.&lt;/p&gt;

&lt;p&gt;We also created a workflow for a nightly tests which are running three times per week.&lt;/p&gt;

&lt;p&gt;Last but no least, we have possibility of running tests via Github Actions. It is possible to run it on selected branch or tag.&lt;/p&gt;

&lt;p&gt;We needed to add a Slack notification. We wanted to receive concise information about whether tests pass or fail on the release pull request.&lt;/p&gt;

&lt;p&gt;Therefore, when a release pull request is ready, tests are triggered automatically, and the results are sent to TestMo (the tool for test cases and test results that we are using). In case some tests fail, we receive a Slack notification and comments on the release pull request. If all tests pass, then auto-merge should occur.&lt;/p&gt;

&lt;p&gt;There is still some work to be done, and we still support Cypress tests for older versions of Saleor.&lt;/p&gt;

&lt;h1&gt;
  
  
  Summarizing
&lt;/h1&gt;

&lt;p&gt;Saleor's journey from Cypress to Playwright highlights the evolution of our automated testing framework. Starting with Cypress in 2020, we upgraded to the paid version to support parallel testing. However, rising costs and performance issues led us to explore Playwright, which offered faster execution, broader browser support, and finer control over browser interactions.&lt;/p&gt;

&lt;p&gt;Despite initial hesitations, we began switching to Playwright in mid-2023. We faced configuration and workflow challenges but implemented new workflows for parallel testing, nightly tests, and GitHub Actions integration. Especially, developers found it easier to dive into Playwright tests compared to Cypress. While initially challenging for our QA team, our tests are now faster, more stable, and better organized.&lt;/p&gt;

&lt;p&gt;As of 2024, we still support Cypress for older versions but continue to refine our Playwright-based testing framework for greater efficiency and stability in our CI/CD pipeline. I'm proud of our team for making the switch!&lt;/p&gt;

</description>
      <category>playwright</category>
      <category>testing</category>
      <category>typescript</category>
      <category>cypress</category>
    </item>
  </channel>
</rss>
