The single most useful mental switch a new tester can learn is the difference between user thinking and tester thinking. Most of us start as users — we open an app, do the thing we came to do, and close it. Testing demands a second mode that runs alongside that one, asking "but what could go wrong here?" at every step. A great tester runs both modes at once and knows when to lean on which.
The user perspective
A user has a goal. They want to book a flight, transfer £200 to their landlord, find a recipe for tonight's dinner. Their attention is on the outcome. They follow the most obvious path, type the most obvious values, and judge the experience by whether the goal completes quickly and without confusion.
User thinking is essential. A tester who never thinks like a user misses the kinds of bugs that are technically correct but practically broken — confusing labels, hidden buttons, error messages written by engineers for engineers, flows that take eight clicks when two would do. If you cannot describe what the user is trying to accomplish, your tests will pass while the product fails.
The tester perspective
A tester also has a goal — but theirs is the inverse. They want to find what could go wrong. Where the user types the obvious value, the tester types the unusual one. Where the user follows the happy path, the tester deliberately steps off it. Tester thinking treats the application as a system with seams, and looks for where the seams might split.
A useful nickname for this mode is the curious destructor. Not destructive in a malicious sense — destructive in the sense of "what if I push on this corner of the design until something gives?" The point is not chaos; it is systematic exploration of the things that could fail. That structure is what separates testing from random clicking.
The same screen, two minds
A booking form: user vs tester thinking
User thinking
I want to book an appointment for next Tuesday at 10am.
Goal-oriented — the user has a concrete outcome in mind.
Pick the date, pick the time, hit confirm.
Following the most obvious happy path.
Did I get a confirmation email? Yes. Done.
Done = the visible outcome happened.
If something looks off, try one workaround, then give up.
Frustration tolerance is short — users move on.
Tester thinking
What if I pick a date in the past? A date 10 years from now? February 30th?
Probing input boundaries deliberately.
What if I change my browser timezone after booking — does the slot move?
Looking for environmental dependencies.
Two tabs, two simultaneous bookings of the same slot — who wins?
Probing for race conditions and concurrency.
Confirmation email arrives — but says 'undefined' for the time. What happened?
Verifying not just *that* it worked, but *what* it actually contains.
Same booking form. Same five minutes. The user gets a flight booked. The tester finds three bugs the user would have hit eventually — and files them before any customer sees them.
Why you need both modes
Pure user thinking misses the rare-but-painful bugs that only happen in unusual conditions. Pure tester thinking can miss the common-but-painful bugs that come from bad UX, slow flows, and confusing copy. A great tester switches between the two on purpose:
- User mode for the first pass of any new feature — does it actually solve the problem? Is it pleasant? Does the language make sense to a non-engineer?
- Tester mode for everything else — what happens at the edges, in error states, with stale data, on slow networks, with permissions the developer forgot about?
Many teams formalise the user mode through usability testing or product walkthroughs, while tester mode is captured in test cases, test plans, and exploratory testing sessions.
A practical example: a healthcare booking form
Consider a new feature that lets a patient book a clinic appointment.
A user opens the form, picks "tomorrow at 9am," confirms, sees a success message, and closes the tab. The feature works.
A tester asks:
- What if the patient picks a date in the past — does the form block it cleanly, or does it accept the booking and create a ghost record in the database?
- What if the patient picks 23:59 in their local timezone, but the clinic uses a different timezone — which day's slot do they actually book?
- What happens when two patients try to book the same slot at the same time? Does one quietly overwrite the other?
- The clinician marks themselves unavailable for that day after the booking is made. Does the patient get an email? Or do they show up to a closed clinic?
- The patient enters a phone number with a
+44prefix and spaces — does the form still validate it, or only accept digits? - Pressing the browser back button after booking — does it create a duplicate booking, or land the patient back where they expect?
None of those questions occur to a user. All of them are exactly the questions a manual tester is paid to ask. The structured way to generate questions like this on demand is covered in chapter 3, on advanced test design techniques.
⚠️ Common mistakes
- Living in only one mode. Testers who never think like a user file bugs that are technically valid but waste developer time ("the URL accepts a 5MB cookie" — does any real user ever do that?). Testers who never think like a tester ship features that look fine and fail in production.
- Confusing "I tried it and it worked" with "I tested it." Going through the happy path once is user thinking. Real testing has not started until you start asking "what if?"
- Apologising for awkward questions. New testers sometimes hold back the harder edge cases because they feel they are being difficult. Those are exactly the questions that catch the bugs nobody else will. Ask them — kindly, but ask them.
🎯 Practice task
Pick a feature in any app you use regularly — a flight search, a money transfer, a video upload. Spend 20 minutes producing two side-by-side lists in a notebook or document:
- User mode list (5 minutes). Write down the steps a real user would take to complete the goal, in plain language. No edge cases, no "what ifs" — just the happy path.
- Tester mode list (15 minutes). For each step on the user-mode list, write down at least two "what if?" questions a curious destructor would ask. Aim for 15+ questions total. Tag each one with what it is probing — input validation, timezone, concurrency, error handling, permissions, network failure, and so on.
Compare the two lists. The first one is what the team built; the second is the surface area where bugs are likely to live. Save your tester-mode list — over time you will start to recognise the same patterns across different features, which is exactly the intuition lesson 4 explores.