Skip to content
Resources

AI automation

What a Passing Test Actually Proves — And What It Doesn't

"It's tested" sounds like a fact. It isn't. It's a summary of a choice someone else made — what to check, how hard to check it, and when to stop looking. Reading that summary properly takes no technical knowledge, only the right questions. Here's what a passing test actually proves, what it doesn't, and the six questions that turn a green checkmark into something you can rely on.

9 min read · Updated August 2026 · By Anthony Garces — 17+ yrs in IT, principal-level architect

A single green indicator light glowing on an otherwise dark server rack. Every other light on the panel is unlit.
One green light. Everything around it, unreported.

What a green checkmark actually tells you

A green TESTS PASSED badge above three columns. Only the first, what was checked, is partly filled; what was skipped and what nobody thought to ask are empty.
A green light covers the first column only. The other two are where the expensive surprises live.

A passing test tells you one thing: the assertions written into that test ran against a specific version of the code, and none of them failed. That's the whole claim. Here's the deal: it does not tell you the assertions were the right ones to write. It does not tell you they covered the situation a real customer will actually hit. It does not tell you the code will behave the same way tomorrow, after the next change. And it does not tell you that anyone who understands your business looked at what was checked and agreed it was enough. "Tests pass" is a report on what somebody chose to check — not a guarantee about everything they didn't. Read it the way you'd read a building inspection: useful, specific, and only as good as the checklist behind it. You already know how to read one of those.

I spent four years running platform support at Pantheon watching this exact thing happen, so you can skip learning it on your own launch day. WordPress and Drupal sites going through pre-launch load testing before a big traffic event — a product launch, a marketing push, an event with a hard start time. Sites would "pass" the load test because the test hit the homepage and confirmed a normal response under load. Nobody had told it to check whether checkout held up. Nobody had told it to check whether the database connection survived when hundreds of people acted at the same moment. The test was real. It ran. It passed. It also never asked the one question that mattered on launch day.

A test that runs is not a test that checks anything

Some tests execute real code without ever confirming the code did the right thing. They call a function and check only that it didn't throw an error. They render a screen and confirm an element appeared — without simulating the click, the form submission, or the payment a real user would actually make. These aren't fake tests, and nobody is being deceived. The code genuinely runs. The report is genuinely accurate. The gap is narrower than that, and easier to miss from any seat: the test never asserted the outcome you actually care about. It checked that something happened. It did not check that the right thing happened.

  • A test that calls a function and only checks it didn't crash — with no check on what it actually returned.
  • A test that renders a screen and confirms an element exists, without simulating the click, tap, or submit a real user would perform.
  • A test with an assertion that's true no matter what the code underneath it does.
  • A test that checks the easy, expected input and never tries the one that costs money when it fails: the empty field, the expired card, the double submission.
  • A test that replaces the exact piece of the system most likely to break in production with a stand-in — so the real failure never gets a chance to show up.
  • A test written after the fact to match whatever the code already does, rather than what it was supposed to do. It will always pass. It proves nothing beyond the code being consistent with itself.

A skipped test is not a passing test — and one that only passed on retry is not either

Most testing tools let a developer mark a test as skipped, pending, or disabled — usually meant as a short-term note to come back to later. In practice, skipped tests pile up quietly, especially under deadline pressure. Most summary dashboards report a line like "148 passed" without mentioning that a dozen more never ran at all. A skipped test is not a failure. It is also not a pass. It is a question nobody answered, filed under a label that reads like good news — which is why the count of skipped tests is a fair thing to ask for, and an easy one to answer.

A flaky test passes sometimes and fails other times with no code change in between — usually because it depends on timing, network conditions, or state left over from a previous test. Some teams handle this by configuring the system to retry a failed test automatically and report success if any attempt passes. That produces a green result on the dashboard. It does not produce evidence. If a test failed on the first attempt and passed on the third, with nothing changed in between, the honest reading is that nobody knows why it failed. The retry didn't fix the problem. It only kept the report from showing it.

Coverage counts which lines ran — not whether the outcome was correct

Code coverage is a percentage measuring how many lines of code got executed while the tests ran. It's genuinely useful for finding code nobody tests at all. It's a poor stand-in for correctness — a line can be executed by a test that makes no real assertion about what that line was supposed to do. A high coverage number is reachable with tests that check almost nothing meaningful, as long as every line gets touched once. Coverage answers "was this code run during testing?" It does not answer "does this code do what it's supposed to do?" It gets presented as if it answers the second question far more often than it should — so knowing the difference puts you ahead of the number you're being shown.

How to read a coverage number a developer gives you

Ask what the tool is actually measuring on your codebase — line coverage or branch coverage. They're different, and branch coverage is the stronger signal. Then ask for one or two of the tests behind the number and have the developer walk you through what each one checks, in plain language. You do not need to read code to do this. You need to listen for whether the answer describes a real outcome, or only describes what ran.

Who approved the work matters as much as the result

If the person who wrote the code is also the only person who decided the tests were sufficient and the work was done — that is not independent verification. It's a developer telling you they're satisfied with their own work. That may well be true. It still isn't evidence. Independent verification means someone other than the author — another developer, a defined review step, a separate system — looked at the same results and reached the same conclusion, separately. Self-approval is the most common gap I've found behind an "it's tested" claim, and it is genuinely hard to see from where you sit: from the outside, a self-approved green checkmark looks identical to an independently verified one. That's not a failure of attention. The two are built to look the same. There's a second gap that hides the same way — a passing test tied to the wrong version of the code, one that ran last week against a build that has since changed. Evidence that holds up has a receipt attached to it: this test, on this exact version of the code, run at this time, with this result. Anything looser is a story, not a record — and now you know which one you're holding.

The phrase that should prompt a follow-up question

"Don't worry, it's tested" is not information. It's reassurance with no evidence attached. A developer who can back the claim up will tell you plainly what was tested, what wasn't, who looked at the results besides them, and whether the passing result you're being shown is tied to the exact code you're about to pay for. If the answer turns vague — or the tone shifts to asking you to trust it — slow down instead of speeding up.

The questions to put to your developer

These six work whether you're hiring someone new or checking in on work already underway. None of them require you to understand code. They put the work where it belongs — on the developer, to explain their own evidence in plain language, which any developer confident in their work can do without hesitation.

  1. 1Ask what percentage of the important user actions are covered by a test that checks a real outcome — not only that nothing crashed.
  2. 2Ask how many tests are currently skipped or disabled, and why.
  3. 3Ask if any tests are flaky — and whether a retry that eventually passes still counts as a pass in the report you're shown.
  4. 4Ask who reviews the test results besides the person who wrote the code.
  5. 5Ask whether the passing result you're looking at is tied to the exact commit or version being deployed to your live site.
  6. 6Ask to see one test explained in plain language: what it checks, and why that specific check matters to your business.

Why this question is getting more urgent, not less

AI tools can now write code, and write tests for that code, faster than a person ever could. That's not automatically a problem — more testing is generally good. What it changes is who's actually deciding what counts as sufficient evidence. If an AI writes the code, and the same AI (or a developer rubber-stamping without a real look) writes and approves the tests, the self-approval problem hasn't been solved. You've automated it. Speed is not the risk. Ungoverned speed is. The standard doesn't change depending on who or what wrote the code, which means the six questions above hold up exactly as well against an AI-built system: an assertion is not evidence until someone independent of its author has checked it.

Where Ranex fits into this — and its honest status

Here's the deal: this is the exact problem I built Ranex to address — a deterministic governance kernel, meaning a checker that gives the same answer every time, which ties every verdict to a specific piece of evidence, a specific subject, and a specific approver, and refuses to let anything approve itself. Gates fail closed by default. That means if the evidence is missing or unclear, the answer is no — never "good enough for now." Every verdict gets recorded in a hash-chained journal, so the record can't be quietly edited after the fact. It applies the same discipline to AI-written code that a serious engineering team should already apply to human-written code. I built it because I kept seeing the same failure mode repeat as more code — mine included — got written with AI assistance: a confident green result, with nobody able to say exactly what it had verified. I'll say plainly: Ranex is pre-release. It's not something I'm asking you to buy, and you don't need it to hold anyone to this standard — the six questions above do that on their own. It's in this guide for one reason: you're entitled to ask whether I hold my own work to what I'm asking you to expect from your developer.

How this shows up in Anito's own work

Every engagement starts with a diagnosis before a quote, so you see the actual state of a system before any money changes hands. Code, credentials, and hosting sit in your accounts from day one — not at handoff. Any automation Anito builds keeps a human approval gate on anything that touches live data or a live customer, for the same reason as this whole guide: a result nobody checked is not the same thing as a result that is correct. That's a description of how the work is structured, not a promise about a result — there's no finished client engagement yet to point to as proof. Which means the right way to read it is with the same six questions you'd put to anyone else. Hold this to that standard too.

What to remember

  • A passing test proves the assertions it contains ran clean on one version of the code. Nothing broader than that — and you can check that much yourself.
  • A test that never asserts a real outcome, a skipped test, and a flaky test that passed on retry are three different ways to get a green result that proves nothing.
  • Coverage measures which lines executed, not whether the result was correct. Ask to see one test explained, not only the percentage.
  • Self-approval is not approval. Ask who checked the work besides the person who did it.
  • Evidence only counts if it's tied to the exact version of the code being shipped — not last week's build.

Common questions

  • Ask what was tested, not whether it was. A useful answer names specific behaviors checked — the payment going through, the form saving correctly, the login rejecting a wrong password — not a vague reassurance. Then ask how many tests are skipped or flaky, and who besides the developer looked at the results. Three questions, no technical knowledge required. Clear answers to all three and you're looking at real evidence. A shrug, and you're looking at a phrase, not a fact.

  • No — and asking for it can backfire. Coverage counts lines executed, not correctness, so chasing a perfect percentage pushes developers toward shallow tests that touch every line instead of meaningful tests on the lines that matter most. A better target: coverage on the parts of the system where a mistake costs you money — payments, data changes, anything that reaches a customer directly — checked with tests that assert a real outcome, even if the overall percentage sits well under 100.

  • A bug is a mistake in code that got written. A missing test is a question nobody asked before shipping. Both can produce the same result for your business — a feature that fails in front of a customer — but they point to different fixes. A bug gets patched. A gap in testing means the process that's supposed to catch problems before launch has a blind spot, and patching the one bug won't close it. The same category of mistake can happen again in the next feature.

  • You don't need to read code to get value from this. What you need is for the developer to explain, in plain language, what a handful of the important tests check and why. If they can walk you through it clearly, that's a good sign — regardless of whether you personally read a line of it. If they can't explain it without falling back on jargon, or suggest you wouldn't understand, that's worth noting. Not because you need a technical answer. Because a developer who truly understands their own tests can usually explain them in plain words — and you are the right judge of whether they did.

  • No. Automated tests check what the developer thought to check. You're the person who knows what the business actually needs the software to do — and you'll notice things a test suite was never told to look for: confusing wording, a workflow that technically works but frustrates a real customer, a report that's accurate but useless. Treat automated tests and your own hands-on check before launch as two layers of the same safety net. Not substitutes for each other.

Want a second opinion on your own situation?

Start with a free project diagnosis. You leave with a clear, honest read on what is worth doing — and an honest no if it is not the right time. No obligation to build.