Skip to content
All posts
January 10, 20264 min read

Exploratory Testing: The Skill No One Teaches

Exploratory testing is the most powerful testing technique most QA engineers never formally learn. Here's what it actually is, how to do it well, and why it finds bugs that scripted testing misses.

TestingBest Practices
Share:

Scripted testing finds the bugs you expected. Exploratory testing finds the ones you didn't.

Most QA training focuses on test cases, test plans, and automation. Exploratory testing — the practice of learning and testing simultaneously, guided by curiosity and domain knowledge — is rarely taught formally. Which is odd, because it's where the most interesting bugs live.


What Exploratory Testing Actually Is

Exploratory testing is simultaneous test design and execution. You don't write a script upfront — you form hypotheses, execute them, observe results, and let what you find guide your next step.

It's not random clicking. It's structured investigation.

Scripted testing: Follow step 1, 2, 3. Assert expected result. Done.

Exploratory testing: "The payment flow accepts promo codes. What happens if I apply a promo to an order that's already at the minimum order value? What if I apply two promos? What if I apply a promo after adding an item that makes the promo invalid?"


Why It Finds Bugs Scripts Miss

Scripts test what you thought to test. Exploratory testing tests what you didn't think to test — but discovered while investigating.

Real example: testing a flight booking feature. Scripted tests cover search, select, checkout, confirm. Exploratory session discovers: if you search, open a flight in a new tab, modify the original search, then return to the first tab and try to book — the price shown is outdated but the booking uses the new price. A race condition in state management that nobody scripted for.

This kind of bug lives at the intersection of features, states, and user behaviors. Scripts can't anticipate every intersection. Curious humans can.


Session-Based Exploratory Testing

Unstructured exploration produces inconsistent results. The best practice is session-based testing: time-boxed, chartered, documented.

A session has three parts:

1. Charter — the goal and scope:

code
Mission: Explore the checkout flow for a logged-in user with saved payment methods
Time: 60 minutes
Focus: State management, error recovery, edge cases in saved payment handling

2. Execution — the exploration itself, with notes:

code
- Tested with 3 saved cards: works as expected
- Tested with expired saved card: shows error, but error message doesn't explain why
- Deleted a saved card mid-checkout (in another tab): checkout continued but showed deleted card
  → Bug found: cart doesn't re-validate payment methods on checkout confirmation
- Tested with network disconnect at payment confirmation: spinner appears, never resolves
  → Bug found: no timeout handling on payment confirmation

3. Debrief — what you found, what you covered, what you didn't:

code
Bugs: 2 (payment re-validation, timeout handling)
Areas not covered: guest checkout with saved payment, mobile payment methods
Recommendation: Additional session needed for mobile payment paths

Heuristics That Guide Exploration

Experienced explorers use mental models to guide where to look:

CRUD: Create, Read, Update, Delete. For every data entity, test all four operations. The bugs often live in the transitions between them.

Boundaries: What's the minimum? The maximum? One over the maximum? Zero? Negative?

Interruptions: What if the user stops halfway? What if the network drops? What if the app goes to background?

Combinations: Two features used at once. Two users affecting the same data. Two tabs open simultaneously.

Personas: A first-time user. A user with no data. A user with maximum data. A user who does things out of order.

[!TIP] Keep a personal list of heuristics that have found you bugs in the past. Every experienced tester has a mental model they've built up from real bugs. Write it down. It becomes your most valuable testing tool.


What Makes a Good Exploratory Tester

Curiosity. The instinct to ask "what if?" rather than accepting that the happy path works.

Domain knowledge. Knowing the product well enough to know where the risky areas are and what edge cases matter.

Note-taking discipline. Exploration without documentation produces bugs you can't reproduce. Write down what you did, what you found, and what you didn't cover.

Time management. Without a charter and time box, exploration expands to fill all available time without systematic coverage.

Exploratory testing is a skill. Like any skill, it improves with deliberate practice. The engineers who are best at it have usually internalized hundreds of "what happens if I do this?" moments across many products.

Start with a 60-minute chartered session. Write down what you plan to explore, take notes as you go, and review what you found. That discipline is the foundation of everything else.

Share:
S

Sudarshan Chaudhari

AI Systems Builder / Product Engineer

Bangkok, Thailand

Solo Android developer with 13+ years in QA, building Android apps, AI automation systems, and developer tools at SudarshanTechLabs.

Stay updated

Get new posts on Android, Kotlin, and solo dev straight to your inbox.

Newsletter preferences

Building something? Available for Android dev and QA consulting.

Work with me

Comments — powered by Giscus