Rapid vs. Hyper-Rapid Testing

I teach a rapid software testing class.

When I say “Rapid Testing” I mean the fastest test process that is still good enough for a given project. It’s testing with a sense of urgency. Many testing classes don’t focus on rapidity. Does that mean they advocate “slow testing?” No, my competitors generally teach what they consider to be techniques of thorough testing. Often this takes the form of a list of techniques, taught one after another, leaving it to the student to figure out how to fit all those techniques into the project. But those techniques take a long time to follow if each one is followed to its natural conclusion, so “thorough” becomes extremely non-rapid.

Rapid testing is not a technique, but an overarching process of understanding the context of a test project and maximizing the value of our time. One part of that process is to cut out anything that isn’t necessary. Another part is to reconceive testing as a process of heuristic inquiry, rather than a clerical task.

Rapid testing is a complete testing process. By definition, any test project can be rapid and also successful, because rapid testing is as thorough as it needs to be. In other words, when I say rapid, I do *not* mean reckless. Another term for rapid testing might be “good testing”, but that term doesn’t highlight the very real difference between my approach and others (such as the fact that my approach is faster), so I’ll keep saying rapid for now.

A tactic used in rapid testing is a family of test heuristics that I call hyper-rapid testing. Hyper-rapid testing consists of those test ideas that can be employed for low cost, with no preparation, and no deep knowledge of the technology or problem domain. Unlike rapid testing, hyper-rapid testing is not a complete test process. But with hyper-rapid testing, I can walk up to any product and find problems in it immediately. I like to demonstrate hyper-rapid test techniques when I give testing talks just because they are the sort of things that can be demonstrated in only a few minutes.

James Whittaker and Alan Jorgensen were the first I know to publish a cohesive model of hyper-rapid test ideas. However, they didn’t distinguish between hyper-rapid testing and the rest of the testing picture. Instead they presented their ideas as if that as all there is to testing. I think that’s caused unnecessary resistance to them. Partly inspired by Whittaker and Jorgensen, here are some examples of hyper-rapid test heuristics I use, each sketched in brief:

  • Input Constraint Attacks: Discover sources of input and attempt to violate constraints on that input. For instance, use a geometrically expanding string in a field. Keep doubling its length until the product crashes. Use special characters. Inject noise of any kind into a system and see what happens. I found an ugly error in the British Museum’s main computer system by search for a string that had alternating asterisks and quotation marks.
  • Variability Tour: Tour a product looking for anything that is variable and vary it. Vary it as far as possible, in every dimension possible. Exploring variations is part of the basic structure of my testing when I first encounter a product.
  • Sample Data Tour: Employ any sample data you can, and all that you can. The more complex the better.
  • Continuous Use: While testing, do not reset the system. Leave windows and files open. Let disk and memory usage mount. You’re hoping that the system ties itself in knots.
  • Interruptions: Start activities and stop them in the middle. Stop them at awkward times. Perform stoppages using cancel buttons, O/S level interrupts (ctrl-alt-delete or task manager), arrange for other programs to interrupt (such as screensavers or virus checkers). Maybe the system will not properly reset itself. Also try suspending an activity and returning later.
  • Undermining: Start using a function when the system is in an appropriate state, then change the state part way through (for instance, delete a file while it is being edited, eject a disk, pull net cables or power cords) to an innappropriate state. This is similar to interruption, except you are expecting the function to interrupt itself by detecting that it no longer can proceed safely.
  • Shoe Test: This is any test consistent with placing a shoe on the keyboard. Basically, it means using auto-repeat on the keyboard for a very cheap stress test. Look for dialog boxes so constructed that pressing a key leads to, say, another dialog box (perhaps an error message) that also has a button connected to the same key that returns to the first dialog box. That way you can place a shoe (or Coke can, as I often do, but sweeping off a cowboy boot has a certain drama to it) on the keyboard and walk away. Let the test run for an hour.
  • Error Message Hangover: Make error messages happen and test hard after they are dismissed. Often develop handle errors poorly. I once broke into a public kiosk by right clicking rapidly after an error occurred. It turned out that the security code left a 1/5 second window of opportunity for me to access a special menu and take over the system.
  • Click Like Crazy: Testing is more than “banging on the keyboard”, but that phrase wasn’t coined for nothing. Try banging on the keyboard. Try clicking everywhere. I broke into a touchscreen system once by poking every square centimeter of every screen until I found a secret button.
  • Multiple Instances: Run a lot of instances of the app at the same time. Open the same files.
  • Feature Interactions: Discover where individual functions interact or share data. Look for any interdependencies. Tour them. Stress them. I once crashed an app by loading up all the fields in a form to their maximums and then traversing to the report generator.
  • Cheap Tools Activate! Learn how to use InCtrl5, Filemon, Regmon, AppVerifier, Perfmon, Task Manager (all of which are free). Have these tools on a thumb drive and carry it around. Also, carry a digital camera. I now carry a tiny 3 megapixel camera and a tiny video camera. Both fit into my coat pockets. I use them to record screen shots and product behaviors.
  • Resource Starvation: Progressively lower memory and other resources until the product collapses, or gracefully (we hope) degrades.
  • Play “Writer Sez”: Look in the online help or user manual and find some instructions about how to perform some interesting activity. Do those actions. Then improvise from them. Often writers are hurried as they write down steps, or the software changes after they write the manual.

There are other aspects to hyper-rapid testing that belong more to the realm of skill, and are hard to summarize as a nice self-contained heuristic. More on that later.

I like to demonstrate hyper-rapid testing in classes and talks because it’s dramatic and convenient. They’re pretty much the only kind of test activities that I can demonstrate in brief. Just don’t confuse that with the full breadth and depth of the rapid testing process.

4 Responses to “Rapid vs. Hyper-Rapid Testing”

  1. Surya Says:

    Hi, I’m a developer trying to decide whether to be a full-time tester or not. Like u i am getting tired of this long cycle of production coding. Ur website/articles gave me a lot of insight into the world of testing. Thanks.
    Now I’m going to apply the above steps to these fields to check if I can crash this page!
    hehe Thanks a lot,
    Surya

  2. Joaquin Bolaños Vargas Says:

    Right now, sometimes our applications have errors in production time that we couldn’t get because of for example the programmer forgot to replicated the new code into another module. However the black box testing didn’t catch that error. So i have the doubt about when it is strictly necessary to do White Box Testing…

  3. Aaron Hodder Says:

    Four years is a long time to leave a comment after a post, but I have to say that this is the most concise guide to exploratory testing I have ever seen. If I ever get stuck or run out of inspiration for what to do next, I search for this article, and find it kick starts the creative juices again.

    Thanks James

    [James' Reply: Thanks, but be careful. This is not a description of exploratory testing. This is a description of an approach to testing that may or may not be exploratory, but usually is very exploratory. I now call this kind of testing "quick-testing" as in "I'm going to do some quick-tests now." We can imagine highly scripted quick-tests, too. When people confuse quick-testing with exploratory testing, they miss out on all the slow, careful, and deep forms of exploratory testing.]

  4. Dan Meservy Says:

    Like Aaron, I feel a little behind the times on commenting on this blog post. I was hired as a software tester in November, and have been scouring the web for good resources. Most of the books I’ve read thus far on testing are rather vague (as some say the actual art of testing is). I’ve discovered this site where I can now get a certain level of knowledge, then tweak it to fit my personal situation. Thanks, James, for a concise example of how to hit a program quick and hard. I can see these heuristics being applied to interview questions, etc. Thank you!

Leave a Reply

Comments are moderated. You might want to read my commenting policy before you make a comment...