All articles
Data & ETL Testing August 7, 2026 8 min read By the QA Tech Xperts practice

Row Counts Are Not Data Validation

The pipeline ran green, the counts matched, and the number in the report is still wrong. Why job status is not data quality, and what to check instead.

Row Counts Are Not Data Validation

Ask a data team how they know last night's load was correct and the answer is usually some version of: the job succeeded and the row counts match. Both statements are true and neither is about the data.

A pipeline reports success when the code finished without raising. That is a claim about execution. Whether the values that landed mean what they meant at the source is a different question, and nothing in a green run has asked it.

Key Takeaways

  • Job status is a statement about code, not about data. Green runs and correct data are independent variables.
  • Row counts survive precision loss, truncation, coercion, and compensating errors that cancel out numerically.
  • Test transformations against the mapping specification, not against the pipeline's own previous output, which only proves the code is consistent with itself.
  • Most data defects are found by consumers, months later, in a report. By then the values have been replicated and trusted.
  • The fix is unglamorous, re-runnable assertions in CI, and it pays for itself the first time it catches a rounding rule.

What a green run does not tell you

Consider a load that moves order totals from an operational database into a warehouse. The job runs, the counts match, the dashboard refreshes. Any of the following can be true at the same time:

  • Every amount was rounded from four decimal places to two, shifting totals by a fraction of a percent that compounds across millions of rows.
  • A currency column was joined on a code that changed case, so a subset silently defaulted to the reporting currency.
  • Two hundred rows failed a constraint, were routed to a rejects table nobody monitors, and two hundred rows from a previous day's replay took their place in the count.
  • A transformation that should have excluded cancelled orders excluded refunded ones instead, because the specification used both words and the implementer picked one.

The last is the important category. It is not a data movement failure at all, it is a logic defect, and it will be reproduced perfectly on every subsequent run. Comparing today's output against yesterday's confirms only that the pipeline is consistently doing the same thing.

Test against the specification, not against yourself

This is the single most valuable change most teams can make. A transformation should be verified against the mapping specification that defines what it is supposed to do, expressed as assertions a human can read, rather than against a snapshot of its own earlier behaviour.

It is more work up front, because it forces the specification to be precise enough to test, and that is exactly where the value is. The ambiguity between 'cancelled' and 'refunded' surfaces while someone is writing the assertion, not during a quarter-end review.

A minimum set worth having

None of this is difficult. It is version-controlled SQL and a little Python, running in the pipeline rather than in a quarterly Manual reconciliation that eventually stops happening. The hard part is deciding it is worth doing before something expensive proves it was.

  • Reconciliation: counts by partition, plus checksums and aggregate comparison on the columns that carry money, identity or time.
  • Integrity: uniqueness where uniqueness is claimed, referential checks across tables, and an explicit assertion about what NULL is allowed to mean.
  • Distribution: compare the shape of key columns against the source, which catches truncation and coercion that totals can hide.
  • Freshness: assert the effective date of the data, not the load time of the job, which are different numbers that are frequently confused.
  • Schema drift: compare environments and fail on unexpected differences before they reach production.

The organisational tell

If two dashboards disagree and the conversation is about which team's number to trust rather than which pipeline is wrong, the data layer has no tests. That is not a criticism of the people, it is a description of what happens when correctness is nobody's explicit deliverable.

We build reconciliation suites that live in your repository and run on every load, and we hand back findings in writing, including the ones that are awkward. That is what ETL and data warehouse Testing is for, and an assessment on a single pipeline is usually enough to show whether it is a problem worth funding.

Want us to run this on your product?

A free 30-minute assessment. We'll tell you what's working, what's costing you time, and where to start. Findings delivered within days.

Get a Free QA Assessment

Keep reading

Questions

Working With Us

Straight answers, written the way we'd say them on a call.

Still curious? Talk to us

Start with a conversation

Ready to Ship With Confidence?

Tell us what you're building, we'll tell you exactly how we'd test it.

  • A Senior Engineer replies, not a sales layer
  • Within one business day, every time
  • NDA available before you share any details

16+

Years QA leadership

The founder's enterprise QA career across OTT, SaaS, e-commerce and regulated utilities. Not a team total.

17

Testing disciplines

Each one has its own page, scope and deliverables. Counted from that list, never typed by hand.

6

Markets served

Availability, not delivery history. Each market's page says plainly where we have clients and where we do not.

1

Business day to reply

A Senior Engineer answers, not an autoresponder or a scheduler.

Tell us where quality hurts

Prefer to talk? Book a 30-minute call