Test Runs and Test Management Tools
Learn how teams organize test cases in a repository, run them against a build, use execution statuses like Passed, Failed and Blocked, link failures to bugs and track progress, with a hands-on test run for the FoodDash 2.0 release.
Monday, 9:40. Your lead writes in the team channel: “FoodDash 2.0 build 412 is on staging. Please create the regression run for iPhone, start with the P1 cases and keep the run updated so I can see where we are at stand-up. Link every failure to a bug.”
You already know how to write test cases and a test plan. This lesson is about what happens next: how a team stores hundreds of cases, picks the right ones for a build, runs them, records the results and shows progress, usually in a tool like TestRail, Xray or Zephyr. These words show up in almost every QA job ad, and by the end of this lesson they won’t scare you.
From written cases to executed results
Writing a case and running it are two different things, and tools keep them apart on purpose.
1 · Repository
All test cases
Sections like Login, Cart, Checkout. Written once, reused every release.
2 · Test run
A selection for one build
”2.0.0 regression, build 412, iPhone 15”. Assigned to testers.
3 · Execution
A status per case
Passed, Failed, Blocked… plus the actual result and evidence.
4 · Bugs and report
Links and progress
Each failure links to a bug. The run’s numbers feed the summary report.
The essentials
The repository
The repositoryTest case repositoryThe central library where a team keeps all its test cases, organized into sections and suites.Open in glossary → is the library of all your cases, grouped into sections or suitesTest suiteA group of related test cases that are run together.Open in glossary → (Login, Cart, Checkout). Each case has fields that make it easy to pick later: priority (P1 to P3), type (functional, UI, accessibility…) and automation status (manual, automated, to automate). You write a case once and reuse it in every release; when the product changes, you update the case.
The test run
A test runTest runOne execution of a chosen set of test cases on a specific build and environment, with a result for each case.Open in glossary → (some tools say test cycle or test execution) is a selection of cases for one build on one environment or device. You pick cases by priority or section, choose the buildBuildA specific compiled version of the app or website that is ready to be installed or tested.Open in glossary → and device, and assign testers. The run is the proof of what was actually tested.
Execution statuses
| Status | Use it when |
|---|---|
| Passed | The actual result matches the expected result. |
| Failed | It doesn’t, because of a defect in the product. Link a bug. |
| Blocked | You can’t run the case to the end: environment down, data missing, an earlier bug in the way. Write the reason. |
| Retest | A linked bug was fixed; the case must be run again. |
| Skipped / N/A | Deliberately not run, or doesn’t apply (an iOS-only case on Android). |
| Untested | Nobody has run it yet. |
Tools use slightly different names, but the ideas are the same.
Blocked vs Failed
Failed means you ran the case and the product did the wrong thing. Blocked means you couldn’t find out, because something outside the case stopped you. The payment sandbox is down? Blocked. An expired coupon is accepted? Failed. See blocked testBlocked testA test case that can't be run to the end because something outside it is broken or missing.Open in glossary →.
Evidence and bugs
For anything that isn’t a clean pass, write the actual result in one or two concrete sentences and attach a screenshot, recording or log. Every Failed case links to a bug key (for example FD-241), new or existing. When that bug is fixed, the case goes to Retest, you run it on the new build, and it becomes Passed (or Failed again). That’s retestingRetestingRunning the same test again to confirm that a reported bug is really fixed.Open in glossary →.
Progress
The run shows how many cases are done and how they went. Leads watch the untested count go down day by day (a burndown), and the failed and blocked cases in P1. Those are the ones that decide a release.
Tools
TestRail is a standalone tool that connects to Jira. Xray lives inside Jira, where tests, test plans and test executions are Jira issues. Zephyr is a family of Jira apps with test cycles. Small teams often use a spreadsheet, and that’s fine.
Good habits
One run per build and environment. Don’t edit cases in the middle of a run without noting it. Keep cases atomic, so one status means one thing.
Switch to Detailed at the top for the full walkthrough: fields, statuses in depth, evidence, bug links, retests, burndowns, the tools compared and a spreadsheet template.
The test case repository
A test case repositoryTest case repositoryThe central library where a team keeps all its test cases, organized into sections and suites.Open in glossary → is where the team keeps the master copy of every test case. Whether it’s a tool or a spreadsheet, a healthy repository has three things: a clear structure, useful fields and a way to change cases safely.
Structure: sections and suites
Group cases the way people think about the product, usually by feature or screen:
- FoodDash 2.0 → Login · Cart · Checkout · Tracking · Profile
- inside Checkout → Payment · Delivery time · Address
Tools call these groups sections, folders, suites or test sets. A test suiteTest suiteA group of related test cases that are run together.Open in glossary → can also be a cross-cutting selection, like “Smoke” or “Accessibility”, built from cases in many sections. You’ll meet those in Regression and Smoke Suites.
The fields that make cases easy to pick
Beyond the fields you already write (steps, data, expected result), a few metadata fields let you build runs in seconds:
| Field | Example values | Why it matters |
|---|---|---|
| Priority | P1, P2, P3 | “Run all P1 first” is the most common release filter. |
| Type | Functional, UI, Accessibility, Security | Lets you build a focused run, e.g. an accessibility pass. |
| Automation status | Manual, Automated, To automate | Shows what CI already covers and what’s a candidate for automation. |
| Platform | iOS, Android, Web, All | Keeps iOS-only cases out of Android runs. |
| Requirement link | FD-104 | Powers the traceability matrixTraceability matrixA table linking each requirement to the test cases that cover it.Open in glossary →. |
Keep the values few and agreed. A priority field where half the cases are “High” helps nobody.
Versioning and reuse
The big win of a repository is reuse: the case “An expired coupon code is rejected” is written for 2.0 and runs again in 2.1, 2.2 and 3.0. That only works if cases stay up to date.
- When a requirement changes, update the case in the repository, not just in your head. Mention the change in the case history or in a comment (“Expected result updated for FD-104 v2: minimum order €15”).
- Many tools keep a version history per case, and a run remembers which version of the case it used. That way an old run still shows what was actually checked back then.
- Archive, don’t delete, cases for removed features. You may need them for the old app version that’s still in the stores.
Creating a test run
A test runTest runOne execution of a chosen set of test cases on a specific build and environment, with a result for each case.Open in glossary → answers: which cases, on which build, where, by whom?
- Decide the scope. Use the test plan and what changed: all P1 plus the P2 cases for touched areas, or the full regression suite before a major release. Impact analysisImpact analysisWorking out which parts of a product a change could affect, to decide what to retest.Open in glossary → tells you which areas were touched (Regression and Smoke Suites shows how).
- Pick the cases. Filter the repository by priority, section, type or platform, then add or remove single cases by hand.
- Set the build and environment. Name the exact buildBuildA specific compiled version of the app or website that is ready to be installed or tested.Open in glossary → (2.0.0 build 412, not “latest”) and the environmentEnvironmentA setup of servers, data and configuration where the software runs, such as dev, staging or production.Open in glossary → or device (staging, iPhone 15 on iOS 18). If a case is run on two devices, those are two results, so most teams create one run per device or use the tool’s “configurations”.
- Assign testers. Split by section or by device. Each case has one owner, so nothing is run twice or not at all.
- Name it clearly. “FoodDash 2.0.0 regression · build 412 · iPhone 15” is searchable months later. “Run 3” isn’t.
Execution statuses, and when to use each
During test executionTest executionThe activity of running test cases, comparing actual with expected results and recording the outcome.Open in glossary →, every case in the run gets an execution statusExecution statusThe result recorded for a test case in a run: Passed, Failed, Blocked, Retest, Skipped or Untested.Open in glossary →. These are the common ones. TestRail’s defaults are close to this list, other tools use different names (Xray, for example, uses TODO and EXECUTING), and many teams add their own.
| Status | Meaning | FoodDash example |
|---|---|---|
| Untested | Not run yet. Every case starts here. | The run was created this morning. |
| Passed | Actual result = expected result. | Home opens with “Hi, Mia” after sign-in. |
| Failed | Actual ≠ expected, because of a product defect. | The expired code SPRING5 is accepted: −€0.60 instead of “This code has expired”. |
| Blocked | You can’t run the case to the end, for a reason outside it. | The payment sandbox returns 503 errors until 15:00. |
| Retest | A linked bug is fixed; run the case again. | FD-118 (“Remove” deleted the wrong dish) is fixed in build 412. |
| Skipped / N/A | Deliberately not run, or doesn’t apply here. | A Face ID case in an Android run. |
Blocked vs Failed: the classic confusion
Blocked
You couldn’t reach or finish what the case checks, so you don’t know yet whether it works.
- The test environment or a third-party sandbox is down.
- Test data or an account you need doesn’t exist.
- An earlier bug stops you getting there: sign-in is broken, so you can’t reach checkout.
Write the reason, link the blocking issue if there is one, and re-run when it’s cleared.
Failed
You ran the case and the product did the wrong thing compared with the expected result.
- A wrong total, a missing message, a crash on this screen.
- The feature is there but behaves differently from the requirement.
Link a bug. The case is retested when the bug is fixed.
Why it matters: a Failed case sends a developer looking for a bug in FoodDash. If the real cause was a sandbox outage, that’s an afternoon wasted, and your next failures are trusted a bit less. In the other direction, marking a real defect as Blocked hides it from the bug count.
Skipped, N/A and Untested
- Skipped / N/A is a decision: “doesn’t apply” or “we chose not to run it this time”. Say why in a comment. Better still, don’t put platform-specific cases into the wrong run in the first place.
- Untested at the end of a run is not a status you choose, it’s what’s left. That’s fine if you say so in the report (“12 P3 cases not run, low risk”). It’s not fine if it’s hidden.
Recording actual results and evidence
A status alone is not enough for anything other than a clean pass. Write the actual resultActual resultWhat really happened when you performed the test.Open in glossary → and attach proof.
Useful
Actual: “Code applied” appears, the discount line shows −€0.60 and the total €11.40. Expected “This code has expired” and a total of €12.00. Screenshot attached. Bug FD-242.
Useless
Actual: Doesn’t work.
Good evidence, depending on the problem:
- a screenshot of the wrong state (with the important part visible, not just the top of the screen);
- a short screen recording for anything that happens in steps or over time;
- logs: a HAR file from DevTools, device logs, a network trace from a proxy toolProxy toolA program that sits between the app and the server so you can watch and change network traffic.Open in glossary → (DevTools for Testers, ADB Basics);
- the build, device and OS (the run usually records these for you).
For passed cases, most teams don’t attach anything. Some regulated projects (finance, health) do want evidence for passes too; your test plan should say.
Linking a failure to a bug
- Search first. Is there already a bug for this? If FD-241 already describes it, link the existing bug instead of filing a duplicate bugDuplicate bugA bug report that describes a bug someone already reported.Open in glossary →.
- File the bug if it’s new. Many tools have a “create bug” button that opens a Jira form pre-filled with the case’s steps and your actual result. Clean it up the way you learned in Writing Bug Reports.
- Link it to the result. The case result now shows
FD-242, and the bug shows which case found it. That two-way link is what traceability is built on. - Link the story too. In Jira, link the bug to the user story, so the story can’t be closed with a known bug.
One bug can fail several cases (a broken API can fail three checkout cases), and one case can have several bugs over its life. The links keep that history.
Retests and re-runs
When a developer fixes a bug, the fix lands in a new build. Two things happen:
- RetestingRetestingRunning the same test again to confirm that a reported bug is really fixed.Open in glossary →: the case that found the bug is run again, with the same steps and data, on the new build. Depending on the tool and setup, the case is set to Retest when its linked bug is resolved, or you do it yourself. If it passes, the bug can be closed. If it fails again, the bug is reopened.
- Regression testingRegression testingRe-running tests to check that new changes didn't break things that used to work.Open in glossary →: checking that the fix didn’t break anything else. That’s a different job with a different selection of cases. Don’t call it “retesting”.
For a new build, most teams create a new run containing the failed, blocked and untested cases from the previous run, plus a regression subset around the fixes. The old run stays as it was: it’s the record of build 412.
Tracking progress
A run is also a live dashboard. Three numbers matter most:
- Executed: how many cases have a final status. “64 of 120 executed (53%)”.
- Results: passed, failed, blocked. Watch failed and blocked P1 cases closely; they decide the release.
- Remaining: untested and retest. This is what a burndown tracks.
A burndown is a simple chart: remaining cases per day, going down towards zero by the deadline. Here’s the FoodDash 2.0 regression run:
Remaining cases (untested + retest), 120-case run
Wednesday barely moved: the payment sandbox was down and 14 checkout cases were blocked. A flat line in a burndown is a question to ask at stand-up, not a number to hide.
Progress numbers are for steering, not for judging people. “Ana executed 40 cases, Ben 15” says nothing if Ben’s were the hard payment cases. More on numbers that help and numbers that mislead in Traceability and Test Summary Reports.
TestRail, Xray and Zephyr
Job ads name these three most often. They share the ideas from this lesson but organize them differently. This is a high-level picture; editions, names and screens change often, so check the vendor’s current documentation when you start using one.
| Where it lives | How tests and runs are stored | |
|---|---|---|
| TestRail | A standalone web app (cloud or self-hosted) with a Jira integration. | Projects contain suites and sections of cases. You execute in test runs; a test plan groups several runs, e.g. one per device. |
| Xray | An app inside Jira. | Tests are Jira issues of type Test. A Test Execution issue holds the results for a build; a Test Plan issue groups executions for a release. |
| Zephyr | A family of Jira apps from SmartBear (you may see the names Zephyr Scale and Zephyr Squad). | Cases are organized in a test library or as Jira issues, depending on the edition. Executions are grouped into test cycles. |
Other tools exist (qTest, PractiTest, Azure Test Plans and more). Once you understand repository → run → status → bug link, switching tools takes a day, not a month. In interviews, say what you did with a tool (“I built runs per device and linked failures to Jira”), not just its name.
Spreadsheets are a legitimate option
A small team with one app and one tester doesn’t need a paid tool. A shared spreadsheet works well if you keep it disciplined:
- One tab for the repository: ID, Section, Title, Priority, Type, Platform, Steps, Expected result, Requirement.
- One tab per run, named after the build and device: ID, Title, Status, Actual result, Evidence link, Bug key, Tester, Date.
- Use a dropdown (data validation) for Status so nobody types “pass”, “OK” and ”✓” in the same column.
- Add a small summary at the top with
COUNTIFper status.
You’ll outgrow it when you have several testers editing at once, many devices per release, or need history and reports across releases. That’s when a tool pays for itself.
Good practices
- One run per build and environment. Results from different builds don’t mix.
- Don’t edit cases mid-run without noting it. If you discover the expected result is outdated, add a comment on the result, finish the run with what you know, and update the case in the repository afterwards (or tell the lead right away if it changes the verdict). Silent edits make old results meaningless.
- Keep cases atomic. One case checks one thing, so one status means one thing. A case with five checks that “half passed” can’t be marked honestly.
- Never pass a case you didn’t run. If you ran out of time, it’s Untested. That’s honest; a fake pass is the worst thing a tester can do.
- Report unrelated bugs separately. If you notice a stretched logo in the Orders list while running a tracking case, file it (and suggest a new case), but don’t fail the tracking case.
- Update the run as you go, not at the end of the day. The lead is looking at it.
Common mistakes
Practice: run the FoodDash 2.0 release
Your turn. Create a run from the FoodDash repository, execute it on build 412 and close it. Some cases pass, some fail, one is blocked and one starts on Retest. Read what you see on the build carefully before you choose. Try it once on the iPhone and once on the Pixel: one case behaves differently.
Test run simulator
A mini test management tool. Create a run for the FoodDash 2.0 release, execute it, then compare your statuses with ours.
- 1. Create the run
- 2. Execute
- 3. Close and review
Pick cases from the repository
Login
Cart
Checkout
Tracking
Profile
Tip: start with All P1, then add P2 if there is time.
Before you close a run
Before you close a run
0 of 8 checked
Check your understanding
Quick quiz
0/6 answered · 0 correct
1.You run 'Place an order with a saved card'. The payment provider's sandbox is down for maintenance. What status do you set?
2.You apply the expired code SPRING5 and the app accepts it with a 5% discount. The case expects 'This code has expired'. What do you do?
3.Bug FD-118 is fixed in build 412. The case that found it was Failed in the build 405 run. What happens next?
4.An Android run contains a 'Sign in with Face ID' case. What's the best status?
5.Build 413 arrives on Wednesday while the build 412 run is half done. What's the usual approach?
6.In Xray, what is a Test Execution?
Key takeaways
- The repository holds all cases, organized by section and tagged with priority, type, platform and automation status. Cases are reused release after release, so keep them current.
- A test run is a selection of cases for one build on one environment or device, assigned to testers. One run per build and environment.
- Failed = the product did the wrong thing; link a bug. Blocked = you couldn’t find out; write the reason.
- Record the actual result and evidence for every non-pass. A status alone isn’t enough.
- When a bug is fixed, the case goes to Retest and is run again on the new build. Retesting is not regression testing.
- TestRail, Xray and Zephyr organize the same ideas differently. A disciplined spreadsheet is fine for small teams.
Next: connect requirements, runs and bugs, and write the end-of-cycle report in Traceability and Test Summary Reports.
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 ⚡