Test Data Generator

To generate test data, pick a preset or build a schema field by field, watch the preview update as you type, and download up to a million rows. The addresses agree with each other, the emails match the names they belong to, and the same seed regenerates the same file forever, which is what makes a fixture worth keeping. Everything runs in this tab.

Fake data is easy. Coherent fake data is not.

Any tool can print random strings into a grid. The problems show up the moment somebody looks at the output:

  • Addresses assembled from parts that never met. The classic failure is a row that reads Springfield, Texas 90210 with coordinates in the North Atlantic, because city, state, ZIP and lat/lng were each drawn independently. Here each row picks one real place and every location field reads from it. Denver comes with Colorado, ZIP 802xx, area code 303 and coordinates that land on the city.
  • Emails that ignore the name column. A row for Maria Gonzalez with the email todd.baker81@gmail.com fails the sniff test in any demo. The email field here is built from the names in the same row.
  • Data that cannot be reproduced. Test fixtures generated with one-off randomness have to be checked into the repo as files, and a flaky test cannot be rerun against the exact rows that broke it. A visible seed fixes both: same schema, same seed, byte-identical output.
  • Row-count paywalls. The best-known generator stops at 1,000 rows on the free tier, another at 500. A load test needs six figures. Client-side generation has no marginal cost, so the ceiling here is a million rows per download.
  • Suspiciously perfect data. Production tables have gaps and lopsided distributions. Every field takes a blank percentage, and list values take weights, so a status column can be 85% settled, 10% pending, 5% failed, the way the real one is.

Worked example: an orders table in four clicks

Click the E-commerce orders preset. The grid fills with ten fields and the preview immediately shows rows like this:

order_id,customer,email,product,quantity,unit_price,order_date,status,ship_city,ship_zip
ORD-10001,Kathleen Chen,kathleen.chen@icloud.com,Desk Lamp,2,341.90,2026-08-06,delivered,Tampa,33619
ORD-10002,Omar Reyes,omar_reyes@outlook.com,Power Bank,1,63.71,2026-05-19,shipped,Boise,83777
ORD-10003,Emma Walsh,emma.walsh4@gmail.com,Ring Light,3,207.14,2026-07-30,delivered,Omaha,68127

Three things are worth noticing. The order IDs run in sequence because that field is a row number with a prefix, not a random string. The status column leans heavily toward delivered because the preset weights it 60/20/12/5/3. And the order dates cluster toward recent weeks because the date field has its skew-recent switch on, which is how real order tables look.

From there, edit anything. Change the row count to 100,000 for a load test. Switch the format to SQL inserts and pick your dialect. Add a blank percentage to the email field to simulate incomplete records. Every change redraws the preview, and none of it requires an account.

The field types

Thirty-odd types, grouped the way you reach for them. The short version:

  • Identity: row numbers with start, step, prefix and zero-padding (ORD-00042), UUIDs, and a pattern type where # is a digit, ? a letter and * either, which covers SKUs, license plates and account numbers.
  • People: first, last and full names, emails and usernames derived from them, phone numbers whose area code matches the row's city, and job titles.
  • Places: street, city, state, ZIP, country, latitude and longitude, all reading from the same drawn place per row.
  • Numbers and time: integers and decimals with ranges, money with a currency symbol, dates with a from/to window, five output formats including Unix epoch, and an optional skew toward recent.
  • Choices: booleans with a true percentage and three output styles, and custom lists where each line is a value with an optional weight, pasted straight in.
  • Everything else: companies, departments, products, lorem text by word, sentence or paragraph, URLs, domains, IPv4 and MAC addresses, user agents and colors.

Thirteen formats out, one schema in

The same rows serialize to whatever the thing downstream wants:

  • CSV and TSV with correct quoting, for spreadsheets and importers.
  • JSON and JSON Lines with real types: numbers arrive as numbers, booleans as booleans, blanks as null, not as the string "null".
  • SQL inserts in Postgres, MySQL, SQLite or SQL Server quoting, batched 500 rows per statement, with an optional CREATE TABLE on top. Paste it straight into a console.
  • Excel as a real .xlsx workbook, capped at 200,000 rows to keep the tab responsive.
  • Parquet, DuckDB, SQLite and Arrow are written by the real engines, in your browser. The Parquet comes out of DuckDB's own writer with Snappy compression, the .duckdb is a native database file, the .sqlite opens in any SQLite client, and the Arrow file uses the uncompressed IPC layout browser readers expect. No other free generator produces these.
  • XML, Markdown and HTML tables for feeds, docs and quick embedding.
  • Or skip the file entirely. Open in Data Explorer hands the generated rows straight to the full app for filtering, charting and every other export.

Frequently Asked Questions

How many rows can I generate?

One million per download for the text formats, with no sign-up and no daily allowance. Excel output stops at 200,000 rows because building a workbook that size in a tab costs far more memory than the equivalent CSV. Mockaroo's free tier stops at 1,000 rows and generatedata at 500, which is exactly why this page exists.

What does the seed do?

It makes the data reproducible. The same schema with the same seed produces byte-identical output every time, on any machine, so a fixture you commit to a repo can be regenerated instead of stored, and a bug report can say seed 4711 and mean something. The dice button picks a new seed when you want fresh values.

Do the addresses actually make sense?

Yes, and this is rarer than it should be. Each row draws one real place, and every location field reads from it: Denver arrives with Colorado, a ZIP starting 802, coordinates near 39.7°N and a phone number in area code 303. Most generators, including the faker library, draw each field independently and produce a city in one state, a ZIP from another and coordinates in the ocean. Emails work the same way: the address is built from the name two columns over.

Which output formats are supported?

Thirteen: CSV, TSV, JSON, JSON Lines, SQL INSERT statements with a dialect switch for Postgres, MySQL, SQLite and SQL Server plus an optional CREATE TABLE, Excel (.xlsx), Parquet, a native DuckDB database file, a SQLite database file, Arrow/Feather, XML, a Markdown table and an HTML table. The database and columnar formats are written by real engines running in your browser - DuckDB-WASM for Parquet and .duckdb, SQLite-WASM for .sqlite - so the files are the genuine article, not lookalikes.

Does any of this data leave my browser?

No. The generator is JavaScript running in your tab. There is no upload, no server-side generation and no account. The schema you build is encoded into the page URL so you can bookmark or share it, and that string contains only your field definitions, never generated rows.

Can I make blank values and messy data on purpose?

Yes. Every field has a blank percentage, and each field blanks independently, so 10% blank on three columns gives you rows with any combination of gaps rather than whole rows going missing at once. Weighted lists let you skew a status column 85/10/5 the way production data actually looks.

Stop hand-typing test rows

Free, no account, no upload, no row-count paywall. Pick a preset, set a seed, take the file.

Back to the generator