<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>qa.codes — Blog</title>
    <description>Walkthroughs, verdicts, and field notes from working QA engineers.</description>
    <link>https://qa.codes/blog</link>
    <atom:link href="https://qa.codes/blog/rss.xml" rel="self" type="application/rss+xml" />
    <language>en-GB</language>
    <lastBuildDate>Sun, 14 Jun 2026 00:00:00 GMT</lastBuildDate>
  <item>
    <title>Scripted vs exploratory testing: when each earns its place</title>
    <link>https://qa.codes/blog/scripted-vs-exploratory-testing</link>
    <guid isPermaLink="true">https://qa.codes/blog/scripted-vs-exploratory-testing</guid>
    <pubDate>Sun, 14 Jun 2026 00:00:00 GMT</pubDate>
    <description>Not a loyalty test — a scheduling one. Scripted proves the behaviour you already know to check; exploratory finds what nobody specified. Here&apos;s which to reach for, when, and how to blend them in one cycle.</description>
    <category>Comparisons</category>
  </item>
  <item>
    <title>Manual vs automated testing: where the line actually falls</title>
    <link>https://qa.codes/blog/manual-vs-automated-testing-where-the-line-falls</link>
    <guid isPermaLink="true">https://qa.codes/blog/manual-vs-automated-testing-where-the-line-falls</guid>
    <pubDate>Sun, 14 Jun 2026 00:00:00 GMT</pubDate>
    <description>Not rivals fighting over the same budget — different jobs. Automation guards what you already know; manual testing judges what you don&apos;t. Draw the line wrong and you get a brittle suite and the important bugs still escaping.</description>
    <category>Comparisons</category>
  </item>
  <item>
    <title>Regression vs retesting: the difference that bites in practice</title>
    <link>https://qa.codes/blog/regression-vs-retesting</link>
    <guid isPermaLink="true">https://qa.codes/blog/regression-vs-retesting</guid>
    <pubDate>Sun, 14 Jun 2026 00:00:00 GMT</pubDate>
    <description>Retesting confirms a fix works; regression checks the fix didn&apos;t break anything else. Plan them as one task and the &apos;we fixed it&apos; build ships a brand-new bug. Here&apos;s the split, and how they combine after a fix.</description>
    <category>Comparisons</category>
  </item>
  <item>
    <title>Smoke vs sanity testing: what each actually buys you</title>
    <link>https://qa.codes/blog/smoke-vs-sanity-testing</link>
    <guid isPermaLink="true">https://qa.codes/blog/smoke-vs-sanity-testing</guid>
    <pubDate>Sun, 14 Jun 2026 00:00:00 GMT</pubDate>
    <description>Smoke asks &apos;is this build worth testing?&apos;; sanity asks &apos;did this change work?&apos; Both are quick gut-checks at different moments. Use them as gates before the real testing — and stop wasting a full pass on a dead build.</description>
    <category>Comparisons</category>
  </item>
  <item>
    <title>Risk-based vs coverage-based test selection</title>
    <link>https://qa.codes/blog/risk-based-vs-coverage-based-test-selection</link>
    <guid isPermaLink="true">https://qa.codes/blog/risk-based-vs-coverage-based-test-selection</guid>
    <pubDate>Sun, 14 Jun 2026 00:00:00 GMT</pubDate>
    <description>Coverage-based testing tries to touch everything a little; risk-based testing concentrates on what matters a lot. Under a deadline — the normal condition — the default you pick decides whether the bug you miss is the costly one or the trivial one.</description>
    <category>Comparisons</category>
  </item>
  <item>
    <title>Black-box vs white-box vs grey-box: what testers actually use</title>
    <link>https://qa.codes/blog/black-box-vs-white-box-vs-grey-box</link>
    <guid isPermaLink="true">https://qa.codes/blog/black-box-vs-white-box-vs-grey-box</guid>
    <pubDate>Sun, 14 Jun 2026 00:00:00 GMT</pubDate>
    <description>The three &apos;box&apos; terms are interview trivia until you use them right: they describe how much of the code you can see when designing a test, which decides what you&apos;ll catch. Most functional QA is quietly grey-box — here&apos;s why.</description>
    <category>Comparisons</category>
  </item>
  <item>
    <title>Centralized QA team vs embedded testers</title>
    <link>https://qa.codes/blog/centralized-vs-embedded-qa</link>
    <guid isPermaLink="true">https://qa.codes/blog/centralized-vs-embedded-qa</guid>
    <pubDate>Sun, 14 Jun 2026 00:00:00 GMT</pubDate>
    <description>Should testers sit in one QA team or inside product squads? An org-design choice, not a tooling one — it shapes when QA gets involved, how consistent the bar is, and whether testers grow as a craft. The trade is proximity vs consistency.</description>
    <category>Comparisons</category>
  </item>
  <item>
    <title>BDD scenarios vs plain test cases: when Gherkin earns its keep</title>
    <link>https://qa.codes/blog/bdd-scenarios-vs-plain-test-cases</link>
    <guid isPermaLink="true">https://qa.codes/blog/bdd-scenarios-vs-plain-test-cases</guid>
    <pubDate>Sun, 14 Jun 2026 00:00:00 GMT</pubDate>
    <description>Given/When/Then isn&apos;t automatically better than a plain test case — it buys shared language with non-testers at the cost of ceremony. Whether that pays off depends on who actually reads and co-writes your tests.</description>
    <category>Comparisons</category>
  </item>
  <item>
    <title>The test pyramid vs the testing trophy: where to put your effort</title>
    <link>https://qa.codes/blog/test-pyramid-vs-testing-trophy</link>
    <guid isPermaLink="true">https://qa.codes/blog/test-pyramid-vs-testing-trophy</guid>
    <pubDate>Sun, 14 Jun 2026 00:00:00 GMT</pubDate>
    <description>The pyramid says most tests should be unit tests; the trophy says integration deserves the bulk. They&apos;re really arguing about where bugs hide in modern apps. Let the shape follow your real escapes, not whose diagram you saw first.</description>
    <category>Comparisons</category>
  </item>
  <item>
    <title>How to write test cases developers actually read</title>
    <link>https://qa.codes/blog/write-test-cases-developers-read</link>
    <guid isPermaLink="true">https://qa.codes/blog/write-test-cases-developers-read</guid>
    <pubDate>Sat, 13 Jun 2026 00:00:00 GMT</pubDate>
    <description>Test cases that get read are short, scannable, and written for the person who has to act on them. Here is the format I use.</description>
    <category>Tutorials</category>
  </item>
  <item>
    <title>The 12 API bugs I check for first</title>
    <link>https://qa.codes/blog/12-api-bugs-i-check-first</link>
    <guid isPermaLink="true">https://qa.codes/blog/12-api-bugs-i-check-first</guid>
    <pubDate>Sat, 13 Jun 2026 00:00:00 GMT</pubDate>
    <description>A high-value checklist: the twelve API bugs that surface most often, from wrong status codes to idempotency failures.</description>
    <category>Tutorials</category>
  </item>
  <item>
    <title>My practical accessibility smoke test before release</title>
    <link>https://qa.codes/blog/accessibility-smoke-test-before-release</link>
    <guid isPermaLink="true">https://qa.codes/blog/accessibility-smoke-test-before-release</guid>
    <pubDate>Sat, 13 Jun 2026 00:00:00 GMT</pubDate>
    <description>A ten-minute accessibility pass any QA can run before release — keyboard, focus, contrast, and the obvious screen-reader checks.</description>
    <category>Tutorials</category>
  </item>
  <item>
    <title>Auth bugs QA can catch without being a pentester</title>
    <link>https://qa.codes/blog/auth-bugs-qa-can-catch</link>
    <guid isPermaLink="true">https://qa.codes/blog/auth-bugs-qa-can-catch</guid>
    <pubDate>Sat, 13 Jun 2026 00:00:00 GMT</pubDate>
    <description>The auth and session bugs that show up in normal functional testing — no exploit tooling required.</description>
    <category>Tutorials</category>
  </item>
  <item>
    <title>Why mobile bugs escape web-first QA teams</title>
    <link>https://qa.codes/blog/why-mobile-bugs-escape-web-first-teams</link>
    <guid isPermaLink="true">https://qa.codes/blog/why-mobile-bugs-escape-web-first-teams</guid>
    <pubDate>Sat, 13 Jun 2026 00:00:00 GMT</pubDate>
    <description>Web-first teams carry assumptions that quietly break on mobile — permissions, offline state, lifecycle, and updates.</description>
    <category>Opinions</category>
  </item>
  <item>
    <title>p95 latency explained for QA engineers</title>
    <link>https://qa.codes/blog/p95-latency-explained-for-qa</link>
    <guid isPermaLink="true">https://qa.codes/blog/p95-latency-explained-for-qa</guid>
    <pubDate>Sat, 13 Jun 2026 00:00:00 GMT</pubDate>
    <description>What p95 actually means, why averages hide the bugs, and how to read a latency distribution as a tester.</description>
    <category>Deep dives</category>
  </item>
  <item>
    <title>A release sign-off checklist that doesn&apos;t waste everyone&apos;s time</title>
    <link>https://qa.codes/blog/release-sign-off-checklist</link>
    <guid isPermaLink="true">https://qa.codes/blog/release-sign-off-checklist</guid>
    <pubDate>Sat, 13 Jun 2026 00:00:00 GMT</pubDate>
    <description>A sign-off checklist short enough that people actually use it — and specific enough to catch the things that block releases.</description>
    <category>Tutorials</category>
  </item>
  <item>
    <title>QA portfolio projects that don&apos;t look fake</title>
    <link>https://qa.codes/blog/qa-portfolio-projects-that-dont-look-fake</link>
    <guid isPermaLink="true">https://qa.codes/blog/qa-portfolio-projects-that-dont-look-fake</guid>
    <pubDate>Sat, 13 Jun 2026 00:00:00 GMT</pubDate>
    <description>What separates a portfolio project that gets you an interview from one that screams tutorial-follower.</description>
    <category>Career</category>
  </item>
  <item>
    <title>How I evaluate an AI chatbot before release</title>
    <link>https://qa.codes/blog/evaluate-ai-chatbot-before-release</link>
    <guid isPermaLink="true">https://qa.codes/blog/evaluate-ai-chatbot-before-release</guid>
    <pubDate>Sat, 13 Jun 2026 00:00:00 GMT</pubDate>
    <description>A practical evaluation pass for AI chat features: hallucinations, refusals, prompt injection, and the cases with no single right answer.</description>
    <category>Tutorials</category>
  </item>
  <item>
    <title>How to test when requirements are unclear</title>
    <link>https://qa.codes/blog/testing-when-requirements-unclear</link>
    <guid isPermaLink="true">https://qa.codes/blog/testing-when-requirements-unclear</guid>
    <pubDate>Sat, 13 Jun 2026 00:00:00 GMT</pubDate>
    <description>A field-tested approach for testing a story when the acceptance criteria are vague, missing, or contradictory.</description>
    <category>Field notes</category>
  </item>
  <item>
    <title>API pagination, filtering, and sorting bugs</title>
    <link>https://qa.codes/blog/api-pagination-filtering-sorting-bugs</link>
    <guid isPermaLink="true">https://qa.codes/blog/api-pagination-filtering-sorting-bugs</guid>
    <pubDate>Sat, 13 Jun 2026 00:00:00 GMT</pubDate>
    <description>The specific bugs that hide in paginated, filtered, and sorted endpoints — off-by-one pages, unstable sorts, and filter leaks.</description>
    <category>Tutorials</category>
  </item>
  <item>
    <title>Keyboard testing: the fastest accessibility check QA can run</title>
    <link>https://qa.codes/blog/keyboard-testing-accessibility-check</link>
    <guid isPermaLink="true">https://qa.codes/blog/keyboard-testing-accessibility-check</guid>
    <pubDate>Sat, 13 Jun 2026 00:00:00 GMT</pubDate>
    <description>Tab through the page. That single habit catches more accessibility bugs than most automated scans.</description>
    <category>Tutorials</category>
  </item>
  <item>
    <title>The password reset bugs I always test for</title>
    <link>https://qa.codes/blog/password-reset-bugs-i-test-for</link>
    <guid isPermaLink="true">https://qa.codes/blog/password-reset-bugs-i-test-for</guid>
    <pubDate>Sat, 13 Jun 2026 00:00:00 GMT</pubDate>
    <description>Password reset is a deceptively risky flow — token reuse, expiry, enumeration, and session handling all hide here.</description>
    <category>Tutorials</category>
  </item>
  <item>
    <title>My mobile smoke test before every release</title>
    <link>https://qa.codes/blog/mobile-smoke-test-before-release</link>
    <guid isPermaLink="true">https://qa.codes/blog/mobile-smoke-test-before-release</guid>
    <pubDate>Sat, 13 Jun 2026 00:00:00 GMT</pubDate>
    <description>A short, device-real smoke pass: permissions, offline, rotation, interruptions, and the update path.</description>
    <category>Tutorials</category>
  </item>
  <item>
    <title>Why average response time lies</title>
    <link>https://qa.codes/blog/why-average-response-time-lies</link>
    <guid isPermaLink="true">https://qa.codes/blog/why-average-response-time-lies</guid>
    <pubDate>Sat, 13 Jun 2026 00:00:00 GMT</pubDate>
    <description>The average response time is the metric most likely to make a slow system look fine. Here is what to watch instead.</description>
    <category>Opinions</category>
  </item>
  <item>
    <title>Risk-based testing when everything is urgent</title>
    <link>https://qa.codes/blog/risk-based-testing-when-everything-urgent</link>
    <guid isPermaLink="true">https://qa.codes/blog/risk-based-testing-when-everything-urgent</guid>
    <pubDate>Sat, 13 Jun 2026 00:00:00 GMT</pubDate>
    <description>How to prioritise testing when the timeline just got cut in half and everything is labelled critical.</description>
    <category>Field notes</category>
  </item>
  <item>
    <title>How to review AI-written Playwright tests</title>
    <link>https://qa.codes/blog/review-ai-written-playwright-tests</link>
    <guid isPermaLink="true">https://qa.codes/blog/review-ai-written-playwright-tests</guid>
    <pubDate>Sat, 13 Jun 2026 00:00:00 GMT</pubDate>
    <description>AI writes plausible Playwright tests that pass for the wrong reasons. Here is the review checklist that catches them.</description>
    <category>Tutorials</category>
  </item>
  <item>
    <title>How to prepare for a QA take-home assignment</title>
    <link>https://qa.codes/blog/prepare-for-qa-take-home-assignment</link>
    <guid isPermaLink="true">https://qa.codes/blog/prepare-for-qa-take-home-assignment</guid>
    <pubDate>Sat, 13 Jun 2026 00:00:00 GMT</pubDate>
    <description>What take-home reviewers actually score, and how to spend your limited time on the parts that count.</description>
    <category>Tutorials</category>
  </item>
  <item>
    <title>The bug that only happened after daylight saving time changed</title>
    <link>https://qa.codes/blog/daylight-saving-time-bug</link>
    <guid isPermaLink="true">https://qa.codes/blog/daylight-saving-time-bug</guid>
    <pubDate>Sat, 13 Jun 2026 00:00:00 GMT</pubDate>
    <description>A case study: a scheduling bug that stayed invisible until the clocks changed — and the test scenarios that would have caught it.</description>
    <category>Case studies</category>
  </item>
  <item>
    <title>Regression testing without wasting two days</title>
    <link>https://qa.codes/blog/regression-testing-without-wasting-two-days</link>
    <guid isPermaLink="true">https://qa.codes/blog/regression-testing-without-wasting-two-days</guid>
    <pubDate>Sat, 13 Jun 2026 00:00:00 GMT</pubDate>
    <description>How to scope a regression pass to the change in front of you instead of re-running the entire suite by hand.</description>
    <category>Tutorials</category>
  </item>
  <item>
    <title>IDOR explained for QA engineers</title>
    <link>https://qa.codes/blog/idor-explained-for-qa</link>
    <guid isPermaLink="true">https://qa.codes/blog/idor-explained-for-qa</guid>
    <pubDate>Sat, 13 Jun 2026 00:00:00 GMT</pubDate>
    <description>The most common serious web vulnerability is also the easiest for QA to catch: the app serves a record by ID without checking it is yours. Two accounts and a changed number find it.</description>
    <category>Deep dives</category>
  </item>
  <item>
    <title>Authorization testing: roles, permissions, and the assumptions that leak</title>
    <link>https://qa.codes/blog/authorization-testing-roles-permissions</link>
    <guid isPermaLink="true">https://qa.codes/blog/authorization-testing-roles-permissions</guid>
    <pubDate>Sat, 13 Jun 2026 00:00:00 GMT</pubDate>
    <description>Authentication asks who you are; authorization asks if you are allowed. Most access-control bugs live in the second question — tested with a written access matrix and a lot of negative testing.</description>
    <category>Deep dives</category>
  </item>
  <item>
    <title>How to test session expiry properly</title>
    <link>https://qa.codes/blog/session-expiry-testing</link>
    <guid isPermaLink="true">https://qa.codes/blog/session-expiry-testing</guid>
    <pubDate>Sat, 13 Jun 2026 00:00:00 GMT</pubDate>
    <description>A session that lives too long is a hole, one that survives logout defeats the point. Here is the session-expiry pass — idle, absolute, logout, reset, remember-me, and fixation.</description>
    <category>Tutorials</category>
  </item>
  <item>
    <title>API status codes testers should actually care about</title>
    <link>https://qa.codes/blog/api-status-codes-testers-care-about</link>
    <guid isPermaLink="true">https://qa.codes/blog/api-status-codes-testers-care-about</guid>
    <pubDate>Sat, 13 Jun 2026 00:00:00 GMT</pubDate>
    <description>Skip the full registry — learn the dozen status codes that carry real meaning, what each promises, and how to spot when the code and the body disagree.</description>
    <category>Deep dives</category>
  </item>
  <item>
    <title>How I test an API before the UI is ready</title>
    <link>https://qa.codes/blog/testing-api-before-ui-ready</link>
    <guid isPermaLink="true">https://qa.codes/blog/testing-api-before-ui-ready</guid>
    <pubDate>Sat, 13 Jun 2026 00:00:00 GMT</pubDate>
    <description>The API ships weeks before the screen. Test it directly from the contract — the whole bad-input, auth, and edge class is open at the API and invisible once the UI hides it.</description>
    <category>Field notes</category>
  </item>
  <item>
    <title>Push notification testing: what usually goes wrong</title>
    <link>https://qa.codes/blog/push-notification-testing</link>
    <guid isPermaLink="true">https://qa.codes/blog/push-notification-testing</guid>
    <pubDate>Sat, 13 Jun 2026 00:00:00 GMT</pubDate>
    <description>Notifications behave differently foregrounded, backgrounded, and killed — and deep-link to the wrong place when they arrive. The killed-app cold start is where it breaks.</description>
    <category>Tutorials</category>
  </item>
  <item>
    <title>Offline mode bugs every mobile tester should check</title>
    <link>https://qa.codes/blog/offline-mode-bugs</link>
    <guid isPermaLink="true">https://qa.codes/blog/offline-mode-bugs</guid>
    <pubDate>Sat, 13 Jun 2026 00:00:00 GMT</pubDate>
    <description>The interesting offline bugs are in the transitions, not the offline state: double-submits on reconnect, in-flight requests that die, optimistic UI that never rolls back.</description>
    <category>Tutorials</category>
  </item>
  <item>
    <title>How to report bugs developers can fix quickly</title>
    <link>https://qa.codes/blog/report-bugs-developers-can-fix</link>
    <guid isPermaLink="true">https://qa.codes/blog/report-bugs-developers-can-fix</guid>
    <pubDate>Sat, 13 Jun 2026 00:00:00 GMT</pubDate>
    <description>A bug report exists to get the bug fixed. Specific title, minimal repro steps, explicit expected-vs-actual, evidence, and environment — the format that prevents &quot;can&apos;t reproduce&quot;.</description>
    <category>Tutorials</category>
  </item>
  <item>
    <title>Screen reader testing without pretending to be an expert</title>
    <link>https://qa.codes/blog/screen-reader-testing-basics</link>
    <guid isPermaLink="true">https://qa.codes/blog/screen-reader-testing-basics</guid>
    <pubDate>Sat, 13 Jun 2026 00:00:00 GMT</pubDate>
    <description>Catch the blatant screen-reader failures in fifteen minutes with the reader already on your machine — meaningful names, sensible images, labelled fields, announced changes.</description>
    <category>Tutorials</category>
  </item>
  <item>
    <title>How to test forms for accessibility</title>
    <link>https://qa.codes/blog/testing-forms-accessibility</link>
    <guid isPermaLink="true">https://qa.codes/blog/testing-forms-accessibility</guid>
    <pubDate>Sat, 13 Jun 2026 00:00:00 GMT</pubDate>
    <description>Forms break accessibility hardest — labels, required state, announced errors, focus management, and keyboard-operable custom widgets. The form-specific pass.</description>
    <category>Tutorials</category>
  </item>
  <item>
    <title>Load testing is not the same as performance testing</title>
    <link>https://qa.codes/blog/load-vs-performance-testing</link>
    <guid isPermaLink="true">https://qa.codes/blog/load-vs-performance-testing</guid>
    <pubDate>Sat, 13 Jun 2026 00:00:00 GMT</pubDate>
    <description>Load testing is one type of performance test, not the whole thing. A single user can have a performance bug. Match the test (load/stress/spike/soak) to the risk.</description>
    <category>Deep dives</category>
  </item>
  <item>
    <title>How to write a test strategy people actually use</title>
    <link>https://qa.codes/blog/test-strategy-people-use</link>
    <guid isPermaLink="true">https://qa.codes/blog/test-strategy-people-use</guid>
    <pubDate>Sat, 13 Jun 2026 00:00:00 GMT</pubDate>
    <description>A test strategy is a short set of project-specific decisions, not a generic thirty-page document. Scope, risk, levels, automation split, data, ownership, and what &quot;done&quot; means.</description>
    <category>Tutorials</category>
  </item>
  <item>
    <title>Should QA engineers learn to code? A practical answer</title>
    <link>https://qa.codes/blog/should-qa-learn-coding</link>
    <guid isPermaLink="true">https://qa.codes/blog/should-qa-learn-coding</guid>
    <pubDate>Sat, 13 Jun 2026 00:00:00 GMT</pubDate>
    <description>Not yes or no — which coding and for what. Reading code and light scripting help every tester; automation is where the roles are. Coding extends testing, doesn&apos;t replace the judgement.</description>
    <category>Opinions</category>
  </item>
  <item>
    <title>Prompt injection testing for QA engineers</title>
    <link>https://qa.codes/blog/prompt-injection-testing-for-qa</link>
    <guid isPermaLink="true">https://qa.codes/blog/prompt-injection-testing-for-qa</guid>
    <pubDate>Sat, 13 Jun 2026 00:00:00 GMT</pubDate>
    <description>LLMs can&apos;t reliably separate instructions from data, so user input can hijack the model. Direct and indirect injection, what to check for, and how to report it QA-safe.</description>
    <category>Deep dives</category>
  </item>
  <item>
    <title>What QA should log when testing AI features</title>
    <link>https://qa.codes/blog/what-to-log-testing-ai</link>
    <guid isPermaLink="true">https://qa.codes/blog/what-to-log-testing-ai</guid>
    <pubDate>Sat, 13 Jun 2026 00:00:00 GMT</pubDate>
    <description>A screenshot isn&apos;t a repro when outputs vary. Capture the full assembled prompt, retrieved context, model version, and parameters so an AI bug is actually reproducible.</description>
    <category>Tutorials</category>
  </item>
  <item>
    <title>The checkout bug that passed every happy-path test</title>
    <link>https://qa.codes/blog/checkout-bug-passed-happy-path</link>
    <guid isPermaLink="true">https://qa.codes/blog/checkout-bug-passed-happy-path</guid>
    <pubDate>Sat, 13 Jun 2026 00:00:00 GMT</pubDate>
    <description>Every checkout test was green, but combining two discounts and a gift card drove the total negative — and issued credit. A case study in testing invariants, not just features.</description>
    <category>Case studies</category>
  </item>
  <item>
    <title>The API pagination bug that looked like a frontend issue</title>
    <link>https://qa.codes/blog/api-pagination-bug-looked-like-frontend</link>
    <guid isPermaLink="true">https://qa.codes/blog/api-pagination-bug-looked-like-frontend</guid>
    <pubDate>Sat, 13 Jun 2026 00:00:00 GMT</pubDate>
    <description>Items vanished and duplicated on scroll; the frontend took the blame for two sprints. The cause was an unstable API sort over a non-unique key. Follow the symptom down the stack.</description>
    <category>Case studies</category>
  </item>
  <item>
    <title>How a missing negative test caused a production incident</title>
    <link>https://qa.codes/blog/missing-negative-test-incident</link>
    <guid isPermaLink="true">https://qa.codes/blog/missing-negative-test-incident</guid>
    <pubDate>Sat, 13 Jun 2026 00:00:00 GMT</pubDate>
    <description>A negative quantity on a &quot;remove stock&quot; action inflated inventory and caused overselling. The feature worked; the absent negative test did not. Test the negative space at the endpoint.</description>
    <category>Case studies</category>
  </item>
  <item>
    <title>The accessibility issue nobody noticed with a mouse</title>
    <link>https://qa.codes/blog/accessibility-issue-nobody-noticed-with-mouse</link>
    <guid isPermaLink="true">https://qa.codes/blog/accessibility-issue-nobody-noticed-with-mouse</guid>
    <pubDate>Sat, 13 Jun 2026 00:00:00 GMT</pubDate>
    <description>A custom dropdown worked for everyone who tested it — because everyone used a mouse. Keyboard users hit a dead end on a required field. The cheapest check would have caught it.</description>
    <category>Case studies</category>
  </item>
  <item>
    <title>The mobile bug we missed because we only tested on Wi-Fi</title>
    <link>https://qa.codes/blog/mobile-wifi-only-bug</link>
    <guid isPermaLink="true">https://qa.codes/blog/mobile-wifi-only-bug</guid>
    <pubDate>Sat, 13 Jun 2026 00:00:00 GMT</pubDate>
    <description>On office Wi-Fi the payment flow was flawless; on cellular it double-charged. A client timeout shorter than real latency plus no idempotency, hidden by never testing a slow network.</description>
    <category>Case studies</category>
  </item>
  <item>
    <title>A one-hour exploratory test session template</title>
    <link>https://qa.codes/blog/one-hour-exploratory-test-session-template</link>
    <guid isPermaLink="true">https://qa.codes/blog/one-hour-exploratory-test-session-template</guid>
    <pubDate>Sat, 13 Jun 2026 00:00:00 GMT</pubDate>
    <description>A charter-driven, time-boxed template for exploratory testing: 5 minutes to charter, 35 to test, 10 to debrief — and notes someone can read.</description>
    <category>Tutorials</category>
  </item>
  <item>
    <title>Focus order bugs: small issue, big user impact</title>
    <link>https://qa.codes/blog/focus-order-accessibility-bugs</link>
    <guid isPermaLink="true">https://qa.codes/blog/focus-order-accessibility-bugs</guid>
    <pubDate>Sat, 13 Jun 2026 00:00:00 GMT</pubDate>
    <description>Focus order is the route a keyboard user takes through your page. When it&apos;s wrong the page looks perfect and becomes unusable — and scans don&apos;t catch it.</description>
    <category>Deep dives</category>
  </item>
  <item>
    <title>OWASP Top 10 for testers, not hackers</title>
    <link>https://qa.codes/blog/owasp-top-10-for-testers</link>
    <guid isPermaLink="true">https://qa.codes/blog/owasp-top-10-for-testers</guid>
    <pubDate>Sat, 13 Jun 2026 00:00:00 GMT</pubDate>
    <description>The OWASP Top 10 translated for QA: what each category means for flows you already test, and the one check you can run without being a pentester.</description>
    <category>Deep dives</category>
  </item>
  <item>
    <title>MFA testing checklist for QA teams</title>
    <link>https://qa.codes/blog/mfa-testing-checklist-for-qa</link>
    <guid isPermaLink="true">https://qa.codes/blog/mfa-testing-checklist-for-qa</guid>
    <pubDate>Sat, 13 Jun 2026 00:00:00 GMT</pubDate>
    <description>The full multi-factor auth test surface: bypass, wrong/expired/reused codes, brute-force lockout, recovery, and the usability cases most teams skip.</description>
    <category>Tutorials</category>
  </item>
  <item>
    <title>Mobile permissions testing: camera, location, photos, notifications</title>
    <link>https://qa.codes/blog/mobile-permissions-testing</link>
    <guid isPermaLink="true">https://qa.codes/blog/mobile-permissions-testing</guid>
    <pubDate>Sat, 13 Jun 2026 00:00:00 GMT</pubDate>
    <description>Permission bugs live in deny, revoke, and &apos;ask every time&apos; — not the grant happy path. The per-permission, per-platform matrix that catches them.</description>
    <category>Tutorials</category>
  </item>
  <item>
    <title>Testing app updates without breaking existing users</title>
    <link>https://qa.codes/blog/testing-app-updates-without-breaking-users</link>
    <guid isPermaLink="true">https://qa.codes/blog/testing-app-updates-without-breaking-users</guid>
    <pubDate>Sat, 13 Jun 2026 00:00:00 GMT</pubDate>
    <description>QA fresh-installs; real users upgrade in place over old data. Test the upgrade path — schema migrations, stored settings, sessions, multi-version jumps.</description>
    <category>Deep dives</category>
  </item>
  <item>
    <title>The performance smoke test I&apos;d run before release</title>
    <link>https://qa.codes/blog/performance-smoke-test-before-release</link>
    <guid isPermaLink="true">https://qa.codes/blog/performance-smoke-test-before-release</guid>
    <pubDate>Sat, 13 Jun 2026 00:00:00 GMT</pubDate>
    <description>Not a full load test — a fast, fixed, repeatable check on a few critical endpoints, compared to baseline, that catches gross regressions before sign-off.</description>
    <category>Tutorials</category>
  </item>
  <item>
    <title>Release readiness is not just passed test cases</title>
    <link>https://qa.codes/blog/release-readiness-is-not-just-passed-tests</link>
    <guid isPermaLink="true">https://qa.codes/blog/release-readiness-is-not-just-passed-tests</guid>
    <pubDate>Sat, 13 Jun 2026 00:00:00 GMT</pubDate>
    <description>A green suite confirms only what you thought to check. Readiness adds coverage-vs-change, accepted risk, observability, and non-functional signals.</description>
    <category>Deep dives</category>
  </item>
  <item>
    <title>The hallucination test cases I run on AI features</title>
    <link>https://qa.codes/blog/hallucination-test-cases-for-ai-features</link>
    <guid isPermaLink="true">https://qa.codes/blog/hallucination-test-cases-for-ai-features</guid>
    <pubDate>Sat, 13 Jun 2026 00:00:00 GMT</pubDate>
    <description>Concrete test cases for AI hallucination — unanswerable questions, false premises, invented entities, citations — and how to judge answers with no &apos;correct&apos; value.</description>
    <category>Tutorials</category>
  </item>
  <item>
    <title>The release we delayed because one permission bug changed everything</title>
    <link>https://qa.codes/blog/permission-bug-that-delayed-a-release</link>
    <guid isPermaLink="true">https://qa.codes/blog/permission-bug-that-delayed-a-release</guid>
    <pubDate>Sat, 13 Jun 2026 00:00:00 GMT</pubDate>
    <description>A green suite, a flawless demo, and a permission check enforced in the UI but not the API — exposing every customer&apos;s data. Caught the day before release.</description>
    <category>Case studies</category>
  </item>
  <item>
    <title>How one flaky test blocked trust in the whole suite</title>
    <link>https://qa.codes/blog/one-flaky-test-blocked-trust-in-the-suite</link>
    <guid isPermaLink="true">https://qa.codes/blog/one-flaky-test-blocked-trust-in-the-suite</guid>
    <pubDate>Sat, 13 Jun 2026 00:00:00 GMT</pubDate>
    <description>A single intermittent test trained a team to re-run, then ignore, then merge through every red build — until two real regressions slipped through.</description>
    <category>Case studies</category>
  </item>
  <item>
    <title>What I learned from a failed regression cycle</title>
    <link>https://qa.codes/blog/what-i-learned-from-a-failed-regression-cycle</link>
    <guid isPermaLink="true">https://qa.codes/blog/what-i-learned-from-a-failed-regression-cycle</guid>
    <pubDate>Sat, 13 Jun 2026 00:00:00 GMT</pubDate>
    <description>Two days of regression, signed off green, and a regression shipped in the most-used feature. The tests weren&apos;t wrong — they were testing a stale picture.</description>
    <category>Case studies</category>
  </item>
  <item>
    <title>How we reduced release testing from two days to four hours</title>
    <link>https://qa.codes/blog/reduced-release-testing-two-days-to-four-hours</link>
    <guid isPermaLink="true">https://qa.codes/blog/reduced-release-testing-two-days-to-four-hours</guid>
    <pubDate>Sat, 13 Jun 2026 00:00:00 GMT</pubDate>
    <description>Cut a dreaded two-day regression to an afternoon — and caught more — by weighting on risk, automating the stable core, and pruning dead cases.</description>
    <category>Case studies</category>
  </item>
  <item>
    <title>What I check before saying a story is ready for QA</title>
    <link>https://qa.codes/blog/story-ready-for-qa-checklist</link>
    <guid isPermaLink="true">https://qa.codes/blog/story-ready-for-qa-checklist</guid>
    <pubDate>Sat, 13 Jun 2026 00:00:00 GMT</pubDate>
    <description>A 30-second readiness check before accepting a ticket into QA — testable criteria, defined edge cases, reachable build, known data — that replaces a day of back-and-forth.</description>
    <category>Field notes</category>
  </item>
  <item>
    <title>Test cases vs scenarios vs charters: the difference</title>
    <link>https://qa.codes/blog/test-cases-vs-scenarios-vs-charters</link>
    <guid isPermaLink="true">https://qa.codes/blog/test-cases-vs-scenarios-vs-charters</guid>
    <pubDate>Sat, 13 Jun 2026 00:00:00 GMT</pubDate>
    <description>Three different tools on a spectrum from prescribed to open: when to write a scripted case, a coverage scenario, or an exploratory charter.</description>
    <category>Deep dives</category>
  </item>
  <item>
    <title>The QA notes I keep during sprint testing</title>
    <link>https://qa.codes/blog/qa-notes-i-keep-during-sprint-testing</link>
    <guid isPermaLink="true">https://qa.codes/blog/qa-notes-i-keep-during-sprint-testing</guid>
    <pubDate>Sat, 13 Jun 2026 00:00:00 GMT</pubDate>
    <description>The working log that isn&apos;t a bug report or a test case — coverage, open questions, un-reproducible anomalies, painful setup — that makes a tester faster and more credible.</description>
    <category>Field notes</category>
  </item>
  <item>
    <title>The API test data problem nobody plans for</title>
    <link>https://qa.codes/blog/api-test-data-problem</link>
    <guid isPermaLink="true">https://qa.codes/blog/api-test-data-problem</guid>
    <pubDate>Sat, 13 Jun 2026 00:00:00 GMT</pubDate>
    <description>API suites fail on shared, stale, order-dependent data more than on wrong assertions. The own-your-data strategy — independent, unique, cleaned — that keeps them reliable.</description>
    <category>Deep dives</category>
  </item>
  <item>
    <title>How to test rate limits without annoying everyone</title>
    <link>https://qa.codes/blog/testing-rate-limits</link>
    <guid isPermaLink="true">https://qa.codes/blog/testing-rate-limits</guid>
    <pubDate>Sat, 13 Jun 2026 00:00:00 GMT</pubDate>
    <description>Test the full rate-limit contract — enforcement, 429, Retry-After headers, recovery, scope — with a low configurable limit and a dedicated key, not by flooding shared staging.</description>
    <category>Tutorials</category>
  </item>
  <item>
    <title>How to review Swagger/OpenAPI as a QA engineer</title>
    <link>https://qa.codes/blog/reviewing-openapi-swagger-as-qa</link>
    <guid isPermaLink="true">https://qa.codes/blog/reviewing-openapi-swagger-as-qa</guid>
    <pubDate>Sat, 13 Jun 2026 00:00:00 GMT</pubDate>
    <description>An OpenAPI spec is a ready-made test plan — every param and status code is a case — and its gaps (missing errors, unbounded fields, drift) predict the bugs.</description>
    <category>Tutorials</category>
  </item>
  <item>
    <title>REST Assured vs Postman: how I use both</title>
    <link>https://qa.codes/blog/rest-assured-vs-postman</link>
    <guid isPermaLink="true">https://qa.codes/blog/rest-assured-vs-postman</guid>
    <pubDate>Sat, 13 Jun 2026 00:00:00 GMT</pubDate>
    <description>Not winner-takes-all — Postman for exploring and sharing, REST Assured for the durable automated suite in CI. The dividing line is lifespan and automation.</description>
    <category>Comparisons</category>
  </item>
  <item>
    <title>Accessibility test cases for login &amp; checkout flows</title>
    <link>https://qa.codes/blog/accessibility-test-cases-login-checkout</link>
    <guid isPermaLink="true">https://qa.codes/blog/accessibility-test-cases-login-checkout</guid>
    <pubDate>Sat, 13 Jun 2026 00:00:00 GMT</pubDate>
    <description>Concrete, reusable accessibility cases for the two highest-consequence flows — keyboard completion, labels, announced errors, focus management — where a barrier blocks a core task.</description>
    <category>Tutorials</category>
  </item>
  <item>
    <title>Accessibility in pull requests: what&apos;s realistic?</title>
    <link>https://qa.codes/blog/accessibility-in-pull-requests</link>
    <guid isPermaLink="true">https://qa.codes/blog/accessibility-in-pull-requests</guid>
    <pubDate>Sat, 13 Jun 2026 00:00:00 GMT</pubDate>
    <description>Automate the mechanical (axe/lint: alt, labels, contrast) and spot-check the obvious in a PR; route keyboard, focus, and screen-reader testing to QA on a real build.</description>
    <category>Opinions</category>
  </item>
  <item>
    <title>API token bugs that show up in everyday testing</title>
    <link>https://qa.codes/blog/api-token-bugs-everyday-testing</link>
    <guid isPermaLink="true">https://qa.codes/blog/api-token-bugs-everyday-testing</guid>
    <pubDate>Sat, 13 Jun 2026 00:00:00 GMT</pubDate>
    <description>Treat the auth token as an input: test that it expires, dies on logout, can&apos;t cross scope or user, doesn&apos;t leak, and rejects tampering — all with your normal API client.</description>
    <category>Tutorials</category>
  </item>
  <item>
    <title>How to write safe security bug reports</title>
    <link>https://qa.codes/blog/safe-security-bug-reports</link>
    <guid isPermaLink="true">https://qa.codes/blog/safe-security-bug-reports</guid>
    <pubDate>Sat, 13 Jun 2026 00:00:00 GMT</pubDate>
    <description>A security report has extra duties: private channel, impact over exploit, test data only, redacted evidence, clear severity — getting it fixed without making it worse.</description>
    <category>Tutorials</category>
  </item>
  <item>
    <title>iOS vs Android testing differences QA should know</title>
    <link>https://qa.codes/blog/ios-vs-android-testing-differences</link>
    <guid isPermaLink="true">https://qa.codes/blog/ios-vs-android-testing-differences</guid>
    <pubDate>Sat, 13 Jun 2026 00:00:00 GMT</pubDate>
    <description>Fragmentation, permissions, system-back, lifecycle, hardware layout, and notifications diverge between platforms — so a pass on one isn&apos;t evidence for the other.</description>
    <category>Deep dives</category>
  </item>
  <item>
    <title>Real device vs emulator: when each is enough</title>
    <link>https://qa.codes/blog/real-device-vs-emulator</link>
    <guid isPermaLink="true">https://qa.codes/blog/real-device-vs-emulator</guid>
    <pubDate>Sat, 13 Jun 2026 00:00:00 GMT</pubDate>
    <description>Not a purity contest — emulators for functional/UI/CI, real devices for performance, sensors, network, and sign-off. Decide per test whether the check needs real hardware.</description>
    <category>Opinions</category>
  </item>
  <item>
    <title>How to read a k6 result without guessing</title>
    <link>https://qa.codes/blog/reading-a-k6-result</link>
    <guid isPermaLink="true">https://qa.codes/blog/reading-a-k6-result</guid>
    <pubDate>Sat, 13 Jun 2026 00:00:00 GMT</pubDate>
    <description>Which k6 metrics matter and which mislead: check the error rate first, read p95/p99 not the average, confirm the load profile, and compare to a baseline.</description>
    <category>Tutorials</category>
  </item>
  <item>
    <title>Performance bugs that look like functional bugs</title>
    <link>https://qa.codes/blog/performance-bugs-that-look-functional</link>
    <guid isPermaLink="true">https://qa.codes/blog/performance-bugs-that-look-functional</guid>
    <pubDate>Sat, 13 Jun 2026 00:00:00 GMT</pubDate>
    <description>Dead buttons, random logouts, missing data — often timing problems in disguise. The tell is intermittent and worse under load; check latency before debugging logic.</description>
    <category>Field notes</category>
  </item>
  <item>
    <title>How to set realistic performance thresholds</title>
    <link>https://qa.codes/blog/setting-performance-thresholds</link>
    <guid isPermaLink="true">https://qa.codes/blog/setting-performance-thresholds</guid>
    <pubDate>Sat, 13 Jun 2026 00:00:00 GMT</pubDate>
    <description>Derive thresholds from user expectation, today&apos;s baseline, and business impact — set on p95/p99 with an error-rate gate, tiered by criticality — not a made-up &apos;under 2s&apos;.</description>
    <category>Deep dives</category>
  </item>
  <item>
    <title>The QA weekly status report I&apos;d actually send</title>
    <link>https://qa.codes/blog/qa-weekly-status-report</link>
    <guid isPermaLink="true">https://qa.codes/blog/qa-weekly-status-report</guid>
    <pubDate>Sat, 13 Jun 2026 00:00:00 GMT</pubDate>
    <description>A short, risk-first status format: lead with a one-line risk verdict, then what&apos;s at risk, key findings, light coverage numbers, and explicit asks — built to drive a decision.</description>
    <category>Tutorials</category>
  </item>
  <item>
    <title>How to say &apos;not ready for release&apos; without drama</title>
    <link>https://qa.codes/blog/saying-not-ready-for-release</link>
    <guid isPermaLink="true">https://qa.codes/blog/saying-not-ready-for-release</guid>
    <pubDate>Sat, 13 Jun 2026 00:00:00 GMT</pubDate>
    <description>Frame it as risk for the owner to decide, not a veto: specific, reproduced, impact-led, with options attached — surfaced early, not as a sign-off-meeting ambush.</description>
    <category>Field notes</category>
  </item>
  <item>
    <title>What good QA handover notes look like</title>
    <link>https://qa.codes/blog/qa-handover-notes</link>
    <guid isPermaLink="true">https://qa.codes/blog/qa-handover-notes</guid>
    <pubDate>Sat, 13 Jun 2026 00:00:00 GMT</pubDate>
    <description>Write an operating manual for the arriver, not a diary: current state, setup, known issues with status, gotchas, and pointers — so someone can take over without asking you.</description>
    <category>Tutorials</category>
  </item>
  <item>
    <title>The QA CV mistakes I see again and again</title>
    <link>https://qa.codes/blog/qa-cv-mistakes</link>
    <guid isPermaLink="true">https://qa.codes/blog/qa-cv-mistakes</guid>
    <pubDate>Sat, 13 Jun 2026 00:00:00 GMT</pubDate>
    <description>Tool-list-as-skills, duties not achievements, no quantified impact, generic and untailored — and the reframe that fixes them: prove you&apos;re good at testing, don&apos;t describe the job.</description>
    <category>Career</category>
  </item>
  <item>
    <title>What senior QA interviews really test</title>
    <link>https://qa.codes/blog/what-senior-qa-interviews-test</link>
    <guid isPermaLink="true">https://qa.codes/blog/what-senior-qa-interviews-test</guid>
    <pubDate>Sat, 13 Jun 2026 00:00:00 GMT</pubDate>
    <description>Senior interviews assess judgement, prioritisation, and influence — not deeper tool trivia. Prep risk-based reasoning, trade-off thinking, and stories of influencing decisions.</description>
    <category>Career</category>
  </item>
  <item>
    <title>How to talk about bugs you found in interviews (STAR)</title>
    <link>https://qa.codes/blog/talking-about-bugs-in-interviews-star</link>
    <guid isPermaLink="true">https://qa.codes/blog/talking-about-bugs-in-interviews-star</guid>
    <pubDate>Sat, 13 Jun 2026 00:00:00 GMT</pubDate>
    <description>Use STAR to keep a bug story focused on your judgement: brief Situation and Task, an Action with reasoning, and a Result with impact — and pick a bug that shows thinking, not luck.</description>
    <category>Career</category>
  </item>
  <item>
    <title>QA career paths: manual, automation, SDET, lead, manager</title>
    <link>https://qa.codes/blog/qa-career-paths</link>
    <guid isPermaLink="true">https://qa.codes/blog/qa-career-paths</guid>
    <pubDate>Sat, 13 Jun 2026 00:00:00 GMT</pubDate>
    <description>An honest map of QA&apos;s branches — deepening manual, automation, SDET, lead, manager — each rewarding different strengths, none &apos;up&apos; from the others. Choose by what you like doing.</description>
    <category>Deep dives</category>
  </item>
  <item>
    <title>How to use Claude Code for QA without breaking your repo</title>
    <link>https://qa.codes/blog/claude-code-for-qa-without-breaking-your-repo</link>
    <guid isPermaLink="true">https://qa.codes/blog/claude-code-for-qa-without-breaking-your-repo</guid>
    <pubDate>Sat, 13 Jun 2026 00:00:00 GMT</pubDate>
    <description>Get the speed of an AI agent on your test repo without the mess: work on a branch, review every change like a junior&apos;s PR, and make tests fail first to catch assert-nothing tests.</description>
    <category>Tutorials</category>
  </item>
  <item>
    <title>AI test case generation: where it helps and where it fails</title>
    <link>https://qa.codes/blog/ai-test-case-generation-help-and-fail</link>
    <guid isPermaLink="true">https://qa.codes/blog/ai-test-case-generation-help-and-fail</guid>
    <pubDate>Sat, 13 Jun 2026 00:00:00 GMT</pubDate>
    <description>AI covers the expected cases fast and misses the suspicion-driven ones that catch bugs. Division of labour: let it handle breadth of the predictable; you handle the unexpected.</description>
    <category>Opinions</category>
  </item>
  <item>
    <title>What actually changed in QA in 2026</title>
    <link>https://qa.codes/blog/what-changed-in-qa-2026</link>
    <guid isPermaLink="true">https://qa.codes/blog/what-changed-in-qa-2026</guid>
    <pubDate>Sat, 13 Jun 2026 00:00:00 GMT</pubDate>
    <description>A dated June 2026 snapshot: AI became a normal tool and testing-AI a normal job; the fundamentals didn&apos;t budge; &apos;AI replaces QA&apos; is still a slide.</description>
    <category>QA trends</category>
  </item>
  <item>
    <title>AI&apos;s real impact on QA roles (beyond the hype)</title>
    <link>https://qa.codes/blog/ai-real-impact-on-qa-roles</link>
    <guid isPermaLink="true">https://qa.codes/blog/ai-real-impact-on-qa-roles</guid>
    <pubDate>Sat, 13 Jun 2026 00:00:00 GMT</pubDate>
    <description>A dated June 2026 take: AI is reshaping QA roles, not eliminating them — eating the mechanical middle, raising the value of judgement, and re-pricing which skills pay.</description>
    <category>QA trends</category>
  </item>
  <item>
    <title>Where shift-left actually landed</title>
    <link>https://qa.codes/blog/where-shift-left-actually-landed</link>
    <guid isPermaLink="true">https://qa.codes/blog/where-shift-left-actually-landed</guid>
    <pubDate>Sat, 13 Jun 2026 00:00:00 GMT</pubDate>
    <description>A dated June 2026 retrospective: shift-left landed as a sensible default oversold as a revolution — real early-bug wins, real damage where it meant &apos;delete QA&apos;.</description>
    <category>QA trends</category>
  </item>
  <item>
    <title>The state of test automation tooling in 2026</title>
    <link>https://qa.codes/blog/state-of-test-automation-tooling-2026</link>
    <guid isPermaLink="true">https://qa.codes/blog/state-of-test-automation-tooling-2026</guid>
    <pubDate>Sat, 13 Jun 2026 00:00:00 GMT</pubDate>
    <description>A dated June 2026 landscape: web E2E consolidated, API stayed code-first+GUI, performance went lightweight, mobile stayed fragmented, and AI became an authoring feature not a category.</description>
    <category>QA trends</category>
  </item>
  <item>
    <title>Custom Cypress commands that actually pay off</title>
    <link>https://qa.codes/blog/custom-cypress-commands-that-pay-off</link>
    <guid isPermaLink="true">https://qa.codes/blog/custom-cypress-commands-that-pay-off</guid>
    <pubDate>Sun, 10 May 2026 00:00:00 GMT</pubDate>
    <description>Most teams over-abstract too early. Four custom commands are worth writing on every Cypress project — login, seed, intercept, visit. The rest can wait.</description>
    <category>Tutorials</category>
  </item>
  <item>
    <title>How Cypress retry-ability really works</title>
    <link>https://qa.codes/blog/how-cypress-retry-ability-works</link>
    <guid isPermaLink="true">https://qa.codes/blog/how-cypress-retry-ability-works</guid>
    <pubDate>Sat, 02 May 2026 00:00:00 GMT</pubDate>
    <description>Cypress retries commands until they pass or time out — but only some commands, and only some of the time. Understanding which is the difference between solid tests and flaky ones.</description>
    <category>Deep dives</category>
  </item>
  <item>
    <title>You probably don&apos;t need a Page Object Model</title>
    <link>https://qa.codes/blog/you-probably-dont-need-a-page-object-model</link>
    <guid isPermaLink="true">https://qa.codes/blog/you-probably-dont-need-a-page-object-model</guid>
    <pubDate>Fri, 24 Apr 2026 00:00:00 GMT</pubDate>
    <description>POM was a Selenium-era solution to a Selenium-era problem. In modern Cypress and Playwright, custom commands and locator helpers cover 90% of what POM was supposed to give you.</description>
    <category>Opinions</category>
  </item>
  <item>
    <title>Playwright vs Cypress in 2026: an honest comparison</title>
    <link>https://qa.codes/blog/playwright-vs-cypress-2026</link>
    <guid isPermaLink="true">https://qa.codes/blog/playwright-vs-cypress-2026</guid>
    <pubDate>Wed, 15 Apr 2026 00:00:00 GMT</pubDate>
    <description>After shipping production suites in both, here&apos;s the honest breakdown — where Playwright pulls ahead, where Cypress still wins, and the single factor that should actually decide it.</description>
    <category>Comparisons</category>
  </item>
  <item>
    <title>From manual to automation: a practical transition guide</title>
    <link>https://qa.codes/blog/manual-to-automation-transition-guide</link>
    <guid isPermaLink="true">https://qa.codes/blog/manual-to-automation-transition-guide</guid>
    <pubDate>Tue, 07 Apr 2026 00:00:00 GMT</pubDate>
    <description>Six months from your first if-statement to your first paid automation contract — if you focus. Here&apos;s the path I&apos;d take if I were starting today.</description>
    <category>Career</category>
  </item>
  <item>
    <title>The week our flaky-test rate dropped from 18% to 2%</title>
    <link>https://qa.codes/blog/week-flaky-test-rate-dropped</link>
    <guid isPermaLink="true">https://qa.codes/blog/week-flaky-test-rate-dropped</guid>
    <pubDate>Sat, 28 Mar 2026 00:00:00 GMT</pubDate>
    <description>Our CI was failing 18% of runs to flakes we&apos;d stopped looking at. One week, four changes, no new tests. Here&apos;s what we actually did.</description>
    <category>Field notes</category>
  </item>
  <item>
    <title>Cypress fixtures vs tasks vs intercepts: when each one actually fits</title>
    <link>https://qa.codes/blog/cypress-fixtures-vs-tasks-vs-intercepts</link>
    <guid isPermaLink="true">https://qa.codes/blog/cypress-fixtures-vs-tasks-vs-intercepts</guid>
    <pubDate>Fri, 27 Feb 2026 00:00:00 GMT</pubDate>
    <description>Cypress has three features that look similar but solve completely different problems. Fixtures are static data. Tasks are Node-side escape hatches. Intercepts are network shape. Here&apos;s the boundary.</description>
    <category>Deep dives</category>
  </item>
  <item>
    <title>cy.intercept the right way: aliases, stubs, and the bug it usually catches</title>
    <link>https://qa.codes/blog/cypress-intercept-the-right-way</link>
    <guid isPermaLink="true">https://qa.codes/blog/cypress-intercept-the-right-way</guid>
    <pubDate>Tue, 24 Feb 2026 00:00:00 GMT</pubDate>
    <description>cy.intercept is the most powerful command in Cypress and the one teams most often misuse. Here&apos;s the playbook: when to alias, when to stub, when to spy, and the race-condition-shaped bug that intercepts usually catch.</description>
    <category>Tutorials</category>
  </item>
  <item>
    <title>The Playwright trace viewer: what to look for when a test fails</title>
    <link>https://qa.codes/blog/playwright-trace-viewer-mastery</link>
    <guid isPermaLink="true">https://qa.codes/blog/playwright-trace-viewer-mastery</guid>
    <pubDate>Fri, 20 Feb 2026 00:00:00 GMT</pubDate>
    <description>The Playwright trace viewer is the single feature most arguments for Playwright should lead with. Most teams use 10% of it. Here are the five patterns to look for in every trace.</description>
    <category>Deep dives</category>
  </item>
  <item>
    <title>Playwright fixtures, explained without the React metaphors</title>
    <link>https://qa.codes/blog/playwright-fixtures-explained</link>
    <guid isPermaLink="true">https://qa.codes/blog/playwright-fixtures-explained</guid>
    <pubDate>Tue, 17 Feb 2026 00:00:00 GMT</pubDate>
    <description>Most explanations of Playwright fixtures lean on React-hook metaphors that miss the point. Fixtures are scoped factories. Here&apos;s what to do with them and the three every project should have.</description>
    <category>Tutorials</category>
  </item>
  <item>
    <title>How Playwright&apos;s auto-waiting actually works</title>
    <link>https://qa.codes/blog/playwright-auto-waiting-internals</link>
    <guid isPermaLink="true">https://qa.codes/blog/playwright-auto-waiting-internals</guid>
    <pubDate>Tue, 10 Feb 2026 00:00:00 GMT</pubDate>
    <description>Cypress retries commands; Playwright auto-waits on actionability. Same problem, different solution. Here&apos;s what Playwright is actually doing when you call .click().</description>
    <category>Deep dives</category>
  </item>
  <item>
    <title>Stop writing BDD tests you don&apos;t actually need</title>
    <link>https://qa.codes/blog/stop-writing-bdd-tests-you-dont-need</link>
    <guid isPermaLink="true">https://qa.codes/blog/stop-writing-bdd-tests-you-dont-need</guid>
    <pubDate>Fri, 06 Feb 2026 00:00:00 GMT</pubDate>
    <description>Cucumber and Gherkin make sense when non-technical stakeholders write tests. They don&apos;t make sense when engineers write tests for engineers. Here&apos;s the pragmatic test: who actually reads your tests?</description>
    <category>Opinions</category>
  </item>
  <item>
    <title>data-testid isn&apos;t a test smell. Brittle tests are.</title>
    <link>https://qa.codes/blog/data-testid-isnt-a-test-smell</link>
    <guid isPermaLink="true">https://qa.codes/blog/data-testid-isnt-a-test-smell</guid>
    <pubDate>Tue, 03 Feb 2026 00:00:00 GMT</pubDate>
    <description>There&apos;s a take going around that data-testid &apos;couples tests to implementation.&apos; It&apos;s exactly backwards — data-testid is the only selector explicitly decoupled from implementation.</description>
    <category>Opinions</category>
  </item>
  <item>
    <title>Vitest vs Jest in 2026: I&apos;d pick Vitest</title>
    <link>https://qa.codes/blog/vitest-vs-jest-2026</link>
    <guid isPermaLink="true">https://qa.codes/blog/vitest-vs-jest-2026</guid>
    <pubDate>Fri, 30 Jan 2026 00:00:00 GMT</pubDate>
    <description>The unit-test-runner version of the Playwright vs Cypress post. I&apos;ve shipped both in production. If I were starting fresh today, Vitest. Here&apos;s why, with real numbers.</description>
    <category>Comparisons</category>
  </item>
  <item>
    <title>The flaky-test tax no one talks about</title>
    <link>https://qa.codes/blog/the-flaky-test-tax-no-one-talks-about</link>
    <guid isPermaLink="true">https://qa.codes/blog/the-flaky-test-tax-no-one-talks-about</guid>
    <pubDate>Tue, 27 Jan 2026 00:00:00 GMT</pubDate>
    <description>Flaky tests don&apos;t cost you in CI minutes. They cost you in developer trust. And the compounding interest on lost trust is the most expensive tax in engineering.</description>
    <category>Opinions</category>
  </item>
  <item>
    <title>GitHub Actions vs CircleCI for test suites: my pick after running both</title>
    <link>https://qa.codes/blog/github-actions-vs-circleci-for-test-suites</link>
    <guid isPermaLink="true">https://qa.codes/blog/github-actions-vs-circleci-for-test-suites</guid>
    <pubDate>Fri, 23 Jan 2026 00:00:00 GMT</pubDate>
    <description>I&apos;ve run production Cypress and Playwright suites in both GitHub Actions and CircleCI for the last year. Here&apos;s where each one pulls ahead, where each one tripped me up, and the single factor that should decide it.</description>
    <category>Comparisons</category>
  </item>
  <item>
    <title>The SDET interview loop, decoded</title>
    <link>https://qa.codes/blog/the-sdet-interview-loop-decoded</link>
    <guid isPermaLink="true">https://qa.codes/blog/the-sdet-interview-loop-decoded</guid>
    <pubDate>Tue, 20 Jan 2026 00:00:00 GMT</pubDate>
    <description>The SDET interview loop is four rounds in a trench coat: live coding, system design, framework selection, behavioural. Each round tests something different. Here&apos;s what each one is actually looking for.</description>
    <category>Career</category>
  </item>
  <item>
    <title>From SDET to QA Lead: the shift no one warns you about</title>
    <link>https://qa.codes/blog/from-sdet-to-qa-lead-the-shift-no-one-warns-you-about</link>
    <guid isPermaLink="true">https://qa.codes/blog/from-sdet-to-qa-lead-the-shift-no-one-warns-you-about</guid>
    <pubDate>Tue, 13 Jan 2026 00:00:00 GMT</pubDate>
    <description>The transition from SDET to QA Lead is brutal in a way the title doesn&apos;t telegraph. You stop being measured on what you ship and start being measured on what your team ships.</description>
    <category>Career</category>
  </item>
  <item>
    <title>AI-generated tests are useful — but not for the reason you think</title>
    <link>https://qa.codes/blog/ai-generated-tests-useful-but-not-for-the-reason-you-think</link>
    <guid isPermaLink="true">https://qa.codes/blog/ai-generated-tests-useful-but-not-for-the-reason-you-think</guid>
    <pubDate>Thu, 08 Jan 2026 00:00:00 GMT</pubDate>
    <description>AI writes 80% of a test 80% of the way, and the remaining 20% is exactly the part that makes it a test. Where AI saves time, where it&apos;s a trap, and the distinction that separates the two.</description>
    <category>Opinions</category>
  </item>
  <item>
    <title>Using Claude and Copilot for test writing: a practical playbook</title>
    <link>https://qa.codes/blog/using-claude-and-copilot-for-test-writing</link>
    <guid isPermaLink="true">https://qa.codes/blog/using-claude-and-copilot-for-test-writing</guid>
    <pubDate>Tue, 30 Dec 2025 00:00:00 GMT</pubDate>
    <description>The practical playbook for AI-assisted test writing in 2026. The prompts that work, the prompts that don&apos;t, and the human-in-the-loop checkpoints that keep AI from writing tests that pass for the wrong reasons.</description>
    <category>Tutorials</category>
  </item>
  <item>
    <title>Adding accessibility tests with axe — a practical walkthrough</title>
    <link>https://qa.codes/blog/axe-playwright-walkthrough</link>
    <guid isPermaLink="true">https://qa.codes/blog/axe-playwright-walkthrough</guid>
    <pubDate>Tue, 23 Dec 2025 00:00:00 GMT</pubDate>
    <description>axe-core is the engine behind most accessibility testing in 2026 — and it&apos;s surprisingly approachable. Here&apos;s a practical walkthrough of integrating axe with Playwright, what it catches, and what it misses.</description>
    <category>Tutorials</category>
  </item>
  <item>
    <title>Your Lighthouse score isn&apos;t an accessibility test</title>
    <link>https://qa.codes/blog/lighthouse-score-isnt-a-test</link>
    <guid isPermaLink="true">https://qa.codes/blog/lighthouse-score-isnt-a-test</guid>
    <pubDate>Tue, 16 Dec 2025 00:00:00 GMT</pubDate>
    <description>A 100 Lighthouse accessibility score doesn&apos;t mean your site is accessible. The score is a smoke alarm — useful, but not a test. Here&apos;s what it actually measures, and what you still need to check manually.</description>
    <category>Opinions</category>
  </item>
  <item>
    <title>The test pyramid is a vibe, not a rule</title>
    <link>https://qa.codes/blog/the-test-pyramid-is-a-vibe-not-a-rule</link>
    <guid isPermaLink="true">https://qa.codes/blog/the-test-pyramid-is-a-vibe-not-a-rule</guid>
    <pubDate>Fri, 12 Dec 2025 00:00:00 GMT</pubDate>
    <description>The Cohn test pyramid has been gospel since 2009. It was a useful heuristic for a 2009 monolith Java app. It&apos;s been quoted unchanged ever since — and most modern stacks don&apos;t fit its shape.</description>
    <category>Opinions</category>
  </item>
  <item>
    <title>Postman vs Insomnia vs Bruno in 2026: my pick for API testing</title>
    <link>https://qa.codes/blog/postman-vs-insomnia-vs-bruno-2026</link>
    <guid isPermaLink="true">https://qa.codes/blog/postman-vs-insomnia-vs-bruno-2026</guid>
    <pubDate>Tue, 09 Dec 2025 00:00:00 GMT</pubDate>
    <description>Three tools, three very different bets on what API testing should feel like. I&apos;ve been comparing them for teams who want to move off ad-hoc curl scripts, and here&apos;s the pick.</description>
    <category>Comparisons</category>
  </item>
  <item>
    <title>Mobile testing in 2026: Appium, Detox, or Maestro?</title>
    <link>https://qa.codes/blog/appium-vs-detox-vs-maestro-2026</link>
    <guid isPermaLink="true">https://qa.codes/blog/appium-vs-detox-vs-maestro-2026</guid>
    <pubDate>Tue, 02 Dec 2025 00:00:00 GMT</pubDate>
    <description>Mobile test automation is the last frontier where &apos;just pick the obvious tool&apos; doesn&apos;t apply. Three credible options in 2026 — each making a different bet. Here&apos;s the comparison.</description>
    <category>Comparisons</category>
  </item>
  <item>
    <title>Test plans nobody reads, and the one-page replacement that works</title>
    <link>https://qa.codes/blog/test-plans-nobody-reads</link>
    <guid isPermaLink="true">https://qa.codes/blog/test-plans-nobody-reads</guid>
    <pubDate>Thu, 27 Nov 2025 00:00:00 GMT</pubDate>
    <description>The 40-page IEEE 829 test plan: written once at kickoff, opened twice during the project, abandoned after release. There&apos;s a single-page replacement that teams actually update.</description>
    <category>Opinions</category>
  </item>
  <item>
    <title>API tests as documentation — and why that&apos;s the only test suite anyone reads</title>
    <link>https://qa.codes/blog/api-tests-as-documentation</link>
    <guid isPermaLink="true">https://qa.codes/blog/api-tests-as-documentation</guid>
    <pubDate>Tue, 25 Nov 2025 00:00:00 GMT</pubDate>
    <description>Wiki pages about APIs go stale in three months. The API test suite gets opened every single day. Write tests that read like documentation — and stop writing the wiki.</description>
    <category>Opinions</category>
  </item>
  <item>
    <title>Percy, Chromatic, Argos, Loki: visual regression in 2026</title>
    <link>https://qa.codes/blog/visual-regression-tools-2026</link>
    <guid isPermaLink="true">https://qa.codes/blog/visual-regression-tools-2026</guid>
    <pubDate>Tue, 18 Nov 2025 00:00:00 GMT</pubDate>
    <description>Four contenders for visual regression in 2026. The dollar cost is easy to compare; the review-fatigue cost is the one no one warns you about. Here&apos;s the comparison and the pick.</description>
    <category>Comparisons</category>
  </item>
  <item>
    <title>Contract testing, explained without the Pact marketing</title>
    <link>https://qa.codes/blog/contract-testing-explained-without-pact-marketing</link>
    <guid isPermaLink="true">https://qa.codes/blog/contract-testing-explained-without-pact-marketing</guid>
    <pubDate>Tue, 11 Nov 2025 00:00:00 GMT</pubDate>
    <description>Contract testing is two things wearing one name: a model and a tool. The model is genuinely useful; the marketing for the tool oversells where it fits. Here&apos;s the model, separated from any vendor&apos;s pitch.</description>
    <category>Deep dives</category>
  </item>
  <item>
    <title>Load tests in CI: the honest version</title>
    <link>https://qa.codes/blog/load-tests-in-ci-the-honest-version</link>
    <guid isPermaLink="true">https://qa.codes/blog/load-tests-in-ci-the-honest-version</guid>
    <pubDate>Tue, 04 Nov 2025 00:00:00 GMT</pubDate>
    <description>The pitch: &apos;run load tests on every PR.&apos; The reality: you&apos;ll have flaky thresholds in three days and disabled tests in two weeks. Here&apos;s the four-tier strategy that actually survives.</description>
    <category>Opinions</category>
  </item>
  <item>
    <title>REST vs GraphQL testing: the actual differences</title>
    <link>https://qa.codes/blog/rest-vs-graphql-testing-the-real-differences</link>
    <guid isPermaLink="true">https://qa.codes/blog/rest-vs-graphql-testing-the-real-differences</guid>
    <pubDate>Tue, 28 Oct 2025 00:00:00 GMT</pubDate>
    <description>Most &apos;REST vs GraphQL&apos; content is about API design. The testing perspective is different — query construction, schema-aware tooling, the N+1-shaped test bug, and why GraphQL flips the test pyramid.</description>
    <category>Deep dives</category>
  </item>
  <item>
    <title>Manual exploratory testing isn&apos;t dead — it&apos;s underused</title>
    <link>https://qa.codes/blog/manual-exploratory-testing-isnt-dead-its-underused</link>
    <guid isPermaLink="true">https://qa.codes/blog/manual-exploratory-testing-isnt-dead-its-underused</guid>
    <pubDate>Tue, 21 Oct 2025 00:00:00 GMT</pubDate>
    <description>What automation replaced was regression checks — running the same path repeatedly. What it didn&apos;t replace, and can&apos;t replace, is human intuition trying to break a product.</description>
    <category>Opinions</category>
  </item>
  <item>
    <title>k6 vs JMeter vs Gatling in 2026: what I&apos;d pick for a modern stack</title>
    <link>https://qa.codes/blog/k6-vs-jmeter-vs-gatling-2026</link>
    <guid isPermaLink="true">https://qa.codes/blog/k6-vs-jmeter-vs-gatling-2026</guid>
    <pubDate>Tue, 14 Oct 2025 00:00:00 GMT</pubDate>
    <description>Three load-testing tools with three radically different ergonomics. JMeter has the 2004 XML/GUI legacy. Gatling stakes everything on Scala. k6 is the JavaScript-first newcomer. Here&apos;s the pick.</description>
    <category>Comparisons</category>
  </item>
  </channel>
</rss>