What is Software Testing?

Software testing is the process of evaluating an application to find out whether it behaves the way it's supposed to — and, just as importantly, to find the places where it doesn't. It is not the same thing as "using the app." Using an app means following the happy path: open RecipeBox, log in, add a recipe, done. Testing means deliberately trying the things a normal user wouldn't think to try — an empty title, a 10,000-character ingredient list, tapping "Save" twice quickly, losing network mid-upload — because those are exactly the situations where software tends to break.

A working definition: Testing is the process of executing a program (or reviewing an artifact, such as a requirements document) with the intent of finding defects, and of building confidence that the software does what its requirements say it should do, before real users find out otherwise.

Why Testing Exists: The Cost of a Bug

Every bug costs something to fix. What changes dramatically is how much it costs, depending on how late in the process it's discovered. This is one of the oldest, most repeated facts in software engineering, and it's the entire reason testing is a dedicated discipline rather than something squeezed in at the end.

Stage bug is foundExample in RecipeBoxRelative cost to fix
Requirements / design reviewA reviewer notices the "Add Recipe" spec never says what happens if prepMinutes is left blankLowest — it's a sentence added to a document
During developmentA developer notices while coding that calculateTotalTime() doesn't handle a null ingredients listLow — a quick code fix, no one outside the team ever saw it
During testing (pre-release)A tester finds that saving a recipe with a negative prepMinutes value is silently acceptedModerate — a fix, a re-test, a short delay to release
After release, found by usersUsers report that RecipeBox crashes when adding a recipe with a very long ingredient listHigh — a hotfix, an app store update, damaged trust, support tickets
Note: This is often called the "cost of change curve" — the same bug, the further right it's found on this table, the more expensive it is. Testing exists to catch bugs as far to the left as realistically possible.

Testing vs Quality Assurance vs Quality Control

These three terms get used loosely, but they mean different things:

TermWhat it means
Quality Assurance (QA)The broad set of activities aimed at preventing defects — good processes, reviews, standards. Applies to the whole development process.
Quality Control (QC)Detecting defects that already exist in a built product — this is where testing lives.
TestingThe specific activity of executing software (or reviewing an artifact) to find defects — one part of QC.

In everyday conversation, "QA" and "testing" get used interchangeably, and that's fine for this track — but it's worth knowing the more precise distinction exists.

Who Does Testing?

On different teams, testing responsibility is split differently:

RoleWhat they typically test
DevelopersTheir own code, usually with unit tests — does calculateTotalTime() return the right sum for a given list of steps?
Dedicated QA / testersThe application as a whole, from a user's point of view — does the "Add Recipe" screen work correctly end to end, including edge cases the developer didn't think of?
Product owners / business analystsWhether the finished feature actually satisfies the original business requirement (this overlaps with User Acceptance Testing, covered later in this track)
Real users (beta testers)Real-world usage patterns no test plan predicted
Why both matter: A developer testing their own code tends to test that it works the way they expect it to. A dedicated tester has no attachment to how the code was written — they test whether it works the way the user expects, which is a genuinely different and valuable perspective.

A Day in the Life: Testing RecipeBox

To make this concrete, here's a realistic (simplified) morning for a tester assigned to RecipeBox's new "Add Recipe" feature:

  1. 9:00 — Read the requirement: "Add Recipe" screen should let a user enter a title, ingredients, steps, an optional photo, a category, and a prep time in minutes, then save it to the recipe list.
  2. 9:15 — Write a handful of test cases before touching the app: valid recipe, missing title, missing ingredients, prep time of 0, prep time negative, extremely long title, no photo attached.
  3. 9:45 — Execute those test cases on the actual build, screen by screen, recording pass/fail for each.
  4. 10:30 — Find a bug: saving a recipe with an empty title still adds a blank entry to the recipe list instead of showing a validation error.
  5. 10:40 — Log the bug with clear steps to reproduce, expected result, actual result, and a screenshot (the exact structure covered later in Writing a Good Bug Report).
  6. 11:00 — Move on to exploratory testing: no script, just poking at the screen the way a curious/impatient real user might, to catch anything the written test cases missed.

Notice what didn't happen: the tester didn't read RecipeBox's source code, and didn't just "click around randomly." Testing is a planned activity with a goal — find defects before the user does — executed methodically, even though it also leaves room for open-ended exploration.

Next up: Now that you know what testing is and why it matters, SDLC vs STLC shows exactly where testing fits into the bigger picture of how software gets built.