Rapid Software Testing: Skills Over Process

Rapid Software Testing: Skills Over Process

Most testing methodologies start from the same assumption: if you define the right process and follow it correctly, good testing will result. Rapid Software Testing starts from a different assumption: process without skill produces low-quality testing regardless of how rigorously it's followed. Get the skills right first. Let the process serve the skills.

James Bach and Michael Bolton developed RST over decades of consulting work, and the framework has accumulated a substantial following among testers who found that their formal training in test process wasn't giving them the tools to find important bugs. This post covers what RST actually proposes, how its heuristics function as practical tools, and what it means to apply RST on a real team.

The Core Claim

RST's central claim is that testing is a performance — a skilled human activity that cannot be reduced to procedure execution. A tester executing a procedure is not testing; they're checking. Testing requires judgment: deciding what to test, how to interpret what you observe, and how to communicate findings in ways that lead to action.

This isn't semantic hairsplitting. The distinction between checking and testing has real consequences for how you staff testing work, what you train testers to do, and how you evaluate whether testing is effective.

A checker can be replaced by a machine. Automated tests are automated checks — they verify that specified conditions hold. Automated checking is valuable because it's fast, consistent, and cheap at scale. But it can only check what was specified in advance. It cannot notice something unexpected and pursue it. It cannot recognize that a behavior is wrong in context even if it meets the specification. It cannot say "this feels off — let me investigate."

Testing, in the RST sense, is everything automation can't do. It's the investigation that precedes writing the check. It's the judgment that evaluates whether the checks are sufficient. It's the curiosity that finds the bugs that nobody thought to specify.

The RST Skill Stack

RST identifies several categories of testing skill that competent testers need to develop. These aren't tools or techniques — they're capabilities.

Domain knowledge. You can't test what you don't understand. A tester who doesn't understand how the product is used, by whom, and for what purpose will miss bugs that matter and report bugs that don't. Domain knowledge means understanding the business context, the user population, the regulatory environment, and the technical constraints.

Testing knowledge. The craft of testing: heuristics for finding bugs, techniques for test design, strategies for coverage, methods for managing sessions. This is the technical core of RST.

Social skills. Testing is communication. A bug that isn't communicated clearly enough to be understood and fixed isn't a bug that's been found — it's a bug that's been observed and lost. RST emphasizes that testers need to be effective writers and communicators, not just effective investigators.

Technical skills. Understanding of the systems under test: programming, networking, databases, operating systems, browsers, APIs. Technical depth allows testers to create more effective tests, reproduce bugs more precisely, and communicate with developers at a level of detail that's actionable.

Critical thinking. The meta-skill. Evaluating claims, questioning assumptions, reasoning under uncertainty, recognizing cognitive biases in your own analysis. Critical thinking is what separates a tester who gets fooled by the software from one who doesn't.

RST treats these skills as learnable and trainable. The curriculum James Bach has developed around RST is focused on developing these skills directly, rather than teaching testers to follow procedures that, if followed correctly, are supposed to produce skill outcomes.

Heuristics as Tools, Not Checklists

Heuristics are a central concept in RST. A heuristic is a fallible method for solving a problem or making a decision — it's a rule of thumb, not an algorithm. Heuristics are useful precisely because they don't require exhaustive analysis. You apply a heuristic quickly, get a useful result most of the time, and recognize when the heuristic has misled you.

RST treats testing heuristics as cognitive tools: mental models and patterns that help you think about what to test and how.

The Goldilocks heuristic. For any input boundary, test just below, at, and just above the boundary. The first test that fails often isn't at the exact boundary — it's just over it. This heuristic focuses your attention on the neighborhood of boundaries rather than just the boundary itself.

The Reverse heuristic. After testing the forward path (create, read), test the reverse (delete, undo). After testing creation under normal conditions, test creation followed by immediate deletion. After testing happy-path sign-in, test sign-in immediately after sign-out. Reversals expose state management bugs.

The Zero/One/Many heuristic. Test with zero, one, and many of any collection. Zero items in a cart, one item, many items. Zero permissions granted, one permission, all permissions. The transitions between zero and one, and between one and many, are where bugs concentrate.

SFDIPOT (Structure, Function, Data, Interface, Platform, Operations, Time) — a coverage heuristic that prompts you to consider multiple dimensions of a feature's behavior. When you're unsure what to test next, walk through the SFDIPOT categories and ask whether each dimension has been adequately explored.

HICCUPPS — a consistency heuristic. Software should be consistent with its History (previous behavior), Image (marketing claims), Claims (documentation), Customer expectations, User expectations, comparable Products, Purpose (intended use), and Standards. When observed behavior deviates from any of these, you have a potential bug.

The key word is "potential." Heuristics guide investigation; they don't render verdicts. An inconsistency with marketing claims might be a bug, a known deviation, or an outdated marketing claim. The heuristic tells you to investigate. Your judgment tells you what the finding means.

The Sapient Testing Approach

RST uses the term "sapient testing" to distinguish human judgment-based testing from automated checking. Sapient means "wise" or "intelligent" — sapient testing is testing that engages the tester's intelligence and judgment rather than their ability to follow instructions.

Sapient testing in practice means:

Testing the interesting cases, not just the specified cases. A specification defines what the product is supposed to do. Interesting cases are cases that reveal something about what the product actually does — including things the spec doesn't address. The most valuable test cases often aren't in any specification.

Following threads. When something unexpected happens during testing, sapient testers pursue it. They don't mark it as a pass or fail and move to the next test case. They ask: why did this happen? What else might be affected? Is this the tip of an iceberg?

Testing the test. Before trusting a test result, ask: could this test be wrong? Could it be testing the wrong thing? Could it be passing for the wrong reasons? A test that passes because the feature works and a test that passes because the test is checking something trivial look identical in a test report. Sapient testing distinguishes between them.

Reading the product, not just the spec. The software under test provides information that the spec doesn't. How the UI behaves, what error messages say, how performance feels, what happens at edge cases — all of this is information about the actual product. Sapient testers use this information to find bugs that no spec would have led them to.

RST on Coverage

RST takes a specific position on test coverage that differs from the standard coverage-as-percentage approach.

The RST position: coverage is a map of what you've tested, not a measure of quality. 100% line coverage tells you that every line was executed at least once. It tells you nothing about whether the behavior at those lines was correct, whether the interactions between lines were correct, or whether the cases that matter were covered.

Coverage in the RST sense is multidimensional. You need to consider:

  • Functional coverage: Have the major features and functions been exercised?
  • Data coverage: Have the important data inputs, boundaries, and combinations been tested?
  • Platform coverage: Has the software been tested on the platforms where it will actually run?
  • Operations coverage: Has the software been tested under the conditions where it will actually operate — under load, over time, with concurrent users?
  • Interface coverage: Have all entry and exit points been tested?

No single metric captures all of these. The RST approach is to maintain a coverage model — a description of what has been tested and what hasn't — rather than a coverage score.

The coverage model is honest about gaps. "We have tested the happy path for checkout completely. We have partially tested error handling. We have not tested checkout under concurrent load or with unusual payment methods." This is more useful than "87% line coverage" because it names what's actually known and unknown.

Testing Oracles

An oracle is the mechanism by which you determine whether a test result is correct. This sounds obvious until you think carefully about it: how do you know that the output of a function is correct?

The naive answer is "compare it to the spec." But specifications are incomplete. They don't cover every input combination. They're sometimes wrong. They can be ambiguous. If your only oracle is the spec, you'll miss bugs that the spec doesn't address.

RST identifies several categories of oracles:

Documented oracle. The spec, requirements, user documentation. Explicit statements about expected behavior.

User expectation oracle. What users would reasonably expect. A field labeled "Phone Number" should accept phone number formats. This isn't necessarily in the spec, but users will be confused if it doesn't.

Comparable product oracle. How competing or analogous products behave. If every spreadsheet application freezes when you press Enter in a cell, and yours doesn't, that's unexpected behavior worth noting.

Historical oracle. How the product behaved in previous versions. If a feature worked one way in version 2.0 and works differently in version 3.0 without any stated intent to change it, that's a regression candidate.

Expert oracle. Domain expertise. A billing system that applies a 30-day billing cycle should produce a specific output for a given input — someone who understands billing can verify this without a spec.

Heuristic oracle. Consistency rules. The UI should respond consistently to similar inputs. Error messages should be consistent in style and format. Date formatting should be consistent across the application.

Using multiple oracles simultaneously makes testing more powerful. A feature might pass against the spec oracle but fail against the user expectation oracle. Both findings are valuable.

Where RST Fits in a Modern Team

RST is sometimes criticized as being hostile to automation and structured process. This is a misreading. RST doesn't oppose automation — it opposes the confusion of automation with testing.

In a modern CI/CD team, RST fits alongside automation as the human intelligence layer:

Automated tests (continuous checking): fast, consistent verification that specified behavior holds after each code change. This is essential and RST supports it fully.

RST-informed exploratory testing (sapient investigation): sessions where skilled testers investigate questions that automation can't answer — new features before their automation is written, complex interaction patterns, performance characteristics, usability issues, security concerns.

RST-informed test review: evaluating whether the automated test suite is testing the right things, whether the coverage model is adequate, whether heuristics suggest gaps in the current suite.

RST-informed release assessment: before shipping, applying judgment to the totality of testing evidence. "The automated tests pass. The exploratory sessions found three bugs, all fixed. The coverage model shows we haven't tested concurrent checkout under load. Given the risk level, is this ship-worthy?" That judgment call is not something automation makes. It's something skilled testers make using the RST skill stack.

Learning RST

RST is learned through practice, not through reading. The conceptual framework can be understood quickly. Developing the underlying skills takes years.

Practical starting points:

Take the RST course. James Bach and Michael Bolton run public workshops. The hands-on instruction is substantially more valuable than reading about RST because the heuristics only make sense when applied to real software.

Practice testing with a debrief protocol. After every exploratory session, ask: what heuristics did I apply? What oracles did I use? What did I decide to skip and why? What would I do differently? Structured reflection accelerates skill development.

Read and discuss test cases. Look at bug reports — good ones and bad ones. What makes a good bug report? What information is missing from a bad one? This develops the communication skills that RST emphasizes.

Study the existing RST literature. James Bach's blog (satisfice.com) and the RST companion materials contain detailed worked examples of heuristic application, oracle discussion, and coverage modeling.

Practice pair testing. Testing alongside a more experienced tester, or vice versa, is the fastest way to see RST skills in action and develop your own.

The ROI on RST skills is high. The bugs that automation misses, that formal test cases don't specify, that conformance testing doesn't probe — those are the bugs that cause production incidents, customer escalations, and security vulnerabilities. The testers who find those bugs are using judgment and skill, whether they call it RST or not. RST gives that judgment and skill a name, a framework for development, and a vocabulary for discussing it.

Read more

Start now free