Test Data Generator

Make realistic fake data for testing, with bad records mixed in when you want them: up to 5 million rows as CSV, JSON or SQL INSERT statements. Made in your browser, nothing uploaded.

Format
A dot in a column name makes a nested object: address.city → {"address": {"city": …}} Database Table

Columns

Gotchas

Mistakes put into some rows on purpose, to test how your code copes with bad data.

Preview

The data is made by your browser, from built-in word lists: nothing is uploaded and no real person's details are used. Up to 5 million rows per file.

About the Test Data Generator

Testing a form, an import, a report or a database needs data that looks real without being real. Describe the columns you need, pick a format, and download as many rows as you want: names, emails, phone numbers, addresses, amounts, dates, statuses, IDs and more.

What makes it useful for testing

FeatureWhat it does
Same seed, same dataThe seed decides every value. Share the link and a teammate gets exactly the same rows, so a failing test can be reproduced.
Rows that hang togetherIn one row the name, email, city, state, ZIP or PIN code and phone number belong together: an Indian name gets an Indian city and a +91 number.
Unique valuesTick Unique for emails, order numbers or IDs. If a column cannot hold that many different values, you are told before anything is made.
Empty valuesSet what share of a column is left empty, to test how your code handles missing data.
GotchasPut mistakes into chosen rows on purpose: empty values, a date in another format, a time without seconds, a separator or quote inside a value, a row with too few or too many values, a duplicate row, injection strings and more. A list of where each one went downloads with the file.
Templates you keepSave template downloads the columns and settings as a small JSON file; Open template loads it again later, on any computer.
Any separatorsComma, semicolon, tab or pipe between columns, or type your own, such as || or \x1f; lines can end in CRLF, LF, CR or text you choose.
Weighted listspaid:70, failed:20, refunded:10 gives roughly 70% paid, 20% failed and 10% refunded.
Patterns# is a digit, ? a capital letter, * a letter or digit: ORD-##### gives ORD-40817.
SQL ready to runINSERT statements for PostgreSQL, MySQL or SQLite in batches of 500 rows, with a CREATE TABLE that matches the columns.

Testing with bad data

Good data only shows that the happy path works. Real files arrive with a missing value, a date written the other way round, a comma where it should not be, the same row twice or a line that was cut short. Gotchas put those mistakes into the rows you choose, in any amount, and the gotcha list tells you the line and row of each one, so a test can check that every bad record is reported, skipped or fixed, and that the good records still load.

Safe by design

Emails use the example.com, example.org and example.net domains, which are reserved for examples, so no real inbox receives mail. US phone numbers use the 555-0100 to 555-0199 range set aside for fiction. Card numbers are the published test numbers that payment providers give for sandboxes, never random numbers that could belong to a real card. India has no reserved phone range, so +91 numbers are random and should not be called or messaged.

Questions

Is this test data generator free?

Yes, with no sign-up and no row limit beyond what one file can hold: up to 5 million rows. The data is made by your own browser, so there is no server cost to pass on.

Which formats can I download?

CSV (with comma, semicolon, tab or pipe as the separator), JSON, JSON Lines and SQL INSERT statements for PostgreSQL, MySQL or SQLite. For SQL you can also get a CREATE TABLE that matches the columns.

How do I generate SQL insert statements with fake data?

Choose SQL as the format, pick your database and type the table name. The file starts with CREATE TABLE (you can turn it off) and then INSERT statements of 500 rows each, with text quoted and escaped for that database, empty values written as NULL and true/false as the database expects.

Can I get the same data again?

Yes. The seed decides every value: the same seed and columns always give the same rows, on any computer. Copy link saves your columns and seed in a link you can send to a teammate.

What is the seed?

The seed is the starting point for the random values. The same seed with the same columns always makes exactly the same rows, on any computer, so a test that failed can be run again with the same data. Type any word, or press the dice for a new one.

Can I save my columns as a template?

Yes. Save template downloads your columns, settings and seed as a small JSON file. Open template loads it again later or on another computer, so you can keep it with your project. Copy link does the same through a link: the settings travel in the part after #, which browsers do not send to any server.

Can I use my own column and line separators?

Yes. Besides comma, semicolon, tab and pipe you can type any separator, such as || or \x1f, and end lines with CRLF, LF, CR or text of your own. Write \t for a tab, \n for a new line and \xHH for any byte. A value that contains a separator is put in double quotes.

How do I generate a CSV file with errors for testing?

Build your columns, choose CSV, then add Gotchas: for example a row with fewer values, a comma inside a value without quotes, a stray double quote, a blank line, an empty required value or a date in another format. Download the file, then ⇩ Gotcha list for the line number of each error, to check that your import reports every one.

What is negative test data?

Data that is wrong on purpose, used to check that a program rejects or handles it instead of crashing or saving it silently: missing values, values of the wrong type, impossible dates, duplicates, over-long text or malformed rows. Gotchas add it to otherwise realistic data, in the rows you choose.

Can I put bad records in the file on purpose?

Yes, with Gotchas. Choose a mistake, the column and how many rows (at random, a share of rows, the first rows or row numbers you type): empty values, spaces around a value, a line break or double quotes inside a value, a separator inside a value with or without quotes, a very long value, emoji and other scripts, text in a number column, injection test strings, a time without seconds, a date in another format, an impossible date, a duplicate row, and in CSV a row with fewer or extra values, a stray quote or a blank line. After the download, ⇩ Gotcha list gives the line and row number of each one, so you know what your code should catch.

Is the data real?

No. Names, streets and companies are picked from built-in lists and put together at random, so a row is not a real person. Emails use example.com, example.org and example.net, which are reserved for examples; US phone numbers use the 555-0100 to 555-0199 range set aside for fiction; card numbers are the published test numbers payment providers give for sandboxes.

How do I make nested JSON?

Put a dot in the column name. Columns called address.city and address.postcode become {"address": {"city": …, "postcode": …}} in JSON and JSON Lines. In CSV and SQL the name is used as it is.

Can I make fake data for India?

Yes. Set Region to India for Indian names, cities, states, 6-digit PIN codes and +91 mobile numbers, or Mixed for a blend of Indian and US rows. Within a row the name, city, state, PIN code and phone number belong together.

How are unique values and empty values handled?

Tick Unique and no value repeats in that column; if the column cannot hold that many different values, for example a number from 1 to 100 for 1,000 rows, you are told before anything is made. Empty % leaves that share of the column empty: an empty cell in CSV, null in JSON, NULL in SQL.

How fast is it?

The values are made by a small engine compiled to WebAssembly and running in the background, so the page stays usable. A million rows of a typical ten-column table takes a few seconds on a laptop.