Manual Test Execution

Manual test execution means running a test case yourself: performing its steps with the stated data, observing what the system does, comparing that actual result with the expected result written in the test case, and recording the outcome. In the ISTQB Foundation syllabus v4.0, test execution covers running tests according to the execution schedule, comparing actual with expected results, logging the results and analysing anomalies: anything that deviates from what was expected.

For example, a test case says: apply the expired promo code OLD5 and expect the message "This code has expired" with the subtotal unchanged at 240.00 SAR. Executing it means checking that exact message and that exact amount, noting the build, and writing down what you actually saw if they differ.

Why it matters

Execution is where a team sees how the product actually behaves, and everything before it pays off only if the results can be trusted. A step marked "passed" after a quick glance can let a wrong amount or a misleading message reach customers; a "failed" with no details can cost a developer hours of guessing.

For the tester, a careful run produces evidence others act on: the release decision, the defect report, the retest after a fix. Results that say what ran, on which build, with which data and what happened can be trusted and repeated; results written from memory cannot.

Executing one test case, step by step

A test case reaches you as part of a test run: one execution of a set of tests on one specific build. Read the whole case before you start, and ask about anything unclear now, not halfway through.

Then work through it in a fixed rhythm:

  • Check the preconditions and note the context: build, environment, browser or device, account and data. If a precondition cannot be met, do not improvise; record why the test could not run.
  • Perform one step exactly as written, with the stated data. If you must deviate, for example because a field was renamed, record it.
  • Observe the whole result: the screen, messages, amounts, the next page, and any email the step should trigger.
  • Compare the actual result with the expected result. On a match, go to the next step; on a mismatch, capture what you saw before doing anything else.
  • After the last step, record the outcome and clean up the data the case changed, so the next test starts from a known state.
Executing one manual test case: check the preconditions, perform and observe each step, compare the actual result with the expected result, then record the outcome and follow up what you noticed outside the script. Conceptual model
  1. 1Read the whole test caseObjective, preconditions, data, expected results; ask about anything unclear
  2. 2Check the preconditionsNote build, environment, device, account and data

    Branch: A precondition cannot be met: do not run the test; record whyCaution

  3. 3Perform the next stepExactly as written, with the stated data
  4. 4Observe the actual resultThe whole screen: messages, amounts, next page, emails
  5. 5Compare with the expected resultExact text, values and resulting state

    Repeats: Match: back to step 3 for the next step of the case

    Branch: Mismatch: capture the actual result and evidence, then look for the causeFail

  6. 6Record the resultStatus, actual results, build, data, time, evidence, defect IDs
  7. 7Wrap up and follow upClean up the data; report what you noticed outside the script

Simplified: after a mismatch, continue with the later steps only if they still make sense without the failed one.

Try it: Temporary Email

Comparing expected and actual results

The expected result is the behaviour the test basis predicts, written into the test case before execution; whatever tells you the correct behaviour, such as a requirement, an acceptance criterion or a previous version, is a test oracle. The actual result is what the system really does. The comparison must be exact: "This code is not valid" is not "This code has expired", and 216.00 is not 240.00.

Compare every part the expected result states: text, values, the state of the data, the next screen. A mismatch is an anomaly, not yet a verdict. Before calling it a defect, confirm that you performed the step correctly with the right data and build, and that the expected result agrees with the test basis. Never edit the expected result to match the system; if the test case is wrong, record that and have it corrected.

For long messages or JSON responses (the structured data many APIs return), paste the expected and the actual text into a diff tool: it highlights every difference more reliably than your eyes.

Try it: Text Diff Try it: JSON Diff

Recording what happened

Each run produces what ISTQB calls a test log, a chronological record of the relevant details of test execution, usually kept in a test management tool or a shared spreadsheet. Fill it in while testing, so that someone else can understand, repeat and retest your run without asking you.

  • Which test: the test case ID and its version.
  • Context: build, environment, browser or device, test data or accounts, tester, date and time.
  • Outcome: passed when every actual result matched its expected result, failed when at least one did not. Other statuses, such as blocked, come in the lesson on test suites and test runs.
  • The full actual result of every step that did not match, not just the word "failed".
  • Evidence and links: screenshot or log references and the ID of any defect report raised.

Staying observant beyond the script

A test case tells you what to check, not everything that can go wrong. While you focus on one expected result, other problems can appear on the same screen: a total that does not add up, a broken layout, a slow response, an error in the browser console, a label in the wrong language. Follow the script, but keep your eyes open.

When you notice something outside the expected results, do not abandon the case. Note it at once with the time and what you were doing, finish the case, then try it again and report it on its own. It does not change the status of the case, which describes only that case's expected results. If it reveals a gap in the test cases, propose a new case or an extra expected result.

Problems in the test case itself are findings too: steps that no longer match the screens, outdated data, an expected result that contradicts the requirement. Record them so the case is fixed before the next run.

Worked example: running TC-07 on build 4.2.0

Sara runs TC-07 on staging. Steps 1, 3 and 4 match. In step 2 the code is rejected, but the message differs from the expected text taken from the acceptance criterion. She checks that she typed OLD5 correctly and that the code is set up as expired, takes a screenshot, finishes the steps and records the case as failed.

She also notices that after the rejected code the VAT line showed 0.00 SAR until she reloaded the page. No step of TC-07 checks VAT, so she notes it, reproduces it after the case and reports it as a separate defect, proposing a new test case.

TC-07   Expired promo code is rejected (version 2)
Run:    build 4.2.0, staging, Chrome desktop, 2026-10-06 10:42, tester Sara
Data:   account cust-basic-01, cart CART-3 (240.00 SAR), code OLD5 (expired)

Step 1  Expected: the cart shows 3 items, subtotal 240.00 SAR
        Actual:   as expected                                    [passed]
Step 2  Expected: message "This code has expired", no discount line
        Actual:   message "This code is not valid", no discount line
        Evidence: tc07-step2.png                                 [failed]
Step 3  Expected: the subtotal is still 240.00 SAR
        Actual:   240.00 SAR                                     [passed]
Step 4  Expected: after a reload, no code is applied
        Actual:   as expected                                    [passed]

Status:   failed (step 2), defect DEF-412 raised
Observed: after step 2 the VAT line showed 0.00 SAR until a reload, seen twice;
          not checked by TC-07: reported as DEF-413, new test case proposed

Try it: Text Diff

Common mistakes

  • Passing a step after a glance, without checking the exact message text, the amounts and the resulting state.
  • Recording "failed" with no actual result, build or data, so nobody can reproduce the problem or retest the fix.
  • Changing steps or data on the fly, or quietly editing the expected result to match the system, without recording it.
  • Filling in results from memory at the end of the day instead of while executing.
  • Reporting every mismatch as a product defect before checking the data, the build and the test case against the test basis.
  • Ignoring an obvious problem because "it is not in my test case".

The QA perspective

On a real team you usually execute the cases assigned to you in a test run inside a test management tool, in the order of the execution schedule. Before you start, confirm the build and that the smoke test passed. Talk early: tell the developer as soon as a failure blocks other cases, and ask the product owner when an expected result looks wrong instead of deciding alone.

Record as you go, and share your notes on observations outside the script and on test cases that need updating at the stand-up or with the test lead. Some teams execute cases in pairs, a tester with a developer or another tester; ISTQB names pair testing sessions as one form test execution can take.

Practice exercise

Record the execution of a profile test case

Your task

Below are test case TC-21 and what you saw when you ran it. The acceptance criterion says: "After saving, the new display name is shown everywhere in the app immediately."

Write the execution record: each step's result, the overall status, the actual results, what you check before reporting, and what you do with what you noticed outside the script.

Material
TC-21   Change the display name (version 1)
Pre:    logged in as cust-basic-02, display name "Lina Test"
Step 1  Open Profile.
        Expected: the name field shows "Lina Test"
Step 2  Replace the name with "Lina Q." and select Save.
        Expected: message "Profile updated"; the name field shows "Lina Q."
Step 3  Reload the page.
        Expected: the name field still shows "Lina Q."
Step 4  Open the header menu.
        Expected: the greeting reads "Hello, Lina Q."

What you saw (build 3.9.1, staging, Chrome desktop):
Step 1  the name field shows "Lina Test"
Step 2  message "Profile updated"; the name field shows "Lina Q.";
        the profile picture disappeared and came back only after the reload
Step 3  the name field shows "Lina Q."
Step 4  the greeting reads "Hello, Lina Test"
Steps
  1. Compare each observation with its expected result and mark each step passed or failed.
  2. Decide the overall status and list what to check before you report the mismatch.
  3. Write the record with the context of the run, and decide what to do with the observation outside the script.
Show the model answer
Model answer

Steps 1, 2 and 3 passed. Step 4 failed: expected "Hello, Lina Q.", actual "Hello, Lina Test". The overall status is failed.

Before reporting, repeat step 4 once and confirm the build (3.9.1) and the account (cust-basic-02). The acceptance criterion requires the new name everywhere immediately, so the expected result is backed by the test basis: report the failure, for example "Header greeting keeps the old display name after a profile update".

Record TC-21 version 1, build 3.9.1, staging, Chrome desktop, the account, your name, date and time, status failed, the actual greeting, a screenshot of the header and the defect ID.

The missing profile picture is outside the expected results of TC-21, so it does not change the status. Note it with the time, try to reproduce it after the case, report it separately if it repeats, and propose "the profile picture is still shown" as an extra expected result for step 2.

Frequently asked questions

Should I stop at the first failed step?

Not necessarily. If the remaining steps do not depend on the failed one, continue and record each result, because they may reveal more. If they depend on it, stop and record the remaining steps as not executed. Follow your team's convention and say in the record what you did.

Is a failed test a bad test?

No. Passed and failed describe the comparison, not the quality of the test or the tester: a test fails when its actual result does not match its expected result. A failed test that reveals a real defect has done exactly its job. What makes a test bad is a wrong expected result or a step nobody can follow.

What if I think the expected result in the test case is wrong?

Check it against the test basis, such as the requirement or acceptance criterion, and ask the product owner or the author of the case. Record what you actually saw and that the expected result is in question. Do not edit the expected result on your own during execution; if it is wrong, the test case is corrected and reviewed again, and then the test is run again.

How is this different from exploratory testing?

Manual test execution as described here follows test cases designed in advance, with expected results written before the run. In exploratory testing you design, execute and evaluate tests at the same time while you learn about the product, often guided by a test charter. Noticing problems beyond the script is a small dose of exploration inside scripted testing; a full exploratory session is a different technique with its own lessons.

References

Practise with Mutqan tools

Compare two texts line by line or word by word and highlight differences.

Formatting

Compare two JSON documents semantically and highlight added, removed and changed values.

JSON & Data

Generate a throwaway email address and read what arrives, on the same page. The address is released when you stop using it.

Utilities New

Go deeper

Your progress on this topic

Part of the QA Roadmap