Error guessing and exploratory testing are functional test techniques based on the test engineer’s knowledge, experience, and intuition. The skill in error guessing and exploratory testing is to derive a comprehensive set of tests without missing areas, and without generating redundant tests.

Error guessing and exploratory testing are typically viewed as unstructured approaches to software testing. Some people argue that error guessing is not a valid testing technique; however, highly successful testers are very effective at quickly evaluating a program and running an attack that exposes defects.

Error guessing is usually most productive in falsification type testing, but when coupled with exploratory testing these techniques can be used to design a set of tests that will uncover errors and successfully validate the product works as expected.

Exploratory testing is extremely useful when we are faced with software that is untested, unknown, or unstable. But after the product is more stable and settled, we would like to have a way to ease into a less labor-intensive, hopefully automated, mode of testing. Exploratory testing ventures into the product while it is still in great flux and not yet ready for automation. According to IEEE, exploratory testing is the most widely practiced testing technique. Tests are derived relying on tester skill and intuition, and on the tester's experience with similar programs. More systematic approaches are advised. Exploratory testing might be useful (but only if the tester is really an expert) to identify special tests not easily captured by formalized methods.

The fact is that every tester does exploratory testing. For example:

When the tester first gets the product, with or without a specification, and tries out the features to see how they work, and then tries to do something “real” with the product to develop an appreciation of its design, this is exploratory testing.

When a tester finds a bug, she troubleshoots it a bit, both to find a simple set of reproduction conditions and to determine whether a variant of these conditions will yield a more serious failure. This is classic exploration. The tester decides what to do next based on what she’s learned so far.

When the programmer reports that the bug has been fixed, the tester runs the original failure-revealing test to see if the fix has taken. But the skilled tester also varies the regression test to see whether the fix was general enough and whether it had a side effect that broke some other part of the program. This is exploratory testing.