BlogDocsProduct Log in Start free
Guides

Managing Test Cases in Excel: When It Works, and What Breaks

Spreadsheets are a reasonable place to start managing test cases. This is what they're genuinely good at, the four things that break as a team grows, and how to migrate without losing what you've built.

A spreadsheet of test cases with the columns that migrate cleanly separated from the ones that have nowhere to go.

Managing test cases in Excel works, up to a point. A spreadsheet is free, everyone can already use it, it needs no rollout, and for a small team writing a few hundred cases it does the job without complaint. Most QA teams start there and it is not a mistake.

What breaks isn’t the writing. It’s the running — the moment you need to record that these cases were executed on this build by this person, and answer questions about that months later.

And the reason it breaks isn’t size. A spreadsheet is a very good list, and it stays a very good list at ten thousand rows. What changes is that somewhere along the way you stopped maintaining a list and started operating a system.

What spreadsheets are genuinely good at

Worth being fair, because the honest version of this argument is more useful than the sales version.

  • Zero friction to start. No procurement, no admin, no schema decisions before you’ve written test one.
  • Total structural freedom. Add a column, invent a convention, restructure on a Tuesday. No tool lets you reshape your model that fast.
  • Everyone can read it. A product manager can open a spreadsheet. Getting them into a QA tool is a project.
  • Bulk editing is unbeatable. Find-and-replace across 400 rows, fill-down, sort, paste a column — decades of refinement on exactly this, and a hard standard for anything that replaces it.

If you have one tester, a few hundred cases and a release every quarter, a spreadsheet is a rational choice. The problems below are problems of scale and time, not of taste.

Which is worth drawing, because it locates the problem somewhere other than where most people look for it.

A list — a spreadsheet is genuinely good at this
Test cases a list of what to check Structure folders, priorities, owners
the spreadsheet stops paying for itself here
A system — every one of these is a relationship, not a cell
Executions the same case run many times History what it said last quarter Requirements what each case is for People two testers at once Automation results arriving from a pipeline Releases a decision made on a date Evidence proving it afterwards
Nothing here is about the number of rows. Ten thousand test cases is a big list; two testers and a second run is a system.

Everything below that line is a relationship — between a case and the times it ran, between a requirement and what covers it, between two people editing at once. A grid stores values in cells. It has no way to store a relationship except by convention, and convention is the thing that decays.

The four things that break

1. There’s no place to put a result

This is the fundamental one and everything else follows from it.

A test case is a plan. An execution is an event — this case, this build, this tester, this date, this outcome. A spreadsheet has one row per case, so the moment you want to record a result you have to choose between two bad options: overwrite the previous result, or add a column per cycle.

Overwriting loses history. Columns-per-cycle means Result_Sprint_12, Result_Sprint_13, Result_Sprint_14, and a file that gets wider forever. Neither survives a year.

In a spreadsheet

CaseSprint_12Sprint_13Sprint_14
TC-14PassFailPass

One row, and a new column every cycle. The file gets wider forever, and nothing records who ran it or against which build.

In a test management tool

TC-14 the plan — written once
  • Execution 12 build 4.7.1 · Priya · 12 Mar · Passed
  • Execution 13 build 4.7.2 · Sam · 26 Mar · Failed
  • Execution 14 build 4.8.0 · Priya · 09 Apr · Passed

One case, and an event per run. History grows downward, and each row knows its own build, tester, date and outcome.

A case is a plan; an execution is an event. The spreadsheet only has somewhere to put the first one.

2. Concurrent editing quietly loses work

Cloud spreadsheets handle two people editing different cells fine. What they don’t handle is two people executing at once — one sorts the sheet to find their tests, and everyone else’s rows move underneath them. Add filtered views, and someone deletes a row that was hidden from them.

The failures are silent. Nobody gets an error; a result just isn’t there any more.

3. Nothing connects to anything

Coverage questions are the ones that get asked when something goes wrong, and a spreadsheet answers them by convention rather than by structure. “Which tests cover the payments requirement?” is answered by a text column that says REQ-14 — which works exactly as long as everyone types it identically, forever.

That means no reliable answer to “what’s untested”, “which requirement did this defect come from”, or “was this area covered before we shipped”. Those questions need a chain that actually holds — requirement to test to execution to defect, and a text column isn’t one.

4. Nobody trusts it after a year

The end state of an unmaintained sheet is familiar: cases for features that were removed, results from a build nobody can identify, three tabs that disagree, and a column called Notes2. It isn’t wrong, exactly — it’s just no longer something anyone will act on.

Deciding it’s time to move

Not everyone should migrate. Some reasonable triggers:

If none of those are true, staying is a legitimate decision. Migrating a spreadsheet that’s working costs weeks and buys you nothing yet.

What actually survives a migration

This is the part most migration guides skip, and it’s the part that determines whether the move is a week or a quarter.

Spreadsheet columns map cleanly onto the fields a test management tool has, and have nowhere to go otherwise. Realistically:

Usually survives — title, description, priority, severity, test type, folder or suite structure, preconditions, steps and expected results, and requirement references if they match identifiers the target already knows.

Usually doesn’t — attachments referenced as file paths or shared-drive links, custom columns your team invented, historical results, anything encoded in cell formatting (colour-coded severity is invisible to an importer), and formulas.

Import in slices, not all at once

Import one folder or one area first, look at what arrived, and fix the mapping before doing the rest. A full import of 3,000 rows with a subtly wrong column mapping is much more expensive to undo than to redo.

How this works in Hawzu

Import runs as a four-step wizard — source, mapping, review, result — and there are four sources, not one: a generic Excel/CSV import with manual column mapping, plus dedicated importers for TestRail, Zephyr and QASE exports. (If you’re coming from something else, there’s a request form; there is no Jira, Azure DevOps or Xray importer today.)

For the generic path, a Download template button gives you the exact grid the importer expects — 14 columns covering title, priority, severity, description, test type, parent folder, requirements, automation status, preconditions, the step fields, and a Gherkin flag. Two conventions are worth knowing before you reshape your own sheet: folder nesting is expressed in one cell as Parent > Child > Grandchild, and a multi-step case is a row with a title followed by rows with the title left blank, each adding a step.

Mapping is auto-guessed from your header names and overridable. Title, priority and severity must be mapped; the rest are optional. The review step shows what will be created before anything is written — rows ready, rows with issues, folders that will be created, and a sample preview.

Two behaviours are worth calling out because they’re the sort of thing you find out about afterwards:

  • Requirement references resolve or are dropped. A REQ-101 that matches a real requirement becomes a link; one that matches nothing is discarded rather than stored as text. The reasoning is in the code itself — a value that resolves to nothing isn’t a link, it’s a wrong number in your coverage figures.
  • Unmapped columns are silently ignored. Because mapping works Hawzu-field-first, any column you don’t assign is simply never read. Nothing warns you. This is exactly why you import a slice first.

Coming the other way, export offers Excel, CSV and JSON, and the round-trip is deliberate: the xlsx and csv output is written against the same template the importer reads, with values written as display labels precisely so they re-import. Hawzu’s own export is valid input to Hawzu’s own wizard — which also means it’s a clean way to get your data back out. JSON is the lossless one, carrying shared-step boundaries, labels and custom fields, but it isn’t a wizard input.

After importing, bulk editing covers priority, severity, test type, automation status, and moving cases between folders. It does not cover labels, requirements, custom fields or step content — so get those right in the sheet where find-and-replace is still available to you.

Key takeaways

  • Spreadsheets are a rational starting point, and they don’t fail because the list got long. They fail when the list becomes a system — executions, history, requirements, people, releases — because each of those is a relationship, and a grid can only store a relationship by convention.
  • The thing that breaks first is recording results, because a case is a plan and an execution is an event, and one row can’t be both.
  • A column name containing a sprint number or a date is the signal you’ve outgrown it.
  • Titles, priorities, structure and steps migrate cleanly. Attachments, custom columns, formatting-as-meaning and historical results generally don’t.
  • Convert convention into content before importing — importers read cells, not intentions.
  • Import one slice, check it, then do the rest. Unmapped columns are ignored without warning.

Common questions

Is it bad practice to manage test cases in Excel?
No — it's a reasonable choice for a small team with a modest number of cases and infrequent releases. It becomes a problem when you need to record execution results over time, when several people work concurrently, or when you have to prove coverage to someone outside the team.
What's the single biggest limitation of test cases in a spreadsheet?
There's nowhere to put a result. A test case is a plan and an execution is an event with a build, a tester and a date. One row per case forces you either to overwrite the last result or to add a column per cycle, and neither survives a year.
How do you migrate test cases from Excel to a test management tool?
Clean the sheet first — unmerge cells, turn colour-coding and other conventions into real columns, split overloaded fields. Then import one folder or area, inspect what arrived, correct the mapping, and only then run the rest. Importing everything in one pass with a wrong mapping is far more expensive to unpick.
What gets lost when importing test cases from a spreadsheet?
Typically attachments, custom columns with no matching field, anything encoded in cell formatting, and historical execution results. In Hawzu specifically, attachments and labels don't import, custom fields can't be mapped from a column, and unmapped columns are ignored without a warning.
Can you export test cases back to Excel afterwards?
In Hawzu, yes — Excel, CSV and JSON. The Excel and CSV output is written against the same template the importer reads, so it re-imports cleanly. JSON is lossless (it carries labels, custom fields and shared-step boundaries) but isn't accepted by the import wizard.

Continue learning