QA · Read 8 min

What software testing really is: the guide that separates signal from noise

Testing is not clicking around until something breaks. It is designing experiments that answer one concrete question: does this do what we promised? Here is the full map, no filler.

There is a false picture of testing that just won't die: someone opens the app, clicks around everywhere and waits for something to blow up. If nothing blows up, "it's tested". That idea is comfortable, and it's a lie. Testing is not waiting for the accident. It is designing an experiment that answers one concrete, verifiable question: does this software do what we promised it would?

Software testing is the set of activities that compare a system's actual behavior against its expected behavior, so you find the gap before your users do. That's the short definition. Everything else is the map of how to do it well, and why most teams do it backwards.

A test that could never fail isn't testing anything: it's just confirming what you already believed.

01 · the questionWhat a test really is

A test has three parts, though we almost never name them. An input: the state and data it starts from. An action: what you run. And the one everyone forgets, an oracle: the rule that decides whether the result was correct. With no oracle there is no test, only a demonstration.

The oracle is the heart of the matter. When someone says "I already tested it and it works", the right question is: works compared to what? If you can't answer that, you didn't test, you just looked. The ISTQB syllabus carefully distinguishes between an error (the human mistake), a defect (the problem left in the code) and a failure (the visible symptom when the defect runs). Testing well is hunting defects before they turn into failures in front of a customer.

And here is a truth Dijkstra wrote down half a century ago: testing can show the presence of defects, never their absence. No suite guarantees the software is free of errors; what it gives you is evidence. The goal is not absolute certainty, which does not exist, but reducing risk to a level you can defend.

The bias that ruins your tests

The natural temptation is to write tests that confirm everything is fine. It's called confirmation bias and it's poison for a tester. A good test is designed to fail if the software is broken. If you write a case thinking "this one surely passes", it probably isn't worth much. Think like someone who wants to break the system, not like someone who wants to sign off on it.

02 · the levelsWhere you test: from the brick to the building

You don't test everything in the same place or in the same way. Testing is organized into levels, according to the size of what you are verifying. Understanding them prevents the most expensive mistake of all: testing the wrong piece with the wrong tool.

At the base are unit tests: they verify a single function or class in isolation, without its neighbors. They are cheap, fast and very specific. A step higher, integration tests check that two or more pieces talk to each other properly, which is exactly where the real defects tend to hide. At the top, end to end tests walk through a complete flow the way a user would, from the first click to the final result.

Figura 1 · los niveles y su costo
End to end Integration Unit few, slow, expensive many, fast, cheap
The shape is not arbitrary: the higher you go, the more expensive and fragile each case becomes. That is why it pays to have many fast tests at the bottom and few slow ones at the top. That balance has a name, and we develop it in the article on the testing pyramid.

The rule of thumb: the higher you climb, the more realistic the test, but also the slower and more fragile it is. A healthy suite has many tests at the bottom and few at the top. The sick one, the one you see in so many teams, has the hourglass inverted: hundreds of slow end to end tests and almost no unit tests.

03 · the typesWhat you test: not everything is "does it work"

The levels answer where. The types answer which quality you are measuring. And this is where a lot of people fall short, because they think testing is only checking that the button does what it says.

The first great divide is between functional and non functional tests. The functional ones ask "does it do the right thing?": if I submit the form, does the record get saved? The non functional ones ask "does it do it well enough?": does it respond fast, hold up under load, stay secure, work without a manual? The ISO/IEC 25010 standard puts a name to these qualities and lists eight product characteristics, among them performance efficiency, security, reliability and usability. It is not academic decoration: it is the list of everything that can be right or wrong beyond "it works".

From there whole families of specialized tests emerge. Performance tests measure what happens under load and stress. Regression tests watch that a new change doesn't break what already worked. Smoke tests run a quick check that the essentials start up, before you invest time in deep testing.

"It works" is the answer to a single question. Quality is decided in the other seven.

04 · the styleHow you test: script versus exploration

There is a healthy tension between two ways of testing. The first is scripted: cases written in advance, with steps and an expected result, that run the same way every time. They are ideal for automation and for regression, because they don't depend on who runs them.

The second is exploratory testing: the tester learns, designs and runs all at once, following their nose toward wherever the system smells off. They don't replace the script, they complement it. The script finds what you knew to look for; exploration finds what never even occurred to you. A team that only automates goes blind to the unexpected, which is precisely where the worst defects live.

Figura 2 · dos ejes para ubicar cualquier prueba
Functional Non functional Scripted Exploratory Unit regression Load performance Exploratory of a flow Usability manual security
Almost any test lands somewhere along these two axes. A mature test plan does not live in a single corner: it spreads effort across the four quadrants according to the risk of each part of the system.

05 · the limitHow much to test: the hundred percent trap

The question every team asks sooner or later is how much is enough. The honest answer is uncomfortable: testing everything is impossible. The number of states, inputs and possible paths of almost any real program is so large that exhausting them would take longer than the product's lifetime. That is why exhaustive testing is a myth, not a goal.

What you can do is test with intelligence. You prioritize by risk: where a failure would hurt most, which parts change most often, which paths customers use most. A defect in billing does not weigh the same as one in the color of an icon. Risk based testing accepts that resources are finite and invests them where they yield the most.

It also helps to understand that defects cluster: a minority of the modules concentrates the majority of the defects. If an area has already given you trouble, it will probably keep doing so, and that is where it pays to dig. Testing is not fair to the code: it is ruthless with risk. And beware the pesticide paradox: if you always run the same tests, they stop finding new defects, just as a repeated insecticide stops killing resistant insects. A test that has been green for a year is not always good news: sometimes it just stopped looking where the problem now lives.

06 · the closeHow to start without drowning

If you are just getting started, don't build the whole edifice on day one. Begin with what reduces the most risk for the least effort: a few unit tests over the logic that scares you most, a handful of smoke tests that confirm the essentials come up, and manual exploration for the new and fragile flows.

What cannot be missing, from the very first test, is the oracle: the clear rule for what counts as correct. Everything else (the levels, the types, the automation) is architecture built on top of that foundation. Without it, no matter how many tests you have, you are not testing: you are decorating.

Testing, properly understood, is not a toll you pay before shipping. It is the cheapest way to learn the truth about your software while it is still cheap to change: moving the discovery of the defect as close as possible to when you wrote it, and as far as possible from when a customer suffers it.

Fuentes

  1. International Software Testing Qualifications Board (ISTQB). Certified Tester Foundation Level Syllabus, v4.0 (2023). Defines terms, testing principles (including defect clustering and the pesticide paradox) and test levels/types. istqb.org.
  2. ISO/IEC 25010:2023. Systems and software engineering. Systems and software Quality Requirements and Evaluation (SQuaRE). Product quality model. International Organization for Standardization. Model of the quality characteristics of a software product. iso.org/standard/78176.html.
  3. Dijkstra, E. W. (1970). Notes on Structured Programming (EWD249). Origin of the maxim "testing can show the presence of defects, never their absence".
  4. Myers, G. J., Sandler, C. & Badgett, T. (2011). The Art of Software Testing, 3rd ed. John Wiley & Sons. Classic treatment of test case design and of testing as a process that is destructive by design.

Learn more about AI

See all Learn AI