Manual regression testing is a filing problem

The repetition in a manual regression pass is its cheap half. The hours go into re-reporting each finding from scratch, and into the ones filed twice.

Six glass loops recede across black, with one opened loop glowing orange

Testers describe a manual regression pass as boring, and the complaint points at the wrong cost. Repeating a check somebody has run nine times before is cheap. The expensive part starts when one of those checks fails: the walk back to the tracker, the report rebuilt from memory, and the ones that come back irreproducible.

The repetition is the cheap half of a regression pass

Watch the clock on two passes over the same regression checklist. The pass that finds nothing finishes roughly when somebody predicted it would. The pass that finds six things does not, and those six checks were no slower to run than the ones that passed. Everything that overran happened after the failure, in a different window, in a form.

That is the shape the tedium argument misses. Boredom scales with the length of the checklist, which a team already knows and plans around. Effort scales with the number of findings, which nobody plans around, because the pass is budgeted as though its output were a tick in a column. A build that breaks in several places costs a tester time no estimate contained.

Most of the advice written for this problem is about the checklist: prune it, risk-weight it, run the highest-value cases first. Our own QA checklist asks the regression group for something stricter and different, that the suite ran against this build and that each of its failures was triaged as a real defect or a test defect. Neither kind of advice touches the part that overran.

Automation took the checks and the evidence with them

The standard answer to all of this is to automate the pass, and half of that answer is right. A check that runs every release, must never be skipped, and can be expressed as a script belongs in the pipeline rather than in somebody’s afternoon.

What survives that programme is a residue, and the residue is defined by resisting the exact property automation needs. Rendering that looks wrong rather than being wrong, a flow through a third-party checkout nobody can drive, a journey costing more to script than to walk, and the exploratory circling around the scripted path where a tester notices the thing no case was written for. A team can automate for years and still hold a pass shaped like that.

Now compare what each half produces at the moment it finds something. A failing automated case writes its own report: the assertion, the artifacts the runner captured, the build it ran against, and the environment it ran in, all attached without anybody being asked for them. A person spotting the same defect on the same page produces a memory and a sentence.

The instrumentation went where the checks went, and the pass that resisted scripting was left holding the weakest evidence in the release process.

A finding written from memory gets filed twice

A regression finding is harder to write than a fresh bug report, and the reason is specific: the tester knows the behaviour used to work, and does not know when it stopped. The one piece of information that would narrow the search is the piece memory does not hold.

Around that sits the round trip, and each of its steps takes something away from the pass that made it.

Step in the round tripWhat the pass loses to it
Leaving the page for the trackerThe state that produced the defect, which the next navigation overwrites
Re-describing what just happenedThe detail nobody wrote down while they were still looking at it
Reconstructing build, browser and viewportAccuracy, because those get answered from habit rather than from the tab
Attaching a screenshot taken afterwardsThe seconds before it, which is where the cause is
Returning to the checklistThe place in it, and the hunch about what had already looked odd

Every entry in the right-hand column is evidence that existed on the page and does not exist in the ticket, and the last one is what turns a single pass into several. Steps to reproduce written under those conditions are a reconstruction rather than a record.

Then the ticket comes back. A finding written from memory closes as irreproducible, which is the failure UAT best practices end where the finding starts follows from the engineer’s side. What a regression pass adds is the second turn: the check fails again next release, gets written up from memory again, and the second report is no better sourced than the first, because nothing about the pass changed.

A pass that files in place stays one pass

The alternative is to file without leaving the page under test. A review session puts the tester on the site they are testing, with a picker: point at the element that is wrong, and the ticket is written against that element.

What makes that work over a long pass is what happens after the send, which is where a filing gesture usually costs a sweep its momentum.

What a sweep needs from a filing gestureWhat the session does
The finding named against the thing itselfStores the picked element as a sanitized DOM selection: the selector, the strategy that produced it and a confidence in it, the tag, its role and accessible name, and the rectangle it filled in a stated viewport
Confirmation, without a decision to makeShows the ticket’s stage, type, priority and id, then takes itself down after four seconds
Nothing to dismissPuts no target on the card at all, because it floats over a picker that is already armed for the next element
A page left cleanRemoves the card, the ring and the pin together, so a long pass does not cover the page in marks that describe finished work
The next finding, straight awayRe-arms the picker behind the card
A ticket in the normal pipelineFiles into Received, on the same board and with the same evidence as every other report

The middle rows are the ones a pass feels. A confirmation somebody has to close is a decision, and a decision taken at the rate a regression pass files at becomes a chore of its own, so the card reads itself out and goes. The card takes no pointer events at all, so the countdown runs out wherever the reviewer’s pointer happens to be: a hover that held it open would hold it open forever, because a pointer mid-pass crosses the page constantly, hunting for the next element.

Six findings on one screen then cost one sweep rather than six departures, and the checklist never loses its place. The review mode page carries the rest of the mechanics, including who is allowed to open a session.

The pass that survives automation is the one nobody instruments

The tooling followed the work that was easy to describe. Test runners, reporters, artifacts on failure, retries with traces attached: all of it grew around the checks that could be written as scripts. The pass left over, the one that exists precisely because its checks resisted being written down, was handed a spreadsheet and a browser tab pointed at a tracker.

That is the gap worth closing before the next argument about which cases to automate. A manual pass whose findings arrive carrying the state they were found in stops producing the second filing, and the second filing is where the hours went.

Three of the constraints above are ours to impose, and a release calendar has to absorb them. Review sessions are a Pro capability, and each one stays valid for eight hours, so a pass spread across a two-day release window is opened again on the second morning. Letting somebody outside the team open a session is off until a project turns it on, and it then only works from a domain that project has registered. A regression backlog that lives in Jira keeps living there; what arrives from a pass is a ticket carrying the evidence it was found with, not a replacement for the system of record.

Common questions

Is manual regression testing still necessary when the suite is automated?

Automation covers the checks that can be written down and run headlessly. What stays manual is the residue: rendering that looks wrong rather than being wrong, flows that cost more to script than to run, and the exploratory pass around the scripted one. That residue does not shrink to nothing.

Why do manual regression findings come back as irreproducible?

Because the report was written after the tester left the page, from memory, without the console errors, the failed requests, the exact browser build or the sequence that led there. What reaches an engineer is a description of a defect, which is a different artifact from a record of one.

What should a manual regression finding carry when it is filed?

The check that failed, what it used to do, and the conditions around it: the build under test, the browser and its version, the viewport, the route, and the console and network activity from the seconds before. Most of that has to come from the page rather than from the tester.

How do you stop a manual regression pass from being interrupted by filing?

By filing without leaving the page under test. A review session lets somebody point at the element that is wrong and file against it, and the picker re-arms behind the send, so a pass over a page becomes one sweep rather than a departure per finding.

What is the difference between manual regression testing and smoke testing?

A smoke test decides whether a build is stable enough to be worth testing at all, and it is short enough that nobody skips it. A manual regression pass assumes that decision was already made and goes looking for behaviour that used to work and quietly stopped.

The Notarus team

The people who build Notarus. We write up the decisions behind the product when the reasoning is worth more than the changelog line.

Keep reading

Reports with the evidence attached.

Start free, one script tag.

<script src="…/widget.js" data-key="pb_pub_…">