What Is Software Testing?

Software testing is a set of activities that find defects and evaluate the quality of software and of related work products such as requirements, designs and code. The ISTQB glossary defines testing as the process within the software development lifecycle that evaluates the quality of a component or system and related work products. Whatever you are testing, a user story, an API or a whole application, is called the test object.

Testing is more than running the software. For a new "reset password" feature, the tester first reads the user story and asks what should happen when a reset link has already been used. Only then are tests designed, run on the test build and reported. That first step ran no software, and it was testing too.

Why it matters

How a team defines testing decides when it starts and what it delivers. If testing means only executing the software, it starts when a build is ready and misses the defects that are cheapest to remove, those in requirements, designs and code. If testing and debugging are blurred, fixes get closed without anyone checking that they work.

For you as a tester, the definition draws the edges of the job. The test objectives tell you why a test exists and what your report must answer. The line between testing and debugging tells you where your work hands over to a developer, and which tests you owe the team when the fix comes back.

Test objectives: why a test exists

A test objective is the reason for testing. The ISTQB Foundation syllabus (CTFL v4.0) lists the typical objectives below. Which ones matter depends on the context: the work product, the test level (such as testing single components or the whole system), the risks, the development lifecycle and business factors such as time to market. For example, in component (unit) testing, where developers test one part of the code on its own, triggering failures and finding defects early usually comes first; in acceptance testing, building confidence and informing the release decision.

  • Evaluating work products such as requirements, user stories, designs and code.
  • Triggering failures and finding defects.
  • Ensuring the required coverage of a test object, for example at least one test for every acceptance criterion.
  • Reducing the level of risk of inadequate software quality.
  • Verifying whether specified requirements have been fulfilled.
  • Verifying that the test object complies with contractual, legal and regulatory requirements.
  • Providing information to stakeholders so that they can make informed decisions.
  • Building confidence in the quality of the test object.
  • Validating whether the test object is complete and works as stakeholders expect.

Try it: Requirements → Test Cases

Static and dynamic testing

You met both forms in the lesson on verification and validation. Dynamic testing executes the software. Static testing examines a work product without executing it, through reviews, where people read and discuss it, or static analysis, where tools check it against rules. ISTQB counts both as testing.

What differs is what each one finds. Dynamic testing triggers failures, which must then be traced back to their defects. Static testing finds the defect itself, often with its exact location, and can examine work products that never run, such as requirements and test plans. Neither replaces the other: a review cannot measure how fast a page loads, and an ambiguous requirement is far easier to spot by reading it than by running tests.

  • Review: reading the story "Approved expenses appear in the monthly report" and asking "approved by whom, and which date decides the month: submission or approval?" before any code exists.
  • Static analysis: a tool flags an SQL statement with an unbalanced parenthesis before anyone runs it.
  • Dynamic test: running the monthly report with known data and comparing its total with the expected one.

Try it: SQL Query Validator Try it: JSON Validator

Testing is not debugging

Testing and debugging are separate activities. Testing shows that something is wrong; debugging finds the cause and removes it. When a dynamic test fails, debugging usually takes three steps: reproduce the failure, diagnose its cause and fix it. When static testing finds a defect, there is nothing to reproduce or diagnose, because the defect is already in view, so debugging is just the fix.

After the fix, testing takes over again. Confirmation testing, also called re-testing, checks that the fix solved the original problem, usually by running the failed test again with the same data; the syllabus prefers that the person who ran the original test does it. Regression testing then checks that the change has not caused failures elsewhere.

Worked example: a wrong total in an expense report

Requirement: "The monthly report shows the total of all expenses approved in that month." Huda, a tester, runs test case TC-REP-014 on build 2.7 with three expenses approved in September 2026. The expected total is 235.75 SAR; the report shows 195.75. That difference is a failure.

Huda reports it with the build, the data and both totals; she does not need to know which line of code is wrong. Omar, the developer, does the debugging: he reproduces the failure, finds a date filter that ends at the start of 30 September and so leaves out the last day of the month, and fixes it.

An expense report shows 195.75 instead of 235.75: testing finds the failure, debugging reproduces it, diagnoses the defect and fixes it, testing confirms the fix, and a review could have found the same defect directly.
  1. Dynamic testing: a test run reveals a failure

    TC-REP-014 on build 2.7, three expenses approved in September 2026

    1. 1Run the testExpected total: 235.75Testing
    2. 2Observe the failureThe report leaves out one expensetotal 195.75TestingFail
    3. 3Report the defectBuild, data, expected and actual total; no guess at the causeTesting
    4. 4ReproduceSame data on build 2.7: the same wrong totalDebugging
    5. 5DiagnoseThe date filter stops at the start of 30 Septemberapproved_at < '2026-09-30'Debugging
    6. 6FixDelivered in build 2.8approved_at < '2026-10-01'Debugging
    7. 7Confirmation testTC-REP-014 again on build 2.8, same datatotal 235.75TestingPass
    8. 8Regression testsQuarterly report, CSV export, a 31-day monthTestingPass
  2. Static testing: a review finds the defect itself

    The same defect, before the report ever runs

    1. 9Review the queryCode review: nothing is executedTesting
    2. 10Find the defectIts exact location is already knownapproved_at < '2026-09-30'Testing
    3. 11FixNo reproduction, no diagnosisapproved_at < '2026-10-01'Debugging

Each card is tagged testing or debugging. On the static route there is nothing to reproduce or diagnose, so debugging is only the fix.

  • Confirmation test: TC-REP-014 on build 2.8 with the same data gives 235.75, so the defect can be closed.
  • Regression tests: the quarterly report and the CSV export, which use the same filter, and a 31-day month all give correct totals.
  • The static route: a reviewer reading the query before it ever ran could have spotted the end date directly, with no reproduction and no diagnosis.
Text version
TC-REP-014  Monthly report total equals the sum of approved expenses
Build 2.7   Expenses approved in September 2026:
            12 Sep  120.50  |  21 Sep  75.25  |  30 Sep 16:40  40.00
Expected    Total 235.75
Actual      Total 195.75                                     FAILED

Debugging (Omar, developer)
  Reproduce   Same data on build 2.7: total 195.75
  Diagnose    Filter: approved_at < '2026-09-30'  (30 Sep is left out)
  Fix         Filter: approved_at < '2026-10-01'  -> build 2.8

Confirmation  TC-REP-014 on build 2.8, same data: total 235.75    PASSED
Regression    Quarterly report, CSV export, 31-day month           PASSED

Try it: Regression Scenario Generator

Common mistakes

  • Thinking testing starts only when there is a build to run, and skipping reviews of requirements, designs and code.
  • Testing without an agreed objective, so nobody knows whether "done" means requirements verified, risks covered or enough confidence to release.
  • Guessing the cause in a defect report ("the SQL is wrong") instead of describing the failure: steps, data, expected and actual result.
  • Closing a defect because the developer marked it fixed, without running the confirmation test with the original data.
  • Running only the confirmation test after a fix and skipping regression tests of the areas the change could affect.

The QA perspective

On a working team you test from the moment a work product exists: you review stories before they enter a sprint, then design and run tests when builds arrive. Before a test cycle, ask the product owner or test lead which objectives matter most for this release; that decides what you test first and what your report must answer.

When a test fails, make debugging fast rather than doing it yourself: record the build, environment, data, steps, expected and actual results, and attach a screenshot or log. When the fix arrives, run the confirmation test with the same data, ask the developer what else the change touches to choose regression tests, and record both results on the defect.

Practice exercise

Separate testing from debugging in a defect thread

Your task

The material is a defect thread from a food delivery app, from the first report to the fix. Separate the testing from the debugging, then plan the testing that must follow the fix.

Material
BUG-311  Order confirmation e-mail shows the wrong delivery date
Rule: delivery date = order date + 2 days. Store: Riyadh (UTC+3).

Mon 09:10  Sara (tester): Ran TC-ORD-21 on build 5.3. Order placed on 6 Oct at
           01:30 Riyadh time. Expected "Delivery: 8 Oct"; the e-mail says
           "Delivery: 7 Oct". Orders placed at 10:00 show the right date.
           Screenshot and order number attached.
Mon 11:30  Omar (developer): Reproduced on my machine with an order at 01:30.
Mon 13:05  Omar: Cause found. The e-mail service takes the order date in UTC,
           where 01:30 on 6 Oct in Riyadh is still 5 Oct.
Mon 13:20  Omar: Fixed in build 5.4; the date now uses the store time zone.
           Status: ready for testing.
Steps
  1. Label each entry as testing or debugging; for each debugging entry, name the step: reproduce, diagnose or fix.
  2. Write the confirmation test for build 5.4: who runs it, with which data and which expected result.
  3. List at least two regression tests for the change to the date calculation.
  4. Name one static test that could have found this defect before any code ran.
  5. Name the test objectives that the run of TC-ORD-21 served.
Show the model answer
Model answer

Testing: the 09:10 entry, where Sara ran TC-ORD-21, observed the failure and reported it with the build, data, expected and actual result. Debugging: 11:30 is reproduce, 13:05 diagnose and 13:20 fix. "Ready for testing" hands the work back to testing.

Confirmation test: preferably Sara, who ran the original test, runs TC-ORD-21 on build 5.4 with the same order, placed on 6 October at 01:30 Riyadh time, and expects "Delivery: 8 Oct". If it passes, the defect can be closed.

Regression tests: an order at 10:00; orders just before and just after 03:00 Riyadh time, which is midnight UTC; orders just before and just after midnight Riyadh time, where the store's day now changes; an order at 01:30 on the last day of a month; and any other place that shows the delivery date, such as an order history page.

Static test: a review of the requirement asking "in which time zone is the delivery date calculated?", or a code review of the date calculation, which would have shown that it uses UTC.

Objectives: triggering failures and finding defects; verifying a specified requirement, the delivery date shown to the customer; reducing the risk of customers receiving wrong dates; and giving stakeholders information. The confirmation and regression tests then build confidence in the fix.

Frequently asked questions

Is debugging part of a tester's job?

Not as a rule. Testing and debugging are separate activities, and on most teams developers debug. A tester helps by narrowing down the conditions of a failure (which data, which browser, which build) and reporting them precisely. Some testers who read code also help with diagnosis; that work is still debugging, not testing.

Is a code review really testing?

Yes, in ISTQB terms. Reviews and static analysis are static testing: they evaluate a work product without executing it. They find defects directly, often earlier and with less rework than dynamic testing, and they are the only way to test work products that never run, such as requirements.

What is the difference between confirmation testing and regression testing?

Confirmation testing checks that a fix solved the original problem, usually by running the failed tests again, sometimes with new tests for the change. Regression testing checks that the change has not broken anything that worked before. After a fix you normally need both.

Do all projects have the same test objectives?

No. The syllabus lists typical objectives, and the ones that matter depend on the context: the work product, the test level, the risks, the lifecycle and business factors such as time to market. A payment feature in a regulated market puts compliance and risk first; an early prototype may mainly need fast information for stakeholders.

References

Practise with Mutqan tools

Convert a list of numbered requirements into traceable test cases with a requirement-to-test matrix.

Test Design

Check SQL statements for syntax problems, unbalanced parentheses, unterminated strings and risky patterns.

Database

Validate JSON syntax and get precise error locations with helpful fix suggestions.

JSON & Data

Convert a date and time between timezones (Riyadh, Amman, Delhi, UTC, New York, London…).

Utilities

Go deeper

Your progress on this topic

Part of the QA Roadmap