← All posts
4 min read

The Test Suite That Ran Every Night and Told No One Anything

Thousands of automated tests, results dutifully archived to S3, and not a single person who could say how many passed on last week's release.

Picture a serious engineering organization. Embedded and systems teams, real safety obligations, an automation effort they were rightly proud of. Thousands of GoogleTest cases across dozens of components, running on every merge and every nightly build. The team had done the hard part — the tests existed, they were meaningful, and they ran.

Every run produced JUnit-style XML. Every XML file was uploaded to an S3 bucket. Organized by date, by build, by target. Nothing was ever lost.

And nobody could answer the simplest question you can ask about a test suite:

"How many tests ran on this release, and how many passed?"

The Slack archaeology

Here's what actually happened when a test failed on a release candidate.

An engineer sees the red mark in CI. First question: is this new, or has it always been flaky? There's no way to know from the CI page — it shows this run, in isolation. So they post in Slack: "Anyone seen PowerManagement_StateTransition_Test.SuspendResume fail before?"

Three people reply. One thinks it failed last month. One says it was fixed. One asks which target. Someone else remembers a similar test, not this one. A fourth person offers to check S3.

Checking S3 means: list the bucket, guess which prefixes cover the right date range, download a few dozen XML files, grep for the test name, mentally reconstruct a pass/fail history from timestamps in filenames. Twenty minutes if you're lucky and know the bucket layout. An hour if you don't. And the answer you get is one engineer's best reconstruction, shared as a Slack message, gone from memory by Friday.

We watched this play out again and again. Ten, twenty, thirty messages per failure. Multiple senior engineers pulled into a thread whose only purpose was recovering information the system already had. Multiply that by the number of failures in a release cycle, and you have a team burning days of engineering time per release on finding out what they already knew.

And release readiness? A person, before every release, would run a script over the bucket to count passes and fails, paste a number into a doc, and answer follow-up questions from memory. Ask about the trend since the last release and you'd get a shrug — the script didn't do trends, and nobody had time to make it.

Nothing was wrong. Everything was missing.

What made this painful to watch is that every individual decision was reasonable. GoogleTest is a fine framework. XML output is the standard. S3 is durable, cheap, and everyone already had credentials. Archiving results is responsible engineering. There was no villain and no mistake.

The problem was that the results were stored, not understood. An S3 bucket is a filing cabinet. It will keep your XML forever and never once tell you that a test has failed four of its last five runs on the same target, or that a component's pass rate has quietly slid from 99% to 94% over the last three sprints. Those questions require the results to be data — normalized, indexed, joined to builds and requirements and history — not files.

And crucially, this team's automation was doing its job. Tests were catching real regressions. But the value of a failing test is only realized when someone can quickly determine what it means. A failure that takes an hour and a Slack thread to interpret is a failure that gets ignored, retried, or waived under release pressure. The visibility gap doesn't just waste time; it silently erodes the value of every test you've written.

What we built into BeyondTest because of this

Because of exactly this experience, we made a decision early: automated results are a first-class citizen, not an attachment.

Ingest results directly. Push GoogleTest, JUnit, pytest, or any JUnit-XML-producing framework into BeyondTest straight from CI. No side pipeline, no scripts, no bucket-diving. Every result lands linked to the build, the target, the milestone, and the test case it belongs to.

Every test has a history. Click any failure and see its full timeline: when it last passed, when it last failed, on which targets, on which builds, with the failure output right there. The "has this failed before?" question is answered in one click instead of one Slack thread.

Release questions have instant answers. How many tests ran, passed, failed, or were skipped on a release. Pass rate by component. Trend against the previous release. Which failures are new versus known. The release-readiness number stops being something a person computes and starts being something the platform shows.

Flakiness surfaces itself. Tests that oscillate get flagged automatically, so a genuinely new regression stands out from background noise, and known-flaky tests can be triaged as their own workstream instead of ambushing every release.

And it stays traceable. For teams doing safety-critical work, every automated result links back through its test case to the requirement it verifies, so the evidence that a requirement was tested — and how it fared over time — is a query, not a reconstruction.

The question worth asking your own team

When an automated test fails, how long does it take your team to know whether it's new?

If the answer is measured in seconds, you're in a good place. If it's measured in Slack messages, your test results are being stored somewhere they can't speak — and every failure is quietly costing you more than the bug itself.

The tests you've written are worth far more than a bucket full of XML.

See automated result ingestion and per-test history in action — the demo is live at beyondtest.ai, no signup required.

The Test Suite That Ran Every Night and Told No One Anything — BeyondTest