Skip to content
Bugwise
Menu
Testing Fundamentals

Error Guessing and Checklists

How experienced testers predict where software breaks, the classic list of inputs and conditions to try, fault attacks, and how to build and maintain your own checklist next to systematic techniques.

beginner Mobile & web
Short on time? Switch to the quick version.

A smoothie bar app launches birthday rewards. The test cases are solid: valid dates, invalid dates, the first and last day of each month. Everything passes. Then the support inbox fills up with messages from members born on 29 February: three years in a row, no free smoothie. And members abroad get their “Happy birthday!” voucher at six in the evening, after they already paid.

No requirement mentioned leap days or time zones. An experienced tester would have tried both in the first five minutes, simply because dates break the same way in almost every app. That instinct has a name: error guessing.

What is error guessing?

Error guessingError guessingChoosing tests based on experience of typical mistakes developers make.Open in glossary → means choosing tests based on what you know about typical mistakes: the inputs, situations and timings that have broken software before. Instead of deriving tests from the spec, you ask: “Where do developers usually slip up in a feature like this?”

Error guessing is one of the experience-based techniquesExperience-based testingTest techniques that rely on the tester's knowledge of where software usually breaks.Open in glossary →, together with exploratory testing and checklist-based testing. They don’t replace systematic techniques like equivalence partitioning or boundary value analysis; they catch what those techniques can’t see, because nobody wrote it down.

The quick version

The classic things to try

AreaTryWhy it breaks
TextEmpty, spaces only, very longChecks count characters but forget to trim or limit
TextO'Neil, <b>, emoji 🏃‍♂️Special characters get escaped, rendered or cut in half
Numbers0, negative, 0.001, 1e3Code assumes “a normal positive amount”
Dates and time29 February, time zones, 23:59 → 00:00Calendars are full of exceptions
DuplicatesThe same item, name or request twiceCode assumes things are unique
InterruptionsLock the phone, a call, leave mid-actionHalf-finished work is rarely handled
PermissionsDeny camera, location, notificationsDevelopers test with everything allowed
NetworkSlow, flaky, lost mid-requestOffice Wi-Fi hides timeouts

Fault attacks: guessing with a plan

A fault attackFault attackA planned, systematic form of error guessing: list likely failures, then design tests to provoke each one.Open in glossary → is error guessing done systematically: start from a list of likely failures and design a test to provoke each one on purpose. “List upload failures → deny permission, kill the network mid-upload, pick a huge file.”

Your own checklist

Keep the list. Every bug that escapes to production, every bug a teammate finds, every weird input that broke something goes on it. Before testing a feature, scan the list and pick the items that fit. This turns personal experience into something a whole team (and a beginner) can use.

Where it fits

Use systematic techniques first, so the spec is covered and you can measure it. Then spend some time on error guessing for the bugs no spec mentions. The two together find far more than either alone.

Why error guessing works

Developers are smart, but they build features under time pressure, usually testing with “normal” data on a fast connection with every permission granted. The same blind spots appear again and again:

  • Assumptions about input: a name has letters, an amount is positive, a date exists every year.
  • Assumptions about the environment: the network is fast, the user said yes to permissions, the app stays in the foreground.
  • Assumptions about order: the user does step 1, then step 2, once, and doesn’t come back later.

Every one of these assumptions is a place to guess. And because the blind spots are so common, a short list of guesses finds a surprising number of real bugs.

The typical defect list, in detail

Text input

  • Empty: nothing at all. Does Save stay disabled? Is there a clear message?
  • Whitespace only: five spaces look empty to people but not to a character count. Leading and trailing spaces ("Mia ") break logins and comparisons.
  • Very long: a 500-character name, a pasted paragraph. Is it limited, or does it overflow layouts and databases?
  • Special characters: apostrophes (O'Neil), quotes, ampersands, slashes, < and >. They can be shown as O\'Neil, break searches, or reveal that input is treated as code (a hint of XSS or SQL injection).
  • Emoji and other scripts: many emoji are made of several characters joined together. Shortening text can cut them in half and leave a � box. Also try right-to-left text, like Arabic.
Dev note: Why emoji get cut in half

JavaScript and many other languages measure string length in UTF-16 code units. ”🏃‍♂️” is one visible symbol but several code units, so code like name.slice(0, 10) can split it. Correct handling counts grapheme clusters (for example with Intl.Segmenter).

Numbers and amounts

  • Zero: a €0 transfer, 0 items, 0 minutes. Often allowed by accident.
  • Negative: -50 in an amount field can make money flow the wrong way.
  • Decimals: too many (0.001), none where expected, and the user’s own format (1.250,50 in Germany means one thousand two hundred fifty euros and fifty cents).
  • Odd notation: 1e3, +5, ٣ (an Arabic-Indic digit). Generic parsers accept surprising things.
  • Huge values: 999999999, which may overflow or break the layout.
Dev note: Why 1e3 can turn into 1,000

Functions like JavaScript’s parseFloat and Number() accept scientific notation, so "1e3" becomes 1000. Forms that rely on them without a stricter pattern check accept input no user meant.

Dates and time

Duplicates

Do the same thing twice and see if the app assumes uniqueness: register with an email that already exists, add the same address twice, upload the same photo again, invite a friend who’s already a member. Sometimes duplicates should be allowed (two people named Sam), sometimes not. Either way, the app should behave on purpose.

Interrupted actions

Start something and don’t finish it normally: lock the phone halfway through an upload, take a call during payment, switch to your email app to copy a code, close the browser tab, lose the connection mid-request. Then come back. Is the action finished, safely canceled, or stuck in between? See interruptions.

Permissions denied

Developers almost always test with permissions granted. Deny the camera, photos, location, notifications or contacts, and also revoke a permission later in the system Settings. Does the app explain why it needs it and offer a way to Settings, or does it show a black screen? See app permissions.

Slow and flaky networks

Throttle the connection (Chrome DevTools presets “Fast 4G”, “Slow 4G” and “3G”, or the iOS Network Link Conditioner), switch from Wi-Fi to mobile data, or lose the signal in the middle. Look for misleading messages (“File too large” for a timeout), missing loading states and actions that never finish. See network conditions.

Fault attacks

A fault attackFault attackA planned, systematic form of error guessing: list likely failures, then design tests to provoke each one.Open in glossary → turns guessing into a method:

  1. Make a list of possible defects or failures for this kind of feature: from your experience, old bug reports, and published lists.
  2. For each item, design a test that would expose it if it existed. “Upload stops silently when interrupted” → lock the phone at 50%.
  3. Run the attacks, note what happened, and add new failure ideas to the list as you discover them.

The idea was popularized by James Whittaker’s book How to Break Software (2002), which describes “attacks” through the user interface (inputs, outputs, stored data, calculations) and through the system’s other interfaces, like the file system and the network. ISTQB describes fault attacks as a methodical approach to error guessing.

The difference from plain guessing is small but important: an attack list is written down, so it can be reviewed, shared and improved, and you can tell what you did and didn’t try.

Building and maintaining your own checklist

A checklist is the memory of error guessing. Here’s how to build a useful one.

  1. Start from a list like the one above. Group items by area: text, numbers, dates, actions, environment.
  2. Feed it with real bugs. Every bug that escaped to production, every bug found late, every “how did nobody try that?” moment becomes an item. Your team’s bug tracker is a gold mine: search for recurring causes.
  3. Write items as actions, not topics. “Paste a 500-character name” is better than “long input”.
  4. Add the platform. Mobile items (permissions, interruptions, background) and web items (Back button, refresh, two tabs) differ.
  5. Prune it. Remove items that never find anything any more (maybe a shared component now handles them), and merge duplicates. A 300-item list nobody reads helps no one.
  6. Share it. A team checklist turns one senior tester’s instincts into everyone’s starting point. Keep it next to your test cases and scenarios.

Public lists help too. The “Big List of Naughty Strings” on GitHub, for example, collects text inputs that have broken real software. Use such lists as inspiration, then keep only what fits your product.

How it complements systematic techniques

Systematic (EP, BVA, decision tables)Error guessing and checklists
Based onThe specExperience and past bugs
CoverageMeasurableHard to measure
FindsWrong behavior the spec describesBugs nobody thought to describe
WeaknessBlind to what the spec forgotDepends on the tester’s experience

A typical order: cover the spec systematically first, so you know the basics work and can report coverage. Then run a timeboxed error-guessing session, often as part of an exploratory session. Don’t skip the systematic part because guessing “feels” more productive: guessing alone leaves holes nobody can see.

Reporting bugs found by guessing

Developers sometimes push back: “Nobody would type 1e3.” Make the report about impact, not the trick:

  • Show a realistic user. “A customer in Germany types 1.250,50 and the app sends €1.25” is more convincing than “comma input not supported”.
  • Name the risk. Money moving the wrong way, data lost, a security hint (input rendered as HTML).
  • Give severity honestly. An emoji split in a leaderboard is minor. A negative transfer that increases the sender’s balance is critical.

See writing bug reports and severity vs priority.

Play: guess where it breaks

Four builds, each hiding a few bugs. You can only afford a handful of tests per round. Pick what your instincts say, run them, then read why each idea did or didn’t find something.

🎯 Guess where it breaks

Each build hides a few bugs. You only have time for a handful of tests: pick the ones you'd try first, then run them and see what your experience caught.

Fitness app · Profile

Spec: Display name

  • 1 to 30 characters.
  • Shown on the weekly leaderboard and in friend invites.

Test budget

0 / 5 picked

9 ideas, 5 tests of time

Pick at least one idea.

Example test cases

Error guessing ideas become normal test cases once you’ve written them down. Here are a few from the game.

TC-EG-01Display name with spaces only is rejected

Steps

  1. Open Edit profile
  2. Enter five spaces as the display name
  3. Tap Save

Expected result

Save stays disabled or shows "Enter a display name"; the old name is kept.

TC-EG-02Negative transfer amount is rejected

Preconditions

  • Logged in, balance €200.00

Steps

  1. Open Send money
  2. Enter -50 as the amount
  3. Tap Continue

Test data

amount: -50

Expected result

A clear message like "Enter an amount from €0.01 to €5,000"; nothing is sent; the balance stays €200.00.

TC-EG-03Camera permission denied shows a way forward

Preconditions

  • Camera permission denied for the app in system Settings

Steps

  1. Open Edit profile
  2. Tap Take photo

Expected result

A message explains that camera access is off, with a button that opens the app’s settings; no black screen.

TC-EG-04Birthday on 29 February gets a voucher in non-leap years

Preconditions

  • Member with birthday 29 February
  • Device date set to 28 February 2027, 08:59

Steps

  1. Wait until 9:00, or trigger the daily reward job in the test environment

Expected result

The voucher arrives on the date the team agreed for non-leap years (for example 28 February).

Tip: click a test case to expand it.

A starter checklist

Use this as the seed of your own list. Tick what you tried on the current feature.

Error guessing starter list

0 of 11 checked

Check your understanding

Quick quiz

0/6 answered · 0 correct

  1. 1.What is error guessing?

  2. 2.Which of these is NOT an experience-based technique?

  3. 3.What makes a fault attack different from casual error guessing?

  4. 4.Your checklist has 300 items and nobody reads it any more. What helps most?

  5. 5.Why shouldn't you rely on error guessing alone?

  6. 6.A developer says nobody would type 1.250,50 into an amount field. What is the strongest reply?

Key takeaways

  • Error guessing picks tests from experience of typical mistakes; it’s an experience-based technique, like exploratory and checklist-based testing.
  • The classic list: empty, whitespace, long, special characters and emoji, zero, negative, decimals, leap days, time zones, duplicates, interruptions, denied permissions, slow networks.
  • A fault attack is the methodical version: list likely failures, then design a test to provoke each one.
  • Keep your own checklist: feed it with real bugs, write actions, prune it, share it, and pick items by risk.
  • It complements systematic techniques: cover the spec measurably first, then guess where the spec is silent.
  • Report guessed bugs with a realistic user and impact, not as a trick.

Finished this page?Nice work, this page is complete!

Mark it as done to track your progress. It's saved in this browser, no account needed.

Its review cards are now in Bites ⚡
Esc

Type to search the whole site.