<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: qa</title>
    <description>The latest articles tagged 'qa' on DEV Community.</description>
    <link>https://dev.to/t/qa</link>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/tag/qa"/>
    <language>en</language>
    <item>
      <title>The Defect Life Cycle: From New to Closed</title>
      <dc:creator>keyur shah</dc:creator>
      <pubDate>Fri, 06 Nov 2026 11:42:33 +0000</pubDate>
      <link>https://dev.to/keyur_shah_f3f68b0d63db96/the-defect-life-cycle-from-new-to-closed-3k2l</link>
      <guid>https://dev.to/keyur_shah_f3f68b0d63db96/the-defect-life-cycle-from-new-to-closed-3k2l</guid>
      <description>&lt;p&gt;Every software team eventually asks the same question: “Where is this bug right now?”&lt;br&gt;&lt;br&gt;
Regardless of whether you track work in Jira, Azure DevOps, or a simple spreadsheet, a defect moves through a predictable set of states. Understanding these states, who owns them, and the best practices around them keeps the flow smooth and the product stable.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Core States
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;State&lt;/th&gt;
&lt;th&gt;What Happens&lt;/th&gt;
&lt;th&gt;Owner&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;New → Assigned&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;A tester or user discovers an issue, logs it with a clear description, and the triage lead hands it to a developer.&lt;/td&gt;
&lt;td&gt;QA creates the record; the triage lead assigns it.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Fixed → Retest&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;The developer believes the code change resolves the problem and marks the defect as Fixed. The QA team then picks it up for verification.&lt;/td&gt;
&lt;td&gt;Developer marks Fixed; QA takes it to Retest.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;These two transitions are the heartbeat of the cycle. “New” is the entry point, and “Retest” is the first real test of whether the fix works.&lt;/p&gt;

&lt;h2&gt;
  
  
  Retest Outcomes
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;State&lt;/th&gt;
&lt;th&gt;What Happens&lt;/th&gt;
&lt;th&gt;Owner&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Verified → Closed&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;QA confirms the defect no longer reproduces using the original steps. The defect is marked Verified and then Closed.&lt;/td&gt;
&lt;td&gt;QA verifies; the product owner may give final sign‑off before closure.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Reopened&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;The fix fails under the original repro steps, or a regression is discovered. The defect goes back to Assigned for another round.&lt;/td&gt;
&lt;td&gt;QA reopens; the defect returns to the developer.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;A high reopen rate often signals flaky code, insufficient test coverage, or unclear requirements. Tracking this metric helps pinpoint weak components.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Other Exits
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;State&lt;/th&gt;
&lt;th&gt;What It Means&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Duplicate&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;The same issue has already been logged under a different ID. The duplicate is linked and closed to avoid waste.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Won’t Fix / Deferred&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;The team decides the risk is acceptable, or the fix is postponed to a later release. This decision should be documented and reviewed regularly.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;These exits prevent the backlog from becoming a dumping ground. They also ensure that every decision is visible to stakeholders.&lt;/p&gt;

&lt;h2&gt;
  
  
  Who Owns What
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Role&lt;/th&gt;
&lt;th&gt;Responsibilities&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;QA&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Owns &lt;strong&gt;New&lt;/strong&gt;, &lt;strong&gt;Retest&lt;/strong&gt;, and &lt;strong&gt;Verified&lt;/strong&gt;. QA finds defects, adds reproducible steps and evidence, retests fixes, and confirms closure.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Dev&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Owns &lt;strong&gt;Assigned&lt;/strong&gt; and &lt;strong&gt;Fixed&lt;/strong&gt;. Developers diagnose the root cause, implement a fix, and mark the defect as Fixed.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Clear ownership eliminates hand‑off confusion and speeds up the cycle.&lt;/p&gt;

&lt;h2&gt;
  
  
  Do / Avoid
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Do&lt;/strong&gt;  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Attach reproducible steps and screenshots at &lt;strong&gt;New&lt;/strong&gt;; don’t wait until later.
&lt;/li&gt;
&lt;li&gt;Re‑verify using the exact original steps during &lt;strong&gt;Retest&lt;/strong&gt;; a quick glance can miss subtle regressions.
&lt;/li&gt;
&lt;li&gt;Track the reopen rate per component; treat spikes as a quality signal that needs investigation.
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Avoid&lt;/strong&gt;  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Closing a defect without an independent retest; it creates hidden technical debt.
&lt;/li&gt;
&lt;li&gt;Letting “Won’t Fix” become a permanent sink; schedule periodic reviews to reassess.
&lt;/li&gt;
&lt;li&gt;Skipping severity or priority logging at creation; it hampers triage and release planning.
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Understanding and respecting the defect life cycle keeps teams aligned, reduces waste, and delivers more reliable software.  &lt;/p&gt;

&lt;p&gt;&lt;em&gt;Master the flow, and the bugs will flow through it predictably.&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;&lt;a href="https://topmate.io/keyshah" rel="noopener noreferrer"&gt;Book a call&lt;/a&gt;&lt;/p&gt;

</description>
      <category>qa</category>
      <category>agile</category>
      <category>testing</category>
      <category>projectmanagement</category>
    </item>
    <item>
      <title>How to Review AI-Generated Test Cases Before You Trust Them</title>
      <dc:creator>Craig Brown</dc:creator>
      <pubDate>Fri, 06 Nov 2026 11:41:23 +0000</pubDate>
      <link>https://dev.to/craig_brown_a75c4b1621284/how-to-review-ai-generated-test-cases-before-you-trust-them-5dhd</link>
      <guid>https://dev.to/craig_brown_a75c4b1621284/how-to-review-ai-generated-test-cases-before-you-trust-them-5dhd</guid>
      <description>&lt;p&gt;I'm the only QA engineer on a large development team, so I use AI a lot. ChatGPT, Claude and Copilot all help me get a first draft of test cases down far faster than I could type them.&lt;/p&gt;

&lt;p&gt;But here's the thing I've learnt the hard way: AI drafts look more complete than they are. They're well formatted, confidently worded and neatly numbered. That polish makes it very tempting to skim, nod and paste them into the test management tool.&lt;/p&gt;

&lt;p&gt;[MY REAL EXAMPLE]&lt;/p&gt;

&lt;p&gt;The AI's job is to draft. My job is to verify, not rubber-stamp. Below are the seven checks I run on every AI-generated set of test cases before I trust any of them.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Trace every test back to a requirement&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Every test case should exist because of something in the story, spec or acceptance criteria. If I can't point to where a test came from, I don't know whether it's testing the product or testing the AI's imagination.&lt;/p&gt;

&lt;p&gt;What to look for: a test like "Verify the user can export results to PDF" when the story only mentions CSV export. It reads perfectly sensibly. It's just not in scope.&lt;/p&gt;

&lt;p&gt;Quick tip: ask the AI to add a "Source" line to each test quoting the exact requirement it covers. Then check those quotes against the real document — the AI can misquote too.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Hunt for invented details&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This is the one that catches people out most. When the AI doesn't know a detail, it often fills the gap with something plausible: a field name, an error message, a validation rule, a timeout, a role name.&lt;/p&gt;

&lt;p&gt;What to look for:&lt;/p&gt;

&lt;p&gt;Field labels that don't match the UI ("Email Address" when the screen says "Work email")&lt;br&gt;
Exact error message text nobody gave it&lt;br&gt;
Business rules stated as fact ("accounts lock after 5 failed attempts") that appear nowhere in the requirements&lt;/p&gt;

&lt;p&gt;Quick tip: highlight every specific value in the draft — numbers, strings, names — and confirm each one against a source. Anything you can't confirm becomes a question for the product owner, not an expected result.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Check negative and edge cases&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;AI drafts lean heavily towards the happy path. You'll often get six variations of "valid input succeeds" and one token "invalid input shows an error".&lt;/p&gt;

&lt;p&gt;What to look for: missing coverage for empty fields, boundary values, maximum lengths, special characters, duplicate submissions, expired sessions, permissions for different user roles, and what happens when a dependency is slow or unavailable.&lt;/p&gt;

&lt;p&gt;Quick tip: after the first draft, ask specifically: "List the negative, boundary and error-handling cases that are missing from these tests." Then apply your own judgement — you know where this system has broken before. The AI doesn't.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Make sure expected results are testable&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;An expected result should let two different testers reach the same pass/fail verdict. AI loves vague outcomes that sound like results but can't actually fail.&lt;/p&gt;

&lt;p&gt;What to look for: phrases like "the system works as expected", "the page loads correctly", "an appropriate message is displayed" or "data is saved successfully".&lt;/p&gt;

&lt;p&gt;Quick tip: for each expected result, ask yourself "how would I prove this failed?" If there's no clear answer, rewrite it as something observable: a specific message, a specific state, a specific record in the database.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Remove duplicates and padding&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Ask for twenty test cases and you'll usually get twenty, whether the feature needs them or not. Volume isn't coverage, and padded suites cost real time to run and maintain.&lt;/p&gt;

&lt;p&gt;What to look for: tests that differ only in wording, tests that check the same rule with an equivalent input, and filler like "Verify the page title is displayed" that adds nothing to the risk you're covering.&lt;/p&gt;

&lt;p&gt;Quick tip: group the tests by the rule or behaviour they cover. Where two tests land in the same group with no meaningful difference in input or risk, merge them or delete one.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Check for sensitive data in prompts and test data&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This applies in both directions. What did you paste into the prompt, and what has the AI put into your test data?&lt;/p&gt;

&lt;p&gt;What to look for:&lt;/p&gt;

&lt;p&gt;Real customer names, emails or account details copied from production into a prompt&lt;br&gt;
API keys, connection strings or internal URLs in pasted logs or config&lt;br&gt;
Generated test data that looks like real personal data and might end up in shared environments or screenshots&lt;/p&gt;

&lt;p&gt;Quick tip: anonymise before you prompt, and use clearly fake data in tests (for example, addresses on a reserved domain like example.test). Check your organisation's policy on which AI tools are approved for which kinds of data.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Record what you verified&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;If a test case was drafted by AI and reviewed by you, that should be visible. It protects you, helps your team understand how much to trust the suite, and matters a great deal in regulated environments where you may need to show your working.&lt;/p&gt;

&lt;p&gt;What to look for: test cases with no indication of where they came from, who checked them, or what was changed.&lt;/p&gt;

&lt;p&gt;Quick tip: keep it light. A short review note — "AI draft, reviewed against AUTH-112, two invented rules removed, three negative cases added" — is enough. You don't need an essay; you need a trail.&lt;/p&gt;

&lt;p&gt;Before and after: one test case&lt;/p&gt;

&lt;p&gt;Here's a typical AI draft for a password reset story:&lt;/p&gt;

&lt;p&gt;text&lt;br&gt;
TC-014: Verify password reset works&lt;br&gt;
Steps:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Go to the login page&lt;/li&gt;
&lt;li&gt;Click "Forgot Password"&lt;/li&gt;
&lt;li&gt;Enter a valid email&lt;/li&gt;
&lt;li&gt;Click Submit
Expected: User receives a reset email and the system works as expected.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;And the same test after review:&lt;/p&gt;

&lt;p&gt;text&lt;br&gt;
TC-014: Reset email is sent for a registered address&lt;br&gt;
Source: AUTH-112, acceptance criterion 1&lt;br&gt;
Preconditions:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Account exists for &lt;a href="mailto:test.user01@example.test"&gt;test.user01@example.test&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Test mailbox is accessible in the QA environment
Steps:&lt;/li&gt;
&lt;li&gt;On the login page, select "Forgot password?"&lt;/li&gt;
&lt;li&gt;Enter &lt;a href="mailto:test.user01@example.test"&gt;test.user01@example.test&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Select "Send reset link"
Expected:&lt;/li&gt;
&lt;li&gt;Confirmation message matches the copy in AUTH-112&lt;/li&gt;
&lt;li&gt;Exactly one reset email arrives in the test mailbox&lt;/li&gt;
&lt;li&gt;The email contains a link to the reset page for that account
Review notes:&lt;/li&gt;
&lt;li&gt;AI draft, reviewed by CB&lt;/li&gt;
&lt;li&gt;Link label corrected to match UI&lt;/li&gt;
&lt;li&gt;Invented message "Check your inbox!" removed&lt;/li&gt;
&lt;li&gt;Unregistered email and expired link split into TC-015 and TC-016&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The reviewed version is traceable, uses real labels, has expected results that can fail, splits out the negative cases, and leaves a record of what changed.&lt;/p&gt;

&lt;p&gt;Wrapping up&lt;/p&gt;

&lt;p&gt;AI has made me faster at drafting tests, and I'm not going back. But speed only helps if what comes out is right. The polish on an AI draft is not evidence of quality — it's just formatting.&lt;/p&gt;

&lt;p&gt;Treat every AI-generated test case as a first draft from a confident colleague who hasn't read the spec. Trace it, question it, tighten it, and write down what you checked. That's where the actual testing happens.&lt;/p&gt;

&lt;p&gt;AI drafts. You verify.&lt;/p&gt;

&lt;p&gt;I've put together a kit with 38 QA prompts and a 15-point checklist for this: &lt;a href="https://trustworthy-ai-testing.lovable.app/" rel="noopener noreferrer"&gt;https://trustworthy-ai-testing.lovable.app/&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>testing</category>
      <category>qa</category>
      <category>productivity</category>
    </item>
    <item>
      <title>The first four weeks of a QA course in Nepal, and why automation waits</title>
      <dc:creator>Saarathi Academy</dc:creator>
      <pubDate>Fri, 06 Nov 2026 11:09:37 +0000</pubDate>
      <link>https://dev.to/saarathi_academy/the-first-four-weeks-of-a-qa-course-in-nepal-and-why-automation-waits-2m0m</link>
      <guid>https://dev.to/saarathi_academy/the-first-four-weeks-of-a-qa-course-in-nepal-and-why-automation-waits-2m0m</guid>
      <description>&lt;p&gt;The first month of a good QA course has no test automation in it. You spend four weeks learning what to test, how to report a bug so it gets fixed, and how to check an API and a database.&lt;/p&gt;

&lt;p&gt;Automation comes after that, because a script only repeats the checks you chose. If you choose weak checks, the script runs weak checks faster.&lt;/p&gt;

&lt;h2&gt;
  
  
  What does a QA engineer actually do?
&lt;/h2&gt;

&lt;p&gt;QA (quality assurance) means checking that software works before users get it. A QA engineer reads what a feature should do, decides how to test it, finds where it breaks, and writes that down clearly enough for a developer to fix it.&lt;/p&gt;

&lt;p&gt;Most of that is thinking and writing, not coding. Code helps later, when the same checks must run on every change. So the first month builds the thinking, in this order.&lt;/p&gt;

&lt;h2&gt;
  
  
  Week 1: Where does testing fit in building software?
&lt;/h2&gt;

&lt;p&gt;Start with how software gets made. Learn the steps a feature goes through, from the idea to the release, and where testing sits in each step. Learn the main kinds of testing too: checking one small part, checking parts together, and checking the whole app as a user would.&lt;/p&gt;

&lt;p&gt;Add Git basics this week. Later, your test code lives in Git, and employers will look at your GitHub.&lt;/p&gt;

&lt;p&gt;Then practise on something built for testers. &lt;a href="https://with-bugs.practicesoftwaretesting.com" rel="noopener noreferrer"&gt;Practice Software Testing&lt;/a&gt; is a free demo shop. Its makers keep one version with bugs added on purpose, so you know there is something to find. Pick one page, like login, and write down everything it must do.&lt;/p&gt;

&lt;h2&gt;
  
  
  Week 2: How do you choose which inputs to test?
&lt;/h2&gt;

&lt;p&gt;You cannot test every possible input, so you learn to pick the few that matter. This is called test design, and it is what separates testing from clicking around.&lt;/p&gt;

&lt;p&gt;Two techniques do most of the work. Equivalence partitioning splits inputs into groups that should behave the same, and tests one value from each group. Boundary value analysis then tests the edges of each group, because that is where code often breaks.&lt;/p&gt;

&lt;p&gt;Here is a simple case. A month field accepts 1 to 12. You test 0, 1, 12 and 13, which are the values on both sides of each edge. For a Nepali mobile number field, you would test 9, 10 and 11 digits, not fifty random numbers.&lt;/p&gt;

&lt;p&gt;This is also a good week to start JavaScript on the side, a little each day. You will need it in week five, and it is easier to learn slowly than in a rush.&lt;/p&gt;

&lt;h2&gt;
  
  
  Week 3: What makes a bug report good enough to fix?
&lt;/h2&gt;

&lt;p&gt;A bug that nobody can reproduce does not get fixed. Mozilla's &lt;a href="https://bugzilla.mozilla.org/page.cgi?id=bug-writing.html" rel="noopener noreferrer"&gt;bug writing guide&lt;/a&gt; calls the steps to reproduce "the most important part of any bug report".&lt;/p&gt;

&lt;p&gt;A good report has four parts:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;a short summary that names the problem,&lt;/li&gt;
&lt;li&gt;numbered steps to reproduce it,&lt;/li&gt;
&lt;li&gt;what you expected and what actually happened,&lt;/li&gt;
&lt;li&gt;the browser, device and version you used.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Mozilla gives two more rules worth keeping. Separate what you saw from what you guess. Write one bug per report.&lt;/p&gt;

&lt;p&gt;If English is your second language, this is good news. Short numbered steps work better than long paragraphs. A developer reading "3. Click Pay. 4. Page shows Rs 0" understands it at once.&lt;/p&gt;

&lt;p&gt;Learn two words this week too. Severity is how bad the bug is. Priority is how soon it should be fixed. A typo on the home page has low severity but can still have high priority.&lt;/p&gt;

&lt;h2&gt;
  
  
  Week 4: Why do testers need Postman and SQL?
&lt;/h2&gt;

&lt;p&gt;Many bugs hide behind the screen. The page says "Saved", but nothing reached the database. The form shows an error, but the server crashed underneath it.&lt;/p&gt;

&lt;p&gt;Postman lets you send a request straight to an API (the part of an app that sends and receives data) and read the answer. Every answer has a status code. Codes from 200 to 299 mean success, 400 to 499 mean the request was wrong, and 500 to 599 mean the server failed, as &lt;a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Status" rel="noopener noreferrer"&gt;MDN explains&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;That gives you an easy first test. Send an empty or wrong value. A good API answers with a 400 and a clear message. A 500 means the server did not know how to handle it, and that is a bug to report.&lt;/p&gt;

&lt;p&gt;SQL does the same job for data. You place an order in the app, then run one &lt;code&gt;SELECT&lt;/code&gt; query to check that the row exists with the right amount. Testers who can do this find bugs that clicking alone never shows.&lt;/p&gt;

&lt;h2&gt;
  
  
  Is an old laptop enough for the first month?
&lt;/h2&gt;

&lt;p&gt;Yes. These four weeks need a browser, the Postman desktop app, a text editor and Git. None of them are heavy, and the practice shop runs online, so there is nothing big to install.&lt;/p&gt;

&lt;p&gt;Heavier tools come later, with automation. By then you will know if QA suits you.&lt;/p&gt;

&lt;h2&gt;
  
  
  What can you try tonight?
&lt;/h2&gt;

&lt;p&gt;Open the buggy version of the practice shop and give yourself 30 minutes. Find one bug. Write it up with the four parts above, as if a developer you have never met will read it.&lt;/p&gt;

&lt;p&gt;Then install Postman and follow its guide to &lt;a href="https://learning.postman.com/docs/getting-started/first-steps/sending-the-first-request/" rel="noopener noreferrer"&gt;send your first request&lt;/a&gt;. Look at the status code, then change the address so it breaks, and look again.&lt;/p&gt;

&lt;p&gt;Saarathi Academy in Old Baneshwor, Kathmandu teaches QA in this order in its &lt;a href="https://saarathiacademy.com.np/software-quality-assurance-course-in-nepal" rel="noopener noreferrer"&gt;Software Quality Assurance course&lt;/a&gt;: manual testing in weeks 1 to 3, Postman and SQL in week 4, then Playwright automation. The &lt;a href="https://saarathiacademy.com.np/course-syllabi/software-quality-assurance-syllabus" rel="noopener noreferrer"&gt;week-by-week syllabus&lt;/a&gt; is public before you pay.&lt;/p&gt;

</description>
      <category>testing</category>
      <category>qa</category>
      <category>softwaretesting</category>
      <category>postman</category>
    </item>
    <item>
      <title>nexus studio mobile testing</title>
      <dc:creator>nexus studio</dc:creator>
      <pubDate>Thu, 05 Nov 2026 15:38:10 +0000</pubDate>
      <link>https://dev.to/nexus_studioqa/nexus-studio-mobile-testing-27p3</link>
      <guid>https://dev.to/nexus_studioqa/nexus-studio-mobile-testing-27p3</guid>
      <description>&lt;p&gt;One test, three phones, and each one files its own evidence.&lt;/p&gt;

&lt;p&gt;Nexus StudioQA runs the same test on emulated profiles (Chrome on a Pixel 5, WebKit on an iPhone 13, a low-end phone with the CPU throttled) and History lines them up per identity. For a real Android phone, a guided setup walks through six steps over USB, and the phone's screen is mirrored on your PC while the test runs. No device farm and no minutes to buy.&lt;/p&gt;

&lt;p&gt;Limits, plainly: real phones are Android only. iPhone and iPad are covered through WebKit emulation, not physical devices.&lt;/p&gt;

</description>
      <category>mobiletesting</category>
      <category>playwright</category>
      <category>apitesting</category>
      <category>qa</category>
    </item>
    <item>
      <title>Cypress Email Tests Need a Causal Trace</title>
      <dc:creator>Silviu Technology</dc:creator>
      <pubDate>Thu, 05 Nov 2026 14:23:39 +0000</pubDate>
      <link>https://dev.to/silviutech/cypress-email-tests-need-a-causal-trace-137k</link>
      <guid>https://dev.to/silviutech/cypress-email-tests-need-a-causal-trace-137k</guid>
      <description>&lt;p&gt;A Cypress email test can tell you that a verification link was not found. It usually cannot tell you why. The message may have arrived late, the test may have searched the wrong inbox, or the application may never have requested the email at all. Those failures look very similar when the only artifact is a timeout.&lt;/p&gt;

&lt;p&gt;For reliable Testing, I treat each email assertion as a small causal investigation. The test should connect the user action, the backend event, the inbox observations, and the final link click. A pass or fail is the conclusion; the causal trace is the evidence that makes the conclusion useful.&lt;/p&gt;

&lt;p&gt;This approach works with a temporary inbox, a local mail server, or a disposable email generator. The provider matters less than the evidence contract around it. Search terms such as &lt;code&gt;temp mail so&lt;/code&gt; may describe the kind of test data a team is looking for, but they do not explain a failing run.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why a pass or fail result is not a cause
&lt;/h2&gt;

&lt;p&gt;Imagine a signup test that clicks &lt;strong&gt;Create account&lt;/strong&gt;, waits 30 seconds, and fails to find “Verify your email.” On the next retry it passes. The team may call this flaky, but several different causes are still possible:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The first request was never queued.&lt;/li&gt;
&lt;li&gt;The email arrived before the polling window started and was filtered out.&lt;/li&gt;
&lt;li&gt;A previous run left a message with the same subject.&lt;/li&gt;
&lt;li&gt;The inbox API returned a temporary error.&lt;/li&gt;
&lt;li&gt;The link was present, but the browser used a different account.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Retries can hide the distinction. The second attempt changes timing, inbox state, and often the test data too. If the log only says “expected email to exist,” there is no useful comparison between attempts. Thats why I want a trace that survives both a pass and a failure.&lt;/p&gt;

&lt;h2&gt;
  
  
  The event timeline to capture
&lt;/h2&gt;

&lt;p&gt;An email assertion does not need a huge observability platform. Four timestamps and a few identifiers are enough to start:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;code&gt;actionAt&lt;/code&gt;: when Cypress submitted the form.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;requestId&lt;/code&gt;: the application request or correlation ID, if one is exposed.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;pollStartedAt&lt;/code&gt;: when the inbox query began.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;messageId&lt;/code&gt;: the message accepted by the test.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;I also record the inbox address, the test run ID, the message subjects observed, and the reason each candidate was rejected. This makes the timeline readable:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;14:02:11.204 actionAt       signup submitted
14:02:11.260 requestId      req_7f2c
14:02:11.310 pollStartedAt  inbox polling started
14:02:12.018 observed       msg_91, subject="Welcome"
14:02:13.477 accepted       msg_92, subject="Verify your email"
14:02:14.006 clicked        verification link
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The trace should not store full message bodies or tokens in ordinary CI logs. Save a redacted artifact instead. Email testing is easier to debug when it is also careful with test data.&lt;/p&gt;

&lt;p&gt;If the product has recovery links, it is worth checking the related security behavior too. A &lt;a href="https://dev.to/sophiax99/oauth-recovery-links-need-a-revocation-plan-1jd1"&gt;revocation plan for recovery links&lt;/a&gt; is useful context when an end-to-end test follows a link beyond the inbox.&lt;/p&gt;

&lt;h2&gt;
  
  
  A Cypress helper for causal evidence
&lt;/h2&gt;

&lt;p&gt;I keep polling and evidence collection in one task. Individual specs then state what they are testing instead of rebuilding timing logic each time.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;type&lt;/span&gt; &lt;span class="nx"&gt;EmailTrace&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;inbox&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;actionAt&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;pollStartedAt&lt;/span&gt;&lt;span class="p"&gt;?:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;observed&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;Array&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nl"&gt;subject&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nl"&gt;receivedAt&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;rejected&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;[];&lt;/span&gt;
  &lt;span class="nl"&gt;acceptedId&lt;/span&gt;&lt;span class="p"&gt;?:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;waitForVerification&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;inbox&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;actionAt&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;trace&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;EmailTrace&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;inbox&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;actionAt&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;actionAt&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;toISOString&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
    &lt;span class="na"&gt;observed&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[],&lt;/span&gt;
    &lt;span class="na"&gt;rejected&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[],&lt;/span&gt;
  &lt;span class="p"&gt;};&lt;/span&gt;

  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;cy&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;task&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;pollInbox&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;inbox&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;since&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;actionAt&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;toISOString&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;then&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;messages&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;MailMessage&lt;/span&gt;&lt;span class="p"&gt;[])&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nx"&gt;trace&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;pollStartedAt&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;toISOString&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

      &lt;span class="k"&gt;for &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;message&lt;/span&gt; &lt;span class="k"&gt;of&lt;/span&gt; &lt;span class="nx"&gt;messages&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nx"&gt;trace&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;observed&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;push&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
          &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;message&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="na"&gt;subject&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;message&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;subject&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="na"&gt;receivedAt&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;message&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;receivedAt&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="p"&gt;});&lt;/span&gt;

        &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;message&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;subject&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;includes&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Verify your email&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="nx"&gt;trace&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;rejected&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;push&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;message&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;: subject mismatch`&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
          &lt;span class="k"&gt;continue&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;

        &lt;span class="nx"&gt;trace&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;acceptedId&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;message&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;message&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;trace&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt;

      &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`No verification message; trace=&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;stringify&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;trace&lt;/span&gt;&lt;span class="p"&gt;)}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In the spec, capture &lt;code&gt;actionAt&lt;/code&gt; immediately before submitting the form, then attach the returned trace to the Cypress test artifact. Do not use “latest message” as the only rule. Filter by time, subject, recipient ownership, and a request or run identifier when the application can include one.&lt;/p&gt;

&lt;p&gt;The small detail that saves time is recording rejected candidates. Without it, a developer sees that no message matched. With it, they see that two welcome emails arrived and both failed the ownership check. That is a different bug, and it points to fixture isolation.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to classify the failure
&lt;/h2&gt;

&lt;p&gt;After a failed run, classify the trace before changing the timeout. I use four buckets:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Application:&lt;/strong&gt; no request or queue event exists after the browser action.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Delivery:&lt;/strong&gt; the request exists, but no message appears within the agreed window.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Fixture:&lt;/strong&gt; a message appears, but it belongs to another run or recipient.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Assertion:&lt;/strong&gt; the right message is present, but parsing or link validation is wrong.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This classification also helps compare Cypress with other browser suites. For example, teams often need &lt;a href="https://dev.to/ryanlee91/react-signup-flows-need-email-states-5c45"&gt;explicit email states in signup flows&lt;/a&gt; before a UI can distinguish “queued” from “delivered.” If the UI has only a spinner, the browser test may be forced to guess too.&lt;/p&gt;

&lt;p&gt;A common note in a rushed test is &lt;code&gt;temp org mail&lt;/code&gt; or &lt;code&gt;temp gamil com&lt;/code&gt;. Those phrases might be useful search variants, but they are not a reason to widen a polling loop. First identify which bucket the trace supports. Then make the smallest fix.&lt;/p&gt;

&lt;h2&gt;
  
  
  A repeatable checklist
&lt;/h2&gt;

&lt;p&gt;Before merging an email test, check that it:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;creates or leases an inbox for the run;&lt;/li&gt;
&lt;li&gt;records the browser action time;&lt;/li&gt;
&lt;li&gt;filters messages newer than that action;&lt;/li&gt;
&lt;li&gt;logs rejected candidates without exposing message contents;&lt;/li&gt;
&lt;li&gt;verifies recipient or run ownership;&lt;/li&gt;
&lt;li&gt;stores a redacted trace on failure and on retry;&lt;/li&gt;
&lt;li&gt;distinguishes delivery delays from assertion mistakes.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The list is intentionally plain. A reliable test is not the one with the most waits. It is the one that leaves enough evidence for the next person to explain what happened, even when the run is inconsistant or a provider responds slow.&lt;/p&gt;

&lt;h2&gt;
  
  
  Q&amp;amp;A
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Should every email test use a unique inbox?
&lt;/h3&gt;

&lt;p&gt;For parallel or retry-heavy suites, yes when the provider makes that practical. If unique inboxes are expensive, use a stable inbox with a strict run identifier and a message ownership check. Shared inboxes without either rule create confusing false positives.&lt;/p&gt;

&lt;h3&gt;
  
  
  How long should Cypress poll?
&lt;/h3&gt;

&lt;p&gt;Use the delivery expectation of the environment, then make the timeout visible in the trace. A longer timeout can reduce noise, but it cannot repair a missing request or a wrong recipient. Increasing it blindly is usually a delay, not a diagnosis.&lt;/p&gt;

&lt;h3&gt;
  
  
  Do I need a full event-tracing system?
&lt;/h3&gt;

&lt;p&gt;No. Start with a structured JSON artifact containing the action timestamp, request ID, inbox, observed message metadata, rejection reasons, and accepted message ID. That is enough to turn many vague email failures into a concrete next step.&lt;/p&gt;

</description>
      <category>testing</category>
      <category>cypress</category>
      <category>qa</category>
      <category>automation</category>
    </item>
    <item>
      <title>Decentralize ownership, not load testing</title>
      <dc:creator>Gatling.io</dc:creator>
      <pubDate>Thu, 05 Nov 2026 10:34:09 +0000</pubDate>
      <link>https://dev.to/gatling/decentralize-ownership-not-load-testing-2j0a</link>
      <guid>https://dev.to/gatling/decentralize-ownership-not-load-testing-2j0a</guid>
      <description>&lt;p&gt;The release candidate is ready, the functional tests are green, and the product manager has a date. Then someone asks whether it has been load tested. The performance team's next slot is in two weeks.&lt;/p&gt;

&lt;p&gt;This is the traditional model: a small group of specialists, a shared pre-production environment, and a big load test at the end, used as a gate. When it works, it catches problems before customers do. When it doesn't, it catches them too late to fix, or it gets skipped. Contractors told Congress that end-to-end testing of Healthcare.gov began two weeks before launch. MongoDB's performance team has described, in a peer-reviewed paper, how its own end-of-cycle testing led to delayed releases or regressions shipped to customers.&lt;/p&gt;

&lt;p&gt;The usual answer is to "shift left" and hand testing to developers. The evidence says that is only half right. Our conclusion, and how our largest customers operate: &lt;strong&gt;decentralize ownership of performance, and centralize the platform that supports it.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Key takeaways&lt;/p&gt;

&lt;p&gt;Performance testing strategy&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Takeaway&lt;/th&gt;
&lt;th&gt;Why it matters&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Central, late-cycle load testing is risky&lt;/td&gt;
&lt;td&gt;Tests become rare events, feedback reaches the wrong person late, and late gates get overruled.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Handing tests to developers isn't enough&lt;/td&gt;
&lt;td&gt;Unsupported teams write few, flawed tests and miss system-level bottlenecks.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Teams own performance, the platform supports them&lt;/td&gt;
&lt;td&gt;Teams own objectives, scenarios, and fixes; the platform owns infrastructure, standards, and system-level tests.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Six practices make it work&lt;/td&gt;
&lt;td&gt;Tests in the repo, agreed pass/fail, shared methodology, run comparison, central governance.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;It works at scale&lt;/td&gt;
&lt;td&gt;Sophos runs without a central QA team; Intuit grew from fewer than 100 to 3,000+ Gatling users.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;It isn't for everyone&lt;/td&gt;
&lt;td&gt;Small teams, tightly coupled systems, and missing CI/CD change the answer.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  What a central team gets right, and what it costs
&lt;/h2&gt;

&lt;p&gt;A dedicated performance team exists for good reasons: specialists who can model a workload and tell a real regression from noise, one consistent methodology, a view of the whole system, and tight control over who can point heavy traffic at what. Those strengths are real. Here is what they cost as the organization grows.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Testing becomes an event:&lt;/strong&gt; When a load test means booking the shared environment and gathering the specialists, it gets scheduled rather than done. LoginRadius described the result: "That pushed performance testing to the back burner; it only ran when absolutely necessary." Yet DORA's definition of continuous integration includes developers getting feedback from performance tests every day.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Feedback arrives late, and to the wrong person:&lt;/strong&gt; A regression introduced in week one surfaces in week ten, mixed with dozens of other changes. The person who finds it rarely caused it, so it lands as a ticket about code its author has moved on from. MongoDB described exactly this diagnosis burden before moving its tests into CI.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Teams wait in line:&lt;/strong&gt; DORA treats testing on demand, without waiting for an integrated environment, as a core capability of high-performing teams. Intuit, describing its own specialist model, said every team needing a load test joined a queue. With finite capacity, a central team covers what is most visible. At IMA Group, much of the rest shipped untested.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Tests model last quarter's traffic:&lt;/strong&gt; Big suites are rebuilt rarely, while users and software keep changing. Facebook's engineers made this point when they built Kraken to load test with live traffic: a capacity model is hard to keep current.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;A late gate is easy to overrule:&lt;/strong&gt; On September 30, 2013, a stress test of a key Healthcare.gov component reached 1,100 users before response times became too high. The target was 10,000. The site launched the next day. Officials later disputed how representative that test was, which is the point: one late result is easy to argue with.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These costs compound. Hard-to-run tests happen rarely, rare tests cover big batches of change, big batches are slow to diagnose, and late results get overruled. Adding specialists to the central team doesn't break that loop.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where decentralization goes wrong
&lt;/h2&gt;

&lt;p&gt;Handing every team a load testing tool doesn't solve this. The research is clear about the failure modes.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Developers left alone write few tests, and many are flawed:&lt;/strong&gt; In a study of 111 open-source Java projects, the median project had 246 lines of performance test code against 3,980 of functional tests. A study of 123 projects found benchmarking mistakes in widespread use.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;The tooling is hard:&lt;/strong&gt; A SPEC Research Group survey found that tool complexity holds back performance testing in DevOps.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Component tests miss system behavior:&lt;/strong&gt; Microservice baselines are noisy, and some bottlenecks only appear when dozens of services are loaded together. That is why Shopify, whose teams own their services, still runs coordinated platform-wide scale tests before Black Friday.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Autonomy isn't accountability:&lt;/strong&gt; At Spotify, by one former engineer's account, the alignment and accountability parts of the squad model were never completed.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Centralized execution isn't the problem either: Meta runs a shared performance platform, ServiceLab, across its services. &lt;strong&gt;Moving the test is not the same as moving the ownership.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The model: central platform, distributed ownership
&lt;/h2&gt;

&lt;p&gt;Who owns what in decentralized performance testing?&lt;/p&gt;

&lt;p&gt;Shared ownership&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Product teams own&lt;/th&gt;
&lt;th&gt;The platform owns&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Performance objectives and pass/fail criteria&lt;/td&gt;
&lt;td&gt;Load generators, environments, secrets and permissions&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Test scenarios, versioned with their code&lt;/td&gt;
&lt;td&gt;Templates, standards and methodology&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Fast regression checks in CI&lt;/td&gt;
&lt;td&gt;Governance, budgets and cross-team visibility&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Fixing what the tests find&lt;/td&gt;
&lt;td&gt;System-level, capacity and peak-event tests&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Google's SRE model keeps services with product teams while SRE owns capacity planning. Netflix built its canary analysis tool, Kayenta, centrally, and service owners choose the metrics it judges. Team Topologies calls this a platform team plus an enabling team. Specialists don't disappear. They stop being a queue and start building the paved road.&lt;/p&gt;

&lt;h2&gt;
  
  
  Six principles, and how Gatling Enterprise Edition supports them
&lt;/h2&gt;

&lt;p&gt;Each failure mode above has a countermeasure. Here is how we see them, and the Gatling Enterprise Edition capability behind each.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Tests live in the service repo, in the team's language:&lt;/strong&gt; Friction is a big reason developers write few performance tests. Gatling tests are code in Java, JavaScript, TypeScript, Kotlin or Scala, reviewed in pull requests like any other change. Intuit ships a pre-configured performance test folder with every new repo. EPI Company writes its tests in Kotlin because, says Ulrich Winter, "that really lowers the barrier for developers to contribute."&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. The platform takes the hard shared work:&lt;/strong&gt; Gatling Enterprise Edition runs managed load generators, or &lt;a href="https://docs.gatling.io/reference/deploy/private-locations/introduction/" rel="noopener noreferrer"&gt;Private Locations&lt;/a&gt; inside your own network, so product teams never maintain test infrastructure. At Nickel and InPost, product teams own their scenarios while a platform team handles environments, secrets and permissions. "We stopped maintaining boxes," says InPost's Mateusz Piasta.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Pass/fail is agreed before the test runs:&lt;/strong&gt; Thresholds live in the simulation as assertions, such as &lt;code&gt;forAll().responseTime().percentile(95).lt(300)&lt;/code&gt;, or as &lt;a href="https://gatling.io/product/slo" rel="noopener noreferrer"&gt;SLOs set in Gatling Enterprise Edition&lt;/a&gt;, which take precedence when both exist. Sophos teams test against service-level agreements set by product management. Tikamoon's rule is shorter: "No Gatling run, no production."&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. Methodology is standardized centrally:&lt;/strong&gt; If one team uses a &lt;a href="https://gatling.io/blog/workload-models-in-load-testing" rel="noopener noreferrer"&gt;closed injection model and another an open one&lt;/a&gt;, their p95 numbers can't be compared. The platform team should settle conventions like this once, in templates. &lt;a href="https://gatling.io/product/campaigns" rel="noopener noreferrer"&gt;Campaigns&lt;/a&gt; in Gatling Enterprise Edition score every test on methodology, objectives and stability over its last three runs.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;5. Runs are compared over time:&lt;/strong&gt; Noisy environments make a single run against a fixed threshold misleading. &lt;a href="https://gatling.io/product/insight-analytics" rel="noopener noreferrer"&gt;Run comparison, the trends view&lt;/a&gt; and AI Trend Analysis show where a regression appeared. That is how InPost caught a doubling of requests per second, caused by a needless HTTP-to-HTTPS redirect, before it reached production.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;6. Governance stays central, and system-level tests stay coordinated:&lt;/strong&gt; Gatling Enterprise Edition gives each team its own &lt;a href="https://docs.gatling.io/reference/administration/teams/" rel="noopener noreferrer"&gt;credit quota&lt;/a&gt;, roles and isolated workspace, while platform owners keep visibility across all of them. Attentive's service owners each name a contact for cross-service game days that run every morning through the API. InPost's five-day simulation of the full parcel journey found bottlenecks "from code to cables."&lt;/p&gt;

&lt;h2&gt;
  
  
  What it looks like in practice
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Sophos: no central QA team
&lt;/h3&gt;

&lt;p&gt;When &lt;a href="https://gatling.io/customers/sophos" rel="noopener noreferrer"&gt;Sophos&lt;/a&gt; moved to microservices, it chose not to build a central QA or performance team. Each microservice team tests its own APIs against business-defined service-level agreements and reuses simulations across teams, while leadership tracks results and regressions in shared dashboards. Around 200 people now use the platform, with 100+ simulations covering 75 to 80% of backend APIs. Seeing their own services under load, teams also found endpoints that were wasting cloud resources.&lt;/p&gt;

&lt;h3&gt;
  
  
  Intuit: the same model at 8,000 engineers
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://gatling.io/intuit" rel="noopener noreferrer"&gt;Intuit's&lt;/a&gt; specialist model meant late feedback, regressions in production, a queue for every team, and around 30 fragmented tools. Principal Engineer Chaitanya Bhatt rebuilt it as a platform: test scaffolding in every repo, CI/CD onboarding, pre-built templates, and central governance. The Gatling Enterprise Edition API lets Intuit provision teams, simulations and roles from its internal developer portal. Gatling users grew from fewer than 100 in 2018 to more than 3,000, running 80,000+ tests a year with 97% coverage of critical services. Intuit didn't remove the center. It turned it into a platform.&lt;/p&gt;

&lt;h3&gt;
  
  
  Other ways to split it
&lt;/h3&gt;

&lt;p&gt;Attentive has no testing department, but a Developer Experience team runs the shared tooling. IMA Group and SNCF Connect &amp;amp; Tech both replaced central testing units with team ownership. In the other direction, Aircall grew a dedicated performance department as demand rose, and Criteo runs five performance engineers supporting 70+ colleagues. The goal isn't to remove specialists. It's to stop them being the only place testing happens. More examples are in our &lt;a href="https://gatling.io/customers" rel="noopener noreferrer"&gt;customer stories&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  When not to decentralize
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Small organizations:&lt;/strong&gt; Without people to staff a platform, decentralizing just means nobody runs the tests.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Tightly coupled systems:&lt;/strong&gt; Test ownership won't fix architectural coupling. The system-level test is the one that matters.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;No CI/CD or observability:&lt;/strong&gt; Teams get numbers they can't act on. Build those first.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Regulated environments:&lt;/strong&gt; These need an auditable gate, but that fits a federated model. At Nickel, a BNP Paribas subsidiary, product teams own their scenarios, load runs from Private Locations inside Nickel's network, and results go through a mandatory Change Advisory Board review.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  How to start
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt; Make the platform self-service through an API and CI integration.&lt;/li&gt;
&lt;li&gt; Move scenarios into team repos, starting with a few willing teams and templates.&lt;/li&gt;
&lt;li&gt; Add short checks to CI, and keep long tests for later stages.&lt;/li&gt;
&lt;li&gt; Standardize injection models, percentiles and pass/fail conventions.&lt;/li&gt;
&lt;li&gt; Keep coordinated capacity and peak-event tests with a named owner.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Measure results, not adoption: time from commit to regression detection, performance incidents in production, and time to repair them. And pilot first, because DORA's 2024 report associates new internal platforms with an initial dip in throughput and stability.&lt;/p&gt;

&lt;h2&gt;
  
  
  Ownership is the point
&lt;/h2&gt;

&lt;p&gt;A central team that owns every test becomes a queue. Developers who own tests without standards or support produce numbers nobody trusts. Give each team ownership of its own performance, and give the platform everything teams can't do alone. As IMA Group's Mehdi Chilla puts it: "Performance testing should be part of the natural workflow, not an exceptional activity."&lt;/p&gt;

&lt;p&gt;See how Intuit runs this across 8,000 engineers in &lt;a href="https://gatling.io/intuit" rel="noopener noreferrer"&gt;Chaitanya Bhatt's 45-minute session&lt;/a&gt;, or &lt;a href="https://gatling.io/community-vs-enterprise" rel="noopener noreferrer"&gt;compare Gatling Community and Enterprise Edition&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;[&lt;/p&gt;

&lt;p&gt;](&lt;a href="https://gatling.io/intuit" rel="noopener noreferrer"&gt;https://gatling.io/intuit&lt;/a&gt;)&lt;/p&gt;

</description>
      <category>loadtesting</category>
      <category>gatling</category>
      <category>performance</category>
      <category>qa</category>
    </item>
    <item>
      <title>An AI agent tested Toolshop from just the URL: 23 issues, 8 real</title>
      <dc:creator>Shahid Helal</dc:creator>
      <pubDate>Thu, 05 Nov 2026 10:18:44 +0000</pubDate>
      <link>https://dev.to/shahidhelalkhan/an-ai-agent-tested-toolshop-from-just-the-url-23-issues-8-real-27oj</link>
      <guid>https://dev.to/shahidhelalkhan/an-ai-agent-tested-toolshop-from-just-the-url-23-issues-8-real-27oj</guid>
      <description>&lt;p&gt;Toolshop's sign-up page says a password needs at least 8 characters. The form enforces 8. The API enforces 8. Type 7 and the error message says the minimum is 6.&lt;/p&gt;

&lt;p&gt;That's the best of 8 real bugs our AI testing agent found on &lt;a href="https://practicesoftwaretesting.com" rel="noopener noreferrer"&gt;Toolshop&lt;/a&gt;, the demo hardware store a lot of testers learn Playwright and Cypress on. It got only the URL. No test plan, no credentials, no hints.&lt;/p&gt;

&lt;p&gt;This is Weekly Teardown 2. Each week we point &lt;a href="https://testoptim.com" rel="noopener noreferrer"&gt;TestOptim&lt;/a&gt;, the agent we build, at a public app and publish what it finds, including what it got wrong. Teardown 1 was ParaBank, whose admin console had no login.&lt;/p&gt;

&lt;h2&gt;
  
  
  The run
&lt;/h2&gt;

&lt;p&gt;In 30 minutes the agent explored 17 pages and mapped 16 user flows and 29 business rules. It wrote 289 tests, ran 71 of them before the time limit, and flagged 23 issues.&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ff5l3as9gy0eid52c4mwg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ff5l3as9gy0eid52c4mwg.png" alt="Bar chart: 289 tests written, 71 run, 23 issues flagged, 8 real bugs" width="800" height="320"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A list of 23 issues isn't worth much if you have to check all 23 yourself. So I did, on the live site.&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ftg0abtwee94w6vz8d3ln.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ftg0abtwee94w6vz8d3ln.png" alt="Bar chart: of 23 issues, 8 hold up, 9 thrown out, 6 need an account to check" width="800" height="265"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What held up
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;1. The password rule changed, and its error message didn't.&lt;/strong&gt; The sign-up page says a password must "Be at least 8 characters long." The form validator enforces 8:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// sprint5/UI/src/app/auth/register/register.component.ts&lt;/span&gt;
&lt;span class="nx"&gt;PasswordValidators&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;minLength&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;So does the API:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="c1"&gt;// sprint5/API/app/Http/Requests/Customer/StoreCustomer.php&lt;/span&gt;
&lt;span class="nc"&gt;Password&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nb"&gt;min&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;But the error text lives in a separate translation file, &lt;code&gt;assets/i18n/en.json&lt;/code&gt;, under &lt;code&gt;fields.password.errors.minlength&lt;/code&gt;, and it still says "Password must be minimal 6 characters long."&lt;/p&gt;

&lt;p&gt;The rule says 8 in three places and 6 in one. Each piece looks fine on its own, which is why this kind of drift is easy to miss in a manual review and easy to catch for an agent that reads the page, submits the form and compares the two.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. The wrong error for a missing symbol.&lt;/strong&gt; Leave the special character out and the error says "Password can not include invalid characters." Nothing is invalid; something required is missing. A user who reads that deletes characters, which is the opposite of the fix.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. A menu link to a category that doesn't exist.&lt;/strong&gt; Categories → Special Tools opens "There are no products found." The public API has no Special Tools category at all.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. An empty cart breaks checkout.&lt;/strong&gt; Open &lt;code&gt;/checkout&lt;/code&gt; with nothing in the cart and nothing renders under the step bar. The console says why:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;TypeError: Cannot read properties of null (reading 'cart_items')
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;5. A product that doesn't exist gives a blank page.&lt;/strong&gt; Mistype a product URL and you get an empty page with a "Related products" heading instead of a "not found" message.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;6. "Forgot password" says nothing.&lt;/strong&gt; Enter an email, click "Set New Password", and the page stays as it was: no confirmation, no error.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;7. "Show differences only" only half works.&lt;/strong&gt; It filters the specifications, but rows that are identical for every product, like Brand, Category and Availability, stay on screen.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;8. "2years".&lt;/strong&gt; The product page prints the warranty as "2years". The comparison page prints the same value as "2 years".&lt;/p&gt;

&lt;h2&gt;
  
  
  What I threw out, and why
&lt;/h2&gt;

&lt;p&gt;9 findings didn't survive the re-check. They're the more useful half of this post if you're evaluating any AI testing tool.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Fake payments "accepted".&lt;/strong&gt; The agent rated a 1111-1111-1111-1111 card and a made-up gift card as critical. In a real store they would be. Toolshop has no payment processor, so on a demo it's expected. Same for an address lookup that invents a street for a made-up postcode.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The eco discount "never applied". This one was our mistake.&lt;/strong&gt; The agent guessed the rule. Toolshop's code applies the 5% eco discount only when more than half the cart is rated A or B for CO₂, and the agent's test cart didn't qualify.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Design choices, not bugs:&lt;/strong&gt; a contact form that disappears after sending, an order confirmation that shows only the invoice number, category pages without the home page's price filter, and a rentals card the agent expected to show a price.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No longer reproduces:&lt;/strong&gt; the agent said an empty sign-up form showed 10 of its 12 errors. Today all 12 show.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;6 more need an account to check (a stale cart total, an HTTP 500 on registration, the payment step), so I've left them out rather than guess.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I took from it
&lt;/h2&gt;

&lt;p&gt;The agent was strongest where people are weakest: a rule written down in several places that drifts in one of them, and pages that break in states nobody visits on purpose, like an empty cart or a mistyped URL.&lt;/p&gt;

&lt;p&gt;It was weakest where it had to guess a business rule the site never states, or tell a demo's shortcuts from real bugs. Closing that gap is what we're working on next.&lt;/p&gt;

&lt;p&gt;If you want to try it on your own app, give &lt;a href="https://testoptim.com" rel="noopener noreferrer"&gt;TestOptim&lt;/a&gt; your staging URL. It explores the pages, maps the flows and business rules, writes and runs the tests, and sends each bug with screenshots, repro steps and a severity to Slack, Jira or GitHub.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Got a public app for next week's teardown?&lt;/strong&gt; Drop the URL in the comments.&lt;/p&gt;

</description>
      <category>testing</category>
      <category>qa</category>
      <category>playwright</category>
      <category>ai</category>
    </item>
    <item>
      <title>Quality Assurance - Web Testing</title>
      <dc:creator>Joy Odinaka</dc:creator>
      <pubDate>Thu, 05 Nov 2026 09:51:10 +0000</pubDate>
      <link>https://dev.to/dev-dinakajoy/quality-assurance-web-testing-39ng</link>
      <guid>https://dev.to/dev-dinakajoy/quality-assurance-web-testing-39ng</guid>
      <description>&lt;p&gt;I have learned how to test features, write test cases, execute tests, and report bugs.&lt;/p&gt;

&lt;p&gt;As a software developer transitioning into software testing, my next step is WebTesting.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What actually happens when I interact with a web application?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Say I click Login, search for a restaurant, or add food to my cart, what's happening behind the scenes?&lt;/p&gt;




&lt;h2&gt;
  
  
  1. How the Web Works
&lt;/h2&gt;

&lt;p&gt;A web application involves communication between a client and a server.&lt;/p&gt;

&lt;p&gt;A simplified flow looks like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;User
  ↓
Browser (Client)
  ↓
HTTP Request
  ↓
Web Server
  ↓
Database
  ↓
HTTP Response
  ↓
Browser displays the result
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For example, when I log in:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;I enter my email and password.&lt;/li&gt;
&lt;li&gt;The browser sends a request to the server.&lt;/li&gt;
&lt;li&gt;The server validates the credentials.&lt;/li&gt;
&lt;li&gt;The server responds with a result.&lt;/li&gt;
&lt;li&gt;The browser displays the appropriate response.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;As a tester, I need to understand what happens at each stage.&lt;/p&gt;




&lt;h2&gt;
  
  
  2. HTTP vs HTTPS
&lt;/h2&gt;

&lt;p&gt;HTTP and HTTPS are protocols used for communication between browsers and servers.&lt;/p&gt;

&lt;p&gt;The key difference?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;HTTPS encrypts communication using TLS&lt;/strong&gt;, helping protect sensitive information while it's being transmitted.&lt;/p&gt;

&lt;p&gt;For example, when testing a login page, I need to verify that the application uses HTTPS rather than sending login credentials over an insecure HTTP connection.&lt;/p&gt;




&lt;h2&gt;
  
  
  3. Chrome DevTools
&lt;/h2&gt;

&lt;p&gt;One of the most useful tools I am learning is &lt;strong&gt;Chrome DevTools&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;It helps testers investigate what's happening behind the user interface.&lt;/p&gt;

&lt;p&gt;Two important tabs:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Network Tab&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Helps me inspect:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;HTTP requests and responses&lt;/li&gt;
&lt;li&gt;API endpoints&lt;/li&gt;
&lt;li&gt;Status codes&lt;/li&gt;
&lt;li&gt;Request and response headers&lt;/li&gt;
&lt;li&gt;Response times&lt;/li&gt;
&lt;li&gt;Failed network requests&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Console Tab&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Helps me identify:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;JavaScript errors&lt;/li&gt;
&lt;li&gt;Warnings&lt;/li&gt;
&lt;li&gt;Runtime issues&lt;/li&gt;
&lt;li&gt;Other messages that may help investigate defects&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For example, if restaurant search returns an empty result, I can inspect the Network tab to see whether the request succeeded or failed.&lt;/p&gt;




&lt;h2&gt;
  
  
  4. Web UI Testing
&lt;/h2&gt;

&lt;p&gt;This is where I check what users actually interact with.&lt;/p&gt;

&lt;p&gt;Examples:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Are buttons working?&lt;/li&gt;
&lt;li&gt;Are input fields accepting the correct values?&lt;/li&gt;
&lt;li&gt;Are error messages displayed correctly?&lt;/li&gt;
&lt;li&gt;Are links navigating to the right pages?&lt;/li&gt;
&lt;li&gt;Does the layout work on mobile and desktop?&lt;/li&gt;
&lt;li&gt;Are images loading correctly?&lt;/li&gt;
&lt;li&gt;Are forms validating user input?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A page looking good doesn't guarantee it works correctly.&lt;/p&gt;

&lt;p&gt;Appearance and functionality both matter.&lt;/p&gt;




&lt;h2&gt;
  
  
  5. Cookies, Sessions, Local Storage and Cache
&lt;/h2&gt;

&lt;p&gt;These are important concepts because web applications often need to remember information.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Concept&lt;/th&gt;
&lt;th&gt;What it does&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Cookies&lt;/td&gt;
&lt;td&gt;Store small pieces of data in the browser&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Sessions&lt;/td&gt;
&lt;td&gt;Help maintain a user's interaction state&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Local Storage&lt;/td&gt;
&lt;td&gt;Stores data in the browser across sessions&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cache&lt;/td&gt;
&lt;td&gt;Stores resources to improve loading performance&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;For example, when I log into QuickBite, I expect my authenticated session to be maintained as I navigate between pages.&lt;/p&gt;

&lt;p&gt;Things I should test:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Does the user remain logged in after refreshing?&lt;/li&gt;
&lt;li&gt;Does logout properly end the session?&lt;/li&gt;
&lt;li&gt;What happens when a session expires?&lt;/li&gt;
&lt;li&gt;Is sensitive information stored insecurely?&lt;/li&gt;
&lt;li&gt;Does clearing browser data affect the application as expected?&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  6. What Should I Look Out for When Testing Web Applications?
&lt;/h2&gt;

&lt;p&gt;A web application should be tested beyond the working features.&lt;/p&gt;

&lt;p&gt;Some important areas include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Functionality:&lt;/strong&gt; Do features work as expected?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Usability:&lt;/strong&gt; Can users navigate the application easily?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Compatibility:&lt;/strong&gt; Does it work across different browsers and devices?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Reliability:&lt;/strong&gt; Does it behave consistently?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Performance:&lt;/strong&gt; Does it respond within acceptable times?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Security:&lt;/strong&gt; Are user data and application resources properly protected?&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  What I am Learning
&lt;/h2&gt;

&lt;p&gt;Web testing has made me realize that there's much more to an application than what appears on the screen.&lt;/p&gt;

&lt;p&gt;A button click can trigger a request, communicate with a server, interact with a database, and return a response.&lt;/p&gt;

&lt;p&gt;Understanding these interactions as a QA tester helps me investigate problems more effectively.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;You don't just plan to only test what you see. You also want to understand what's happening behind it.&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  What's Next?
&lt;/h2&gt;

&lt;p&gt;I am moving into &lt;strong&gt;API Testing&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;I'll be learning how to test the communication between applications and servers directly, without relying entirely on the user interface.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;I'm learning QA and I'm taking you with me.&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>qa</category>
      <category>testing</category>
      <category>webdev</category>
      <category>beginners</category>
    </item>
    <item>
      <title>AI Can Write Tests. But Are We Testing the Right Things?</title>
      <dc:creator>Rimon Nassory</dc:creator>
      <pubDate>Thu, 05 Nov 2026 08:19:00 +0000</pubDate>
      <link>https://dev.to/rimonnassory/ai-can-write-tests-but-are-we-testing-the-right-things-27mk</link>
      <guid>https://dev.to/rimonnassory/ai-can-write-tests-but-are-we-testing-the-right-things-27mk</guid>
      <description>&lt;p&gt;&lt;em&gt;AI is changing how we approach software testing. But generating more tests doesn't necessarily mean delivering better software.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  AI Is Making Test Automation Faster
&lt;/h2&gt;

&lt;p&gt;Over the past year, I've been exploring how AI can improve our QA processes, especially when working with Playwright and automated regression testing.&lt;/p&gt;

&lt;p&gt;And one thing is clear: AI can be incredibly helpful.&lt;/p&gt;

&lt;p&gt;It can generate test scenarios, write automation scripts, suggest edge cases, and help investigate failing tests.&lt;/p&gt;

&lt;p&gt;Tasks that previously took hours can sometimes be completed much faster.&lt;/p&gt;

&lt;p&gt;But I've started asking myself an important question:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Are we actually improving software quality, or are we just generating more tests?&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  More Tests Don't Always Mean Better Quality
&lt;/h2&gt;

&lt;p&gt;Imagine asking AI to generate tests for a new feature.&lt;/p&gt;

&lt;p&gt;It produces 20 automated tests. They all pass. CI is green.&lt;/p&gt;

&lt;p&gt;Looks great, right?&lt;/p&gt;

&lt;p&gt;But what if the requirements were incomplete?&lt;/p&gt;

&lt;p&gt;What if an important business rule was never discussed?&lt;/p&gt;

&lt;p&gt;Or what if the AI generated tests based on how the implementation works, rather than how it should work?&lt;/p&gt;

&lt;p&gt;You can end up with a perfectly green test suite that validates the wrong behavior.&lt;/p&gt;

&lt;p&gt;And that's where I believe QA becomes even more important.&lt;/p&gt;

&lt;h2&gt;
  
  
  QA Needs to Be Involved Earlier
&lt;/h2&gt;

&lt;p&gt;Traditionally, QA is often involved when a feature is ready for testing.&lt;/p&gt;

&lt;p&gt;But with AI accelerating development, waiting until the end becomes even more risky.&lt;/p&gt;

&lt;p&gt;If developers can generate working implementations faster, unclear requirements can become working code just as quickly.&lt;/p&gt;

&lt;p&gt;That's why I believe QA should be involved before development begins.&lt;/p&gt;

&lt;p&gt;We need to ask questions like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;What is the expected behavior?&lt;/li&gt;
&lt;li&gt;What could go wrong?&lt;/li&gt;
&lt;li&gt;Which edge cases are we missing?&lt;/li&gt;
&lt;li&gt;What are the risks?&lt;/li&gt;
&lt;li&gt;How do we know the feature is actually correct?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Once we understand these things, AI becomes much more powerful.&lt;/p&gt;

&lt;p&gt;Instead of asking AI to guess what needs testing, we can give it clear expectations and let it help us turn them into reliable automated tests.&lt;/p&gt;

&lt;h2&gt;
  
  
  AI Should Support QA, Not Replace Judgment
&lt;/h2&gt;

&lt;p&gt;I'm also interested in concepts such as LLM-as-a-Judge and self-healing tests.&lt;/p&gt;

&lt;p&gt;Both have exciting potential, but they introduce new questions.&lt;/p&gt;

&lt;p&gt;Should an AI automatically fix a failing test?&lt;/p&gt;

&lt;p&gt;How do we know it isn't hiding a real regression?&lt;/p&gt;

&lt;p&gt;And who verifies that an AI-generated test actually checks the correct behavior?&lt;/p&gt;

&lt;p&gt;I believe the answer is a combination of AI assistance, deterministic checks, and human judgment.&lt;/p&gt;

&lt;p&gt;AI can help us work faster, but we still need to understand what we're validating.&lt;/p&gt;

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

&lt;p&gt;I don't think the future of QA is about writing more automated tests.&lt;/p&gt;

&lt;p&gt;It's about finding better ways to prevent defects, identify risks earlier, and make sure we're building the right things.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;AI can help us test faster. QA must help us test smarter.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I'm curious how other teams are approaching this.&lt;/p&gt;

&lt;p&gt;Are you using AI mainly to generate more tests, or are you also changing how QA is involved in the development process?&lt;/p&gt;

</description>
      <category>ai</category>
      <category>automation</category>
      <category>testing</category>
      <category>qa</category>
    </item>
    <item>
      <title>Your LLM app regresses silently. Version-guard it before the next ship.</title>
      <dc:creator>LXSAIHUB</dc:creator>
      <pubDate>Thu, 05 Nov 2026 08:00:17 +0000</pubDate>
      <link>https://dev.to/lixingliangsy/your-llm-app-regresses-silently-version-guard-it-before-the-next-ship-3j23</link>
      <guid>https://dev.to/lixingliangsy/your-llm-app-regresses-silently-version-guard-it-before-the-next-ship-3j23</guid>
      <description>&lt;p&gt;LLM-powered features have a failure mode traditional software doesn't: they degrade without breaking. The output is still valid JSON, still 200 OK, just worse — and the regression hides until a user complains about something that "used to work."&lt;/p&gt;

&lt;p&gt;I built &lt;a href="https://testpilot-ai.lxsaihub.com" rel="noopener noreferrer"&gt;TestPilot&lt;/a&gt; because "it worked in testing" is the most common and least useful sentence in LLM QA.&lt;/p&gt;

&lt;h2&gt;
  
  
  30-second takeaway
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;LLM regressions don't throw errors — they drift, and drift is invisible to normal tests.&lt;/li&gt;
&lt;li&gt;The guard is an eval checklist tied to a version, run before every ship.&lt;/li&gt;
&lt;li&gt;Catching the drift at commit time beats catching it in a support ticket.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The regression nobody's watching
&lt;/h2&gt;

&lt;p&gt;A prompt change, a model swap, a system-message tweak — any of them can move behavior in a way unit tests never see. The app still runs. The answers just get softer, or wrong, or off-brand. By the time it's a pattern, it's shipped to everyone.&lt;/p&gt;

&lt;p&gt;An eval tied to the version turns that invisible drift into a visible diff you can block on, the way you'd block a failing unit test.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the tool does
&lt;/h2&gt;

&lt;p&gt;Paste a prompt and its expected behavior; get an eval checklist and a version regression guard. Built for dev and QA teams shipping LLM-powered features. Open it and try — no signup.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://testpilot-ai.lxsaihub.com" rel="noopener noreferrer"&gt;TestPilot&lt;/a&gt; runs in the browser, no account, no key.&lt;/p&gt;

&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;What is TestPilot?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A tool that turns a prompt and expected behavior into an eval checklist and a version regression guard for LLM apps. No account, no key.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Does it replace my test suite?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;No. It covers the behavior-drift your normal tests can't see. The two are teammates.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Will it call the model for me?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;It helps you define what to check; the runs are yours to wire into your pipeline.&lt;/p&gt;

&lt;h2&gt;
  
  
  Author's Process
&lt;/h2&gt;

&lt;p&gt;This product was built with AI coding tools. The design fight was against turning it into another agent — it stays a guard, not a chatbot.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>llm</category>
      <category>testing</category>
      <category>qa</category>
    </item>
    <item>
      <title>nexus recorder</title>
      <dc:creator>nexus studio</dc:creator>
      <pubDate>Thu, 05 Nov 2026 00:53:44 +0000</pubDate>
      <link>https://dev.to/nexus_studioqa/nexus-recorder-hi8</link>
      <guid>https://dev.to/nexus_studioqa/nexus-recorder-hi8</guid>
      <description>&lt;p&gt;Writing a test should not start with a blank file.&lt;/p&gt;

&lt;p&gt;Record what you do and Nexus Studio writes it as Playwright or Selenium code. No AI in the recorder. Or describe the test and your own AI drafts it, then seven checks without AI decide if it is safe to keep.&lt;/p&gt;

&lt;p&gt;Nexus Studio by Verdict System&lt;/p&gt;

</description>
      <category>automation</category>
      <category>testing</category>
      <category>qa</category>
    </item>
    <item>
      <title>How to Build a QA Process from Scratch When Developers Own All the Testing</title>
      <dc:creator>Mike Ralduxin</dc:creator>
      <pubDate>Wed, 04 Nov 2026 13:51:00 +0000</pubDate>
      <link>https://dev.to/deviqa-solutions/how-to-build-a-qa-process-from-scratch-when-developers-own-all-the-testing-21of</link>
      <guid>https://dev.to/deviqa-solutions/how-to-build-a-qa-process-from-scratch-when-developers-own-all-the-testing-21of</guid>
      <description>&lt;p&gt;Your first week as the first QA hire usually looks the same regardless of the company. The bug tracker has 400 open tickets and nobody can tell you which ones are still real. Releases ship when the developer who wrote the feature feels done. Someone shows you a folder of automated tests that nobody has run in months. And leadership expects you to "add QA" — by which they usually mean "start writing automated tests immediately."&lt;/p&gt;

&lt;p&gt;That last expectation is the one to push back on. After setting up QA functions from zero across dozens of engagements at DeviQA, the pattern I keep seeing is this: the first 90 days are mostly process archaeology and documentation, not test execution. Audit what exists, fix the bug tracker, write down what "working" means, then build smoke and regression suites and release gates. Automation comes last, because automation can only encode a process that already exists. Build it first and you encode the chaos.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Why developer-owned testing breaks down (and when it doesn't)&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;The failure mode is systemic, not a skills problem. Developers can test — they write unit tests, they check their own features. What's missing is ownership of the quality signal: nobody maintains the bug backlog, nobody defines what must pass before release, nobody tests the paths that cross feature boundaries.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.deviqa.com/case-studies/biznessapps/" rel="noopener noreferrer"&gt;BiznessApps&lt;/a&gt;, a DIY mobile-app platform for small businesses, is the cleanest example I've worked near. Before a QA function existed, developers were responsible for testing and executed it chaotically: the bug tracker was poorly set up with a messy board, bug reports were unstructured and uninformative, there was no test documentation, and releases were random, not preceded by thorough testing. The result was predictable — major and critical issues kept reaching production. None of that traces to bad developers. It traces to a testing process that no one owned.&lt;/p&gt;

&lt;p&gt;The honest caveat: pre-product-market-fit, developer-owned testing can be a rational trade-off. If the product may not exist in six months, a dedicated QA process is overhead. It stops being rational the moment production incidents start consuming more engineering time than a QA function would cost — and at the macro level that cost is enormous: CISQ estimated poor software quality cost the US economy &lt;a href="https://www.it-cisq.org/the-cost-of-poor-quality-software-in-the-us-a-2022-report/" rel="noopener noreferrer"&gt;$2.41 trillion&lt;/a&gt; in 2022 (an older figure, but the most comprehensive one available). If you're being hired as the first QA engineer, someone has already decided the trade-off flipped.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Days 0–30 — audit before you change anything&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;The instinct on day one is to start fixing. Resist it. You can't prioritize what you haven't inventoried, and the audit is what turns "everything is broken" into a ranked list.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;What a testing audit actually looks at&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Four things, in order of how much they'll shape your next 60 days:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;The release flow as it actually happens.&lt;/strong&gt; Not the documented one — the real one. Who decides a build ships? What gets checked, by whom, in what environment? At BiznessApps the answer was "releases were random," and knowing that early meant release criteria became a 60–90 day priority rather than an afterthought.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The bug backlog's signal-to-noise ratio.&lt;/strong&gt; Sample 50 tickets. How many are reproducible from the report alone? How many are already fixed, duplicated, or obsolete? The DeviQA team at BiznessApps began by retesting all legacy issues before changing anything else — tedious, but it's the only way to learn the product's actual state.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Environments.&lt;/strong&gt; Can you get a stable test environment that isn't production? Can you get test data? If not, that's a blocker to escalate in week one, not month three.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Existing automation.&lt;/strong&gt; Run whatever scripts exist and read what they assert. At &lt;a href="https://www.deviqa.com/case-studies/revenuehero/" rel="noopener noreferrer"&gt;RevenueHero&lt;/a&gt;, a lead-conversion platform, the audit found that the existing automation scripts were useless because they didn't check the required functionality. Green checkmarks, zero information. That's what automation built without a process underneath looks like — and it's why "just write tests" is the wrong day-one instruction.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;One warning from experience: timebox the audit to two or three weeks. An audit that runs longer becomes a deliverable in itself, and you were not hired to produce a report.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Fix the bug tracker before writing a single test case&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;This is the highest-return early win, and it's unglamorous. An unusable board hides the product's real state from everyone — you can't build a regression suite around bugs you can't trust, and you can't argue for release gates when nobody agrees on how many open criticals exist.&lt;/p&gt;

&lt;p&gt;The fix has three parts, all visible in the BiznessApps engagement: the Jira workflow was redesigned, obsolete entries were purged after retesting, and a bug-report template was introduced to formalize reporting — expected vs. actual behavior, reproduction steps, environment, severity. At &lt;a href="https://www.deviqa.com/case-studies/shops/" rel="noopener noreferrer"&gt;Shops&lt;/a&gt;, a digital-products platform where QA had previously been one engineer verifying tickets, optimizing the Jira setup was likewise part of moving to a real process. This matters more than it sounds: per the &lt;a href="https://www.practitest.com/assets/pdf/stot-2025.pdf" rel="noopener noreferrer"&gt;State of Testing 2025&lt;/a&gt; report, 77% of teams run their testing work through Jira, so the tracker effectively &lt;em&gt;is&lt;/em&gt; the quality database. A minimal template that works:&lt;/p&gt;

&lt;h2&gt;
  
  
  Summary
&lt;/h2&gt;

&lt;p&gt;One sentence: what is broken, where.&lt;/p&gt;

&lt;h2&gt;
  
  
  Environment
&lt;/h2&gt;

&lt;p&gt;App version / branch, browser or device, test account.&lt;/p&gt;

&lt;h2&gt;
  
  
  Steps to reproduce
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;...&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;...&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Expected / Actual
&lt;/h2&gt;

&lt;p&gt;Expected: ...&lt;/p&gt;

&lt;p&gt;Actual: ... (screenshot or log attached)&lt;/p&gt;

&lt;h2&gt;
  
  
  Severity
&lt;/h2&gt;

&lt;p&gt;Blocker / Critical / Major / Minor — per the agreed definitions, not gut feel.&lt;/p&gt;

&lt;p&gt;The trap here is political, not technical. The tracker is the developers' daily workflow, and redesigning it unilaterally breeds resistance that will follow you for a year. Propose the template, run it on your own reports for two weeks, show the difference in triage speed, then ask the team to adopt it.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Days 30–60 — test documentation and the first smoke suite&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;With a trusted tracker, write down what the product is supposed to do — starting from the critical paths, not from a coverage spreadsheet. Which flows, if broken, cost money or users within hours? Signup, checkout, the core workflow. Document those as structured test cases first; the smoke suite falls straight out of them.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.deviqa.com/case-studies/motion/" rel="noopener noreferrer"&gt;Motion&lt;/a&gt;, a workflow-management platform, is the reference point for what this phase realistically produces. The starting state was absolute zero: no documented test cases, no smoke or regression testing, no automation, no CI integration. One full-stack DeviQA engineer built 80 structured, reusable test cases plus regular smoke and regression testing — and the whole engagement, including the automation that came later, ran five months. That's the honest scale for a first quarter with one person: dozens of solid cases covering critical paths, not thousands.&lt;/p&gt;

&lt;p&gt;Don't chase full coverage on paper. &lt;a href="https://www.deviqa.com/case-studies/dental/" rel="noopener noreferrer"&gt;Arklign&lt;/a&gt;, a dental-tech case-management platform, also started from nothing — no test cases, no release process, no QA process at all — and eventually reached 5,000+ web and 2,000+ mobile test cases at 95% coverage. "Eventually" is doing heavy lifting in that sentence: the engagement started in 2016. Writing five thousand cases in month two produces a documentation graveyard; writing forty that people actually run produces a smoke suite.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Days 60–90 — regression suite and release criteria&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;The regression suite grows outward from the smoke suite: same structure, wider coverage, organized by feature area so it can be split across people and later across automation threads. At Shops, that meant 500+ test cases covering more than 75% of the platform's functionality, with regression executable in one working day and smoke in under an hour — by a team of two, built over two years.&lt;/p&gt;

&lt;p&gt;But the release criteria matter more than the suite's size. A regression suite answers "what do we check?"; release criteria answer "what must pass, and who signs off?" — and that second question is the one nobody has answered in a developer-owned setup. This is standard practice everywhere QA is established: &lt;a href="https://www.practitest.com/assets/pdf/stot-2025.pdf" rel="noopener noreferrer"&gt;86% of testing teams&lt;/a&gt; have a say in release readiness per the State of Testing 2025 survey. A workable first version fits on one page: smoke suite passes 100%, zero open blockers or criticals, regression executed on release candidates, named sign-off.&lt;/p&gt;

&lt;p&gt;BiznessApps shows where this leads. A clear release flow was established and QA joined the work on acceptance criteria; after the platform's rebuild, releases went out with zero major or critical production issues, support issues dropped by more than 50%, and testing surfaced over 1,700 issues including 300+ blockers along the way. Two honest qualifiers, though. That engagement ran six QA engineers over four years — your 90-day goal is a &lt;em&gt;gated&lt;/em&gt; release, not that end state. And the support-ticket drop can't be attributed to QA changes alone; a lot changed at once, including the rebuild itself.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;The automation roadmap is a 90-day output, not a day-one input&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;By day 90 you have what automation actually requires: documented critical paths, a smoke suite that's stable when run manually, and bug data showing where regressions cluster. The roadmap is now mechanical — automate the smoke suite first, then the regression cases with the highest execution frequency and the least UI churn.&lt;/p&gt;

&lt;p&gt;Run in this order, automation compounds fast. At Motion, the same five-month engagement that started with zero documentation ended with 75+ automated end-to-end tests in Playwright and TypeScript, structured with the Page Object Model, running nightly and pre-release through GitHub Actions, covering 90% of critical features — and 40+ bugs logged, 7 of them critical. The nightly cadence is the part worth copying on day one of automation, and it's a few lines of CI config:&lt;/p&gt;

&lt;h1&gt;
  
  
  .github/workflows/nightly-e2e.yml
&lt;/h1&gt;

&lt;p&gt;on:&lt;/p&gt;

&lt;p&gt;schedule:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;cron: "0 3 * * *" &amp;nbsp; # nightly, before the team's day starts&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;workflow_dispatch:&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; # and on demand before a release&lt;/p&gt;

&lt;p&gt;jobs:&lt;/p&gt;

&lt;p&gt;e2e:&lt;/p&gt;

&lt;p&gt;runs-on: ubuntu-latest&lt;/p&gt;

&lt;p&gt;steps:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;uses: actions/checkout@v4&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;run: npm ci &amp;amp;&amp;amp; npx playwright install --with-deps&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;run: npx playwright test --project=smoke&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;RevenueHero shows the same sequence at larger scale: after the useless legacy scripts were replaced with independent tests using API-driven data creation, the suite grew past 200 scripts and 70 API scenarios, coverage exceeded 90%, and full regression now runs in 1.5 hours. Arklign's automated smoke runs in 10 minutes across 900+ E2E and 100+ API tests, supporting 100+ web releases. One caution when you take these numbers into a planning meeting: they're ongoing-engagement figures — RevenueHero has been running since 2022, Arklign since 2016. They're the ceiling the first 90 days makes reachable, not a Q1 target.&lt;/p&gt;

&lt;p&gt;There's also a broader reason the sequencing question matters right now. GitLab's &lt;a href="https://ir.gitlab.com/news/news-details/2025/GitLab-Survey-Reveals-the-AI-Paradox-Faster-Coding-Creates-New-Bottlenecks-Requiring-Platform-Solutions/default.aspx" rel="noopener noreferrer"&gt;2025 Harris Poll survey&lt;/a&gt; of 3,266 DevSecOps professionals found teams losing about 7 hours per person per week to inefficient processes — automating on top of an inefficient process just executes the inefficiency faster.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;What this won't fix&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;A QA process makes the product's state visible and releases deliberate. It does not fix poor requirements — you'll surface ambiguity earlier, but someone still has to resolve it. It doesn't conjure test environments or test data where none exist. It doesn't replace headcount math: every case above had dedicated QA staffing, from one engineer at Motion to six at BiznessApps. And it doesn't mean developers stop testing — unit tests remain theirs; what moves to QA is ownership of the integrated quality signal. One more disclosure, since this article leans on them: the case evidence here comes from vendor case studies, including our own. They're real engagements with real numbers, but they're not controlled comparisons, and I've tried to flag the limits of each as they came up.&lt;/p&gt;

&lt;p&gt;Day 90, done right, looks modest on paper: a tracker the team trusts, documented critical paths, a smoke suite anyone can run, a gated release with named sign-off, and a ranked automation backlog. The 90%+ coverage and zero-critical-release numbers in the case studies above are multi-year outcomes. The first quarter doesn't deliver them — it's what makes them possible. Reach for this sequence when you're the first QA hire walking into developer-owned testing; skip the process-heavy version if the product is still searching for market fit and a failed release costs you nothing but a redeploy.&lt;/p&gt;

</description>
      <category>qa</category>
      <category>testing</category>
      <category>softwaretesting</category>
      <category>startup</category>
    </item>
  </channel>
</rss>
