Test Case Versioning: What Changed, When, and Who Agreed to It
A test case that passed in March and fails in June raises one question: did the product change or did the case? Versioning is how you answer it.

A QA lead opens a failing run on a Tuesday morning and recognizes the case immediately. It passed for four straight months. Now it fails, and the first ten minutes of the meeting go to arguing about whether the product moved or the case did. Nobody can prove it either way, because the tool only ever showed the current text of the case. This happens every week on teams that treat test cases like static documents instead of things that change on a schedule of their own. It costs more than ten minutes, it costs the credibility of the whole regression suite. Test case versioning is the fix, and this post makes one specific argument: a run has to record the version of the case it executed, not just the case, or the run history is describing text that no longer exists.
The scenario that keeps repeating
A case passes in March. In April, someone edits the expected result because the product behavior shifted slightly. Maybe a discount used to round down and now rounds up. The case title stays the same. The case ID stays the same.
In June, that same case fails a run. Two people look at the same screen and reach different conclusions. One thinks the product regressed. The other thinks the case was rewritten in April and the June failure is actually correct behavior.
Without a record of what the case said in March versus what it says now, there is no way to settle this. The team ends up asking around and hoping someone remembers a change from ten weeks ago. That is not a process, it is a rumor with a Jira ticket attached.
Why a run must point at a version, not a case
Most test management tools store one live copy of a case. Every edit overwrites the last one. When a run references that case, it is really referencing whatever the case happens to say today, not what it said when the run actually executed.
That is backwards. A run is a historical record, and historical records need to describe something fixed. If the case underneath a run keeps changing shape after the fact, the run stops being evidence. It becomes a guess dressed up as a report.
The fix is structural, not procedural. A run needs to point at a specific, immutable version of a case. When someone edits the case, that edit creates a new version. The old version stays exactly as it was, forever attached to every run that used it. Ask what version a run used, and you get a real answer instead of a shrug.
What a useful version record actually holds
A version record that only shows a timestamp and a text diff is half finished. To be useful months later, it needs to answer four questions:
- What changed, described in plain terms, not just a raw text diff
- When it changed, with a real date and time
- Who made the change
- Why it changed
The why is the field almost every team skips, and it is the one they need most later. A diff tells you the expected result went from "success message shown" to "success message shown within 2 seconds." It does not tell you the change happened because product added a performance requirement during a sprint planning meeting three months back. Six months on, nobody remembers that meeting. The why field is the only thing that still does.
Teams that skip the why field usually regret it the first time a case gets questioned by someone who was not in the room. A regulator, a new hire, or a manager reviewing a postmortem all ask the same question: why does this case expect what it expects. A blank reason field means someone has to go find the answer from scratch.
Versioning is not the same thing as an audit trail
These two ideas get conflated constantly, and they solve different problems for different audiences.
Versioning is for the team. It lets an engineer or a QA lead answer "what did this case used to say, and why did it change" in the middle of a normal workday, without opening a ticket or emailing anyone.
An audit trail is for someone outside the team: a regulator, an external auditor, a customer's security questionnaire. It has a stricter bar. It needs to be tamper evident, complete, and defensible to someone who was never in the room and never will be.
A team can have solid versioning and still not have an audit trail that satisfies a formal auditor. Keeping a clean version history is a reasonable habit for every team to build. It is not, by itself, a compliance program, and nothing here should be read as making a suite compliant with any external standard.
Why git is the wrong tool for prose cases
Plenty of engineering heavy teams have tried storing test cases as text files in a git repository. The logic seems sound at first: version control is already solved for code, so why not reuse it for cases.
It does not hold up in practice. Git diffs are built for code syntax, and a diff of two paragraphs of prose expected results reads like noise, not signal. A reviewer squinting at a red and green wall of text cannot tell what actually changed in the meaning of the case.
Git also has no concept of "who approved this version" separate from "who committed it." A commit message is not the same as a structured reason field that a non technical reviewer can read later. And the people who most need to read case history, product managers and business stakeholders, are usually the people least comfortable opening a repository at all.
Git is excellent at versioning code. Test cases are prose with structure, written for and by people who are not always developers. They need a versioning model built for that audience, not one borrowed wholesale from source control.
How versioning and review reinforce each other
Versioning gets more valuable once it is paired with review. An approved version is a version somebody stood behind, on the record, at a specific point in time.
That changes the shape of the argument in that Tuesday meeting. Instead of debating what the case probably meant, the team pulls up the version the March run actually used. They see who approved it and when the newer version replaced it.
The disagreement about whether the product changed or the case did becomes a five minute lookup instead of a half hour argument. Review turns a version from "something that happened" into "something someone signed off on," which matters the next time someone questions why a case expects what it expects.
What to do about a suite with no version history today
Most teams reading this do not have clean version history going back years, and that is a normal starting point, not a failure. The honest answer is not to try to reconstruct it.
Backfilling history for cases that have already been edited a dozen times, with no record of any of it, is a project that eats a week and produces a history nobody actually trusts. It is reconstructed from memory and guesswork, which is exactly the problem versioning was supposed to solve.
Start versioning from today instead. Every case edited from this point forward gets a real version record: what changed, when, who changed it, and why. In three months, the suite has three months of trustworthy history. That is worth more than a fabricated year of it, and it compounds. A year from now, the team will have a full year of answers to questions like the one that started this post.
Questions people ask
Does test case versioning replace the need for an audit trail?
No. Versioning is a team facing habit for tracking what changed and why. An audit trail is built for outside review and has a stricter bar for completeness and tamper evidence. Treat them as related but separate goals.
Can we just use our existing git repository for test case versions?
You can, but prose diffs, missing structured reason fields, and a non technical audience make it a poor fit compared to a system built specifically for versioning prose test cases.
What is the single most important field in a version record?
The reason for the change. Timestamps and authorship are easy to reconstruct later from logs. The reasoning behind an edit is not, and it is usually what someone needs six months on.
Should we backfill version history for our existing suite?
Generally no. Start clean versioning now rather than trying to reconstruct history nobody recorded accurately the first time.
Does Tesbo run or execute the tests described in a case?
No. Tesbo manages and documents test cases and their run history. It does not execute automated tests or provide execution infrastructure.
Try Tesbo, or get the next useful idea
Start building your testing workflow now, or get one practical email a month.
Get startedOne email a month
What we shipped, what we learned, and the occasional infographic worth pinning. Unsubscribe in one click.


