How does TestGen verify that a cloud data migration worked?

DataOps TestGen profiles the source database, generates Table Comparison tests from that profile, and runs them on the cloud target, comparing counts, lengths, sums, patterns, and value hashes column by column. In DataKitchen's October 2026 Jaffle Shop migration, a 55-test health suite found 0 failures, while 345 Table Comparison tests found 61, each one a planned change.

Key points

  • DataOps TestGen added Table Comparison tests on October 14, 2026, in both open source and Enterprise: 32 test types generated from a profile of the source and run against the target.
  • In DataKitchen's October 2026 Jaffle Shop migration, the standard 55-test health suite on the target had 0 failures after 483 orders were left behind; the 345-test Table Comparison suite had 61 failures, and every one matched a planned change.
  • Table Comparison catches truncated text through length tests, changed amounts through Sum, Min, Max, and Fractional Sum, stray characters through Non-Printing counts, and any changed value through column value hashes.
  • Value hashes are computed the same way on every database TestGen supports except SAP HANA and Salesforce Data 360, so a suite built on SQL Server runs on Snowflake after transfer.
  • Table Comparison is not a row-by-row diff: in DataKitchen's testing on three public datasets it caught 774 of 785 planted changes, and a failure names the column that changed, not the row.

A cloud migration changes the engine, and that’s where the quiet breakage lives. A text column comes over a few characters short. An amount lands in a column with a different scale. A character that was fine on the old system turns into something else on the new one. The row count still matches, so the cutover meeting goes fine.

A health check can’t see it either. It asks whether the data looks right, and a trimmed string still looks right.

TestGen’s answer is to stop checking whether the target looks healthy and start checking whether it matches the source.

What Table Comparison checks, failure by failure

Table Comparison shipped on October 14, 2026. It profiles the source, records what every column looked like as a baseline, and turns that profile into tests from 32 test types. You run them on the target. The families below come from New in TestGen: Prove Your Data Migration Worked.

What broke in the moveTests that catch it
Rows lost or addedRow Count
Strings truncated or trimmedMinimum, Maximum, and Total Length; Leading Spaces
Amounts changed, rounded, or truncatedMinimum, Maximum, Sum, Standard Deviation, Fractional Sum
Stray characters, case changesNon-Printing and Upper Case counts; Frequent Patterns
Dates clipped or shifted across a time zoneMinimum Date, Maximum Date, Distinct Date Count
Any value changed, even to one of the same lengthText, Numeric, and Date Hash
A value moved to a different rowKeyed Text, Numeric, and Date Hash
A column retypedColumn Type

The hash rows do the heavy lifting. Change one character in one row of a million and the column’s hash sum moves. In the Jaffle Shop run, two trailing spaces in a 10-row table set off 9 failing tests.

The numbers from the Jaffle Shop run

DataKitchen migrated the Jaffle Shop demo database on purpose, split one table in two, fixed some hygiene problems, and left 483 empty orders in quarantine. Then it ran two suites on the target.

Suite on the targetTestsPassedFailedErrors
Standard generated suite (health checks)5536019
Table Comparison suite3451936191

All 61 Table Comparison failures traced to changes the team made on purpose:

Change made on purposeMain tests that caught it
483 empty orders left in quarantineRow Count on orders (61,465 against a baseline of 61,948); Distinct Count; Total Length
Header rows removed from two tablesRow Count off by one on each; Distinct Count, Minimum Length, and Total Length; Text Hash
Trailing spaces trimmed on two productsText Hash, Keyed Text Hash, Maximum Length, Total Length, Frequent Values
13 columns retyped from textMatch Column Type on each one

The 91 errors were text-only tests on retyped columns, which Match Column Type had already flagged, so you deactivate them on the target. The 345 tests ran in five seconds. Run them after every mock load, not once at cutover.

Source and target engines

Both sides of that example were Postgres. Most cloud migrations change engines, and the post names the usual ones: SQL Server to Snowflake, Oracle to Databricks, an on-premises warehouse to BigQuery. The tests run as SQL on the target, and hashing is canonical across engines. Numbers round to six decimal places and dates truncate to the second in UTC.

Two engines are the exception. On SAP HANA and Salesforce Data 360, TestGen doesn’t generate the hash tests. Every other database TestGen supports, including Oracle and BigQuery, plus DuckDB and file sources, gets the full set. The databases answer has the list, and every one works in both editions.

Some engine differences fail on a correct copy. Text hashes need UTF-8 collations on SQL Server, which means SQL Server 2019 or later, or Azure SQL. Oracle pads CHAR columns. CSV files read empty fields as nulls. Deactivate those tests on the target. Don’t loosen them.

What it won’t tell you

Table Comparison isn’t a row-by-row diff. It never moves data between systems, so a failure names the column, not the row. In DataKitchen’s testing on three public datasets with 785 planted changes, it caught 774. The misses were binary columns, type changes inside the same general type, and values swapped across a composite key. The TestGen docs add two more: values swapped between rows of a table with no key column, and numeric changes that vanish when rounded to six decimal places. If your migration risks one of those, write a specific test for it.

It also can’t tell an intended change from a mistake. That’s what a written list of expected differences is for, and validating a migration with a small team covers that list, the mapping file, and the sign-off. Before any of it, profile the source and keep the snapshot. Your legacy data has problems, and the snapshot is how you prove which ones you inherited. Validation needs that comparison between source and target. A target checked on its own can only tell you it looks fine.

Frequently asked questions

Short answers to the follow-up questions people ask next.

Which databases get TestGen's value hash tests?

Every database TestGen supports except SAP HANA and Salesforce Data 360, plus DuckDB and file data sources. The hashes are canonical across engines: numbers round to six decimal places and dates truncate to the second in UTC, so a suite built on SQL Server runs on Snowflake after the transfer. DataKitchen's published October 2026 example moved Postgres to Postgres, so try a cross-engine pair on a small table first.

Why do hash tests catch changes that length tests miss?

A length test only sees a change in the number of characters. A value hash sees any change, even one that keeps the length. With Profile for table comparison turned on, TestGen hashes every value and stores each column's sum, so changing one character in one row of a million moves it. In DataKitchen's October 2026 Jaffle Shop run, two trailing spaces in a 10-row table set off 9 failing tests.

Which engine differences show up as false failures?

A few, and DataKitchen's TestGen docs list them. SQL Server needs UTF-8 collations for text hashes, so SQL Server 2019 or later, or Azure SQL. A case-insensitive collation on one side changes Distinct Count. Oracle pads CHAR columns. CSV files read an empty field as a null where a database keeps an empty string. Deactivate those tests on the target instead of loosening them.

Does Table Comparison copy data between the source and the cloud target?

No. TestGen profiles the source where it lives, runs the tests as queries on the target where it lives, and compares the results. No rows move between systems, which is why the tests work across engines and on large tables. The trade-off is that a failure tells you which column changed, not which row. DataKitchen's tests on three public datasets caught 774 of 785 planted changes.

Is Table Comparison included in open-source TestGen?

Yes. Table Comparison shipped on October 14, 2026, in both TestGen open source and TestGen Enterprise. Open source covers one user, one connection, and one project. If your source and target need two TestGen connections, that is TestGen Enterprise, at $100 per user and $100 per connection per month as of October 2026.

Try it on your own data

DataOps TestGen is free and open source. Profile a table and generate its tests this afternoon.