Генератор тестовых данных
Генерируйте данные, проходящие валидацию: карты по Луну, IBAN с mod-97, настоящие UUID. С сидом и воспроизводимо — JSON, CSV, NDJSON или SQL.
[
{
"id": "018cc251-f400-79a7-abdf-9623646f1963",
"first_name": "Ruby",
"last_name": "Long",
"email": "[email protected]",
"country": "IE",
"created_at": "2024-04-13T08:13:34Z",
"last_seen_at": null,
"is_active": true
},
{
"id": "018cc251-f7e8-7727-8c38-6095cbcabdb9",
"first_name": "Ellen",
"last_name": "Hoffman",
"email": "[email protected]",
"country": "US",
"created_at": "2024-06-28T10:45:21Z",
"last_seen_at": "2024-10-31T16:44:09Z",
"is_active": false
},
{
"id": "018cc251-fbd0-7056-ad40-e80a775668cc",
"first_name": "Keith",
"last_name": "Hudson",
"email": "[email protected]",
"country": "AR",
"created_at": "2025-08-11T01:04:04Z",
"last_seen_at": "2025-09-19T15:18:41Z",
"is_active": true
},
{
"id": "018cc251-ffb8-74a1-b4c8-83cc6bd2ae90",
"first_name": "Thomas",
"last_name": "Moore",
"email": "[email protected]",
"country": "BE",
"created_at": "2025-02-21T16:27:55Z",
"last_seen_at": "2025-04-28T03:30:59Z",
"is_active": true
},
{
"id": "018cc252-03a0-7309-8795-f9f277a8f8c0",
"first_name": "Benjamin",
"last_name": "Austin",
"email": "[email protected]",
"country": "MX",
"created_at": "2024-06-15T11:04:56Z",
"last_seen_at": "2025-06-30T22:00:26Z",
"is_active": true
},
{
"id": "018cc252-0788-7658-937d-58b138c92232",
"first_name": "Barbara",
"last_name": "Flores",
"email": "[email protected]",
"country": "GR",
"created_at": "2024-04-17T19:41:08Z",
"last_seen_at": "2025-01-13T23:55:46Z",
"is_active": true
},
{
"id": "018cc252-0b70-7c3a-96ae-719ee90a05af",
"first_name": "Allen",
"last_name": "Vazquez",
"email": "[email protected]",
"country": "NG",
"created_at": "2024-09-18T13:23:49Z",
"last_seen_at": "2026-05-04T06:32:51Z",
"is_active": false
},
{
"id": "018cc252-0f58-7dfd-8623-52572f04ce20",
"first_name": "Harry",
"last_name": "Nichols",
"email": "[email protected]",
"country": "SG",
"created_at": "2026-06-26T14:48:47Z",
"last_seen_at": "2026-06-30T12:56:13Z",
"is_active": false
},
{
"id": "018cc252-1340-738f-b536-279444cb4512",
"first_name": "Elaine",
"last_name": "Wagner",
"email": "[email protected]",
"country": "UA",
"created_at": "2025-05-09T14:48:44Z",
"last_seen_at": "2026-05-19T14:58:47Z",
"is_active": true
},
{
"id": "018cc252-1728-7d96-8856-b87ee9d904e9",
"first_name": "Fred",
"last_name": "Fisher",
"email": "[email protected]",
"country": "JP",
"created_at": "2025-11-25T05:27:13Z",
"last_seen_at": "2026-04-04T05:36:09Z",
"is_active": true
},
{
"id": "018cc252-1b10-7baa-a79b-9567cf1366fd",
"first_name": "Lois",
"last_name": "Nelson",
"email": "[email protected]",
"country": "FR",
"created_at": "2025-05-08T16:32:25Z",
"last_seen_at": null,
"is_active": true
},
{
"id": "018cc252-1ef8-7c8c-b859-cea655faef9c",
"first_name": "Mark",
"last_name": "Cunningham",
"email": "[email protected]",
"country": "FI",
"created_at": "2026-02-21T11:09:02Z",
"last_seen_at": null,
"is_active": true
},
{
"id": "018cc252-22e0-77bf-bc1c-40120a5b29c4",
"first_name": "Anne",
"last_name": "Flores",
"email": "[email protected]",
"country": "KR",
"created_at": "2025-08-02T22:55:20Z",
"last_seen_at": "2025-10-27T03:27:52Z",
"is_active": true
},
{
"id": "018cc252-26c8-7220-9453-1804e8ce88c4",
"first_name": "Arthur",
"last_name": "Crawford",
"email": "[email protected]",
"country": "PL",
"created_at": "2025-02-26T04:55:03Z",
"last_seen_at": "2025-07-25T07:05:17Z",
"is_active": true
},
{
"id": "018cc252-2ab0-75a8-8a2b-28833306b87c",
"first_name": "Ronald",
"last_name": "Hansen",
"email": "[email protected]",
"country": "KR",
"created_at": "2025-03-09T06:31:44Z",
"last_seen_at": "2026-01-04T03:11:24Z",
"is_active": true
},
{
"id": "018cc252-2e98-7c38-93e2-9f80d039eb75",
"first_name": "Donna",
"last_name": "Porter",
"email": "[email protected]",
"country": "IE",
"created_at": "2026-01-12T06:55:22Z",
"last_seen_at": null,
"is_active": true
},
{
"id": "018cc252-3280-77a0-8152-8f5a9584a581",
"first_name": "Carol",
"last_name": "Wells",
"email": "[email protected]",
"country": "PL",
"created_at": "2025-07-20T23:09:02Z",
"last_seen_at": "2026-01-24T23:04:38Z",
"is_active": true
},
{
"id": "018cc252-3668-7208-8bbe-619dada6b7e0",
"first_name": "Sheila",
"last_name": "Lee",
"email": "[email protected]",
"country": "PT",
"created_at": "2025-01-05T20:09:52Z",
"last_seen_at": "2025-04-08T12:02:09Z",
"is_active": false
},
{
"id": "018cc252-3a50-7b11-9261-0c17e909f6fb",
"first_name": "Jack",
"last_name": "Evans",
"email": "[email protected]",
"country": "KE",
"created_at": "2025-12-29T14:31:00Z",
"last_seen_at": "2026-03-28T14:30:43Z",
"is_active": true
},
{
"id": "018cc252-3e38-7f22-8cc7-0dd649d26379",
"first_name": "Randy",
"last_name": "Harris",
"email": "[email protected]",
"country": "GB",
"created_at": "2026-06-26T19:25:04Z",
"last_seen_at": "2026-06-30T08:39:51Z",
"is_active": true
},
{
"id": "018cc252-4220-7e86-8dae-b25b4f837713",
"first_name": "Josephine",
"last_name": "Castro",
"email": "[email protected]",
"country": "DK",
"created_at": "2024-02-07T22:33:55Z",
"last_seen_at": "2026-02-23T13:56:30Z",
"is_active": true
},
{
"id": "018cc252-4608-7120-abd5-535883ca01b9",
"first_name": "Edith",
"last_name": "Graham",
"email": "[email protected]",
"country": "CN",
"created_at": "2024-04-29T08:59:26Z",
"last_seen_at": "2024-06-17T10:20:45Z",
"is_active": true
},
{
"id": "018cc252-49f0-77f7-9bf9-17e87b0a09c6",
"first_name": "Tracy",
"last_name": "Willis",
"email": "[email protected]",
"country": "PT",
"created_at": "2024-03-21T07:42:06Z",
"last_seen_at": null,
"is_active": true
},
{
"id": "018cc252-4dd8-75c8-8b04-1e0fb891e435",
"first_name": "Irene",
"last_name": "Larson",
"email": "[email protected]",
"country": "AT",
"created_at": "2025-06-04T15:01:38Z",
"last_seen_at": null,
"is_active": true
},
{
"id": "018cc252-51c0-7be0-a6ca-12bc704a2b3f",
"first_name": "Betty",
"last_name": "Morrison",
"email": "[email protected]",
"country": "ID",
"created_at": "2025-11-11T21:56:19Z",
"last_seen_at": "2026-03-29T03:33:49Z",
"is_active": true
},
{
"id": "018cc252-55a8-736d-a7b2-8bec744ecf74",
"first_name": "Kevin",
"last_name": "Cox",
"email": "[email protected]",
"country": "GR",
"created_at": "2025-10-06T23:28:21Z",
"last_seen_at": null,
"is_active": false
},
{
"id": "018cc252-5990-73ca-a2d3-89bf2b8eb5f6",
"first_name": "Sean",
"last_name": "Carr",
"email": "[email protected]",
"country": "KR",
"created_at": "2026-02-19T23:27:53Z",
"last_seen_at": "2026-03-02T22:16:30Z",
"is_active": true
},
{
"id": "018cc252-5d78-79e2-bd4d-d8b6867867dc",
"first_name": "Heather",
"last_name": "Ferguson",
"email": "[email protected]",
"country": "IL",
"created_at": "2024-07-07T01:39:16Z",
"last_seen_at": "2025-09-21T19:17:00Z",
"is_active": false
},
{
"id": "018cc252-6160-78f8-a9af-d73b74581b86",
"first_name": "Rose",
"last_name": "Chen",
"email": "[email protected]",
"country": "DE",
"created_at": "2024-09-07T16:16:48Z",
"last_seen_at": "2024-10-02T08:29:39Z",
"is_active": true
},
{
"id": "018cc252-6548-71f0-ab4f-c824fd842a67",
"first_name": "Maria",
"last_name": "Brooks",
"email": "[email protected]",
"country": "FR",
"created_at": "2024-06-29T06:22:30Z",
"last_seen_at": "2025-12-22T00:38:13Z",
"is_active": true
},
{
"id": "018cc252-6930-7067-b516-480051493ec0",
"first_name": "Donna",
"last_name": "Hamilton",
"email": "[email protected]",
"country": "IE",
"created_at": "2024-09-01T09:09:40Z",
"last_seen_at": "2025-03-29T23:26:22Z",
"is_active": false
},
{
"id": "018cc252-6d18-7de1-bae1-21dc471405fa",
"first_name": "Rachel",
"last_name": "Wagner",
"email": "[email protected]",
"country": "IE",
"created_at": "2026-05-31T02:06:02Z",
"last_seen_at": "2026-06-17T16:37:27Z",
"is_active": false
},
{
"id": "018cc252-7100-752d-bc4e-c4e5bd755743",
"first_name": "Philip",
"last_name": "Jones",
"email": "[email protected]",
"country": "NO",
"created_at": "2024-10-21T12:22:35Z",
"last_seen_at": "2025-02-15T07:00:10Z",
"is_active": true
},
{
"id": "018cc252-74e8-7b4d-b9cf-4e8e03d1e269",
"first_name": "Bonnie",
"last_name": "Carter",
"email": "[email protected]",
"country": "PT",
"created_at": "2026-05-28T06:16:25Z",
"last_seen_at": "2026-06-26T21:36:12Z",
"is_active": true
},
{
"id": "018cc252-78d0-708b-a96f-d9f474e95238",
"first_name": "Douglas",
"last_name": "Evans",
"email": "[email protected]",
"country": "NG",
"created_at": "2024-02-18T20:36:33Z",
"last_seen_at": "2024-10-31T01:37:50Z",
"is_active": true
},
{
"id": "018cc252-7cb8-7865-96fa-e9681611dbed",
"first_name": "Theresa",
"last_name": "Larson",
"email": "[email protected]",
"country": "NZ",
"created_at": "2024-11-21T08:57:18Z",
"last_seen_at": null,
"is_active": true
},
{
"id": "018cc252-80a0-7eca-80cd-7159faf3467f",
"first_name": "Gladys",
"last_name": "Reyes",
"email": "[email protected]",
"country": "NG",
"created_at": "2024-04-27T11:34:46Z",
"last_seen_at": "2026-03-09T18:39:31Z",
"is_active": true
},
{
"id": "018cc252-8488-76b2-9271-dabf0da27b4f",
"first_name": "Bonnie",
"last_name": "Cook",
"email": "[email protected]",
"country": "AT",
"created_at": "2024-01-13T17:42:35Z",
"last_seen_at": null,
"is_active": true
},
{
"id": "018cc252-8870-70d0-ab33-72cd838e6603",
"first_name": "Diane",
"last_name": "Wells",
"email": "[email protected]",
"country": "NZ",
"created_at": "2024-05-02T11:22:23Z",
"last_seen_at": null,
"is_active": true
},
{
"id": "018cc252-8c58-725c-980d-f206b971497b",
"first_name": "Gloria",
"last_name": "Woods",
"email": "[email protected]",
"country": "IT",
"created_at": "2025-06-27T01:56:54Z",
"last_seen_at": "2025-09-04T17:13:00Z",
"is_active": true
},
{
"id": "018cc252-9040-786d-90d1-5c9bae512dbf",
"first_name": "Alan",
"last_name": "Rodriguez",
"email": "[email protected]",
"country": "DK",
"created_at": "2026-03-29T17:48:08Z",
"last_seen_at": null,
"is_active": true
},
{
"id": "018cc252-9428-7b58-8dde-508b603b97d8",
"first_name": "Leonard",
"last_name": "Jones",
"email": "[email protected]",
"country": "MX",
"created_at": "2026-02-06T22:38:18Z",
"last_seen_at": "2026-04-27T00:46:32Z",
"is_active": true
},
{
"id": "018cc252-9810-7c69-8024-23852691d72c",
"first_name": "Maria",
"last_name": "Davis",
"email": "[email protected]",
"country": "JP",
"created_at": "2025-03-30T14:01:05Z",
"last_seen_at": "2025-04-24T10:25:01Z",
"is_active": true
},
{
"id": "018cc252-9bf8-7e3a-a37a-06b1a661a0dc",
"first_name": "Carl",
"last_name": "Duncan",
"email": "[email protected]",
"country": "KE",
"created_at": "2026-03-30T06:02:52Z",
"last_seen_at": "2026-05-16T00:15:55Z",
"is_active": false
},
{
"id": "018cc252-9fe0-7a01-8a38-5d3e36f9eca3",
"first_name": "Phillip",
"last_name": "Harrison",
"email": "[email protected]",
"country": "DK",
"created_at": "2024-07-12T01:56:26Z",
"last_seen_at": "2026-05-28T21:32:17Z",
"is_active": true
},
{
"id": "018cc252-a3c8-7977-a212-1c82b978ccbe",
"first_name": "Kim",
"last_name": "Franklin",
"email": "[email protected]",
"country": "KE",
"created_at": "2024-09-23T15:16:03Z",
"last_seen_at": "2025-08-20T03:29:07Z",
"is_active": true
},
{
"id": "018cc252-a7b0-78f6-bb2a-d194bc638e71",
"first_name": "Patrick",
"last_name": "Coleman",
"email": "[email protected]",
"country": "ID",
"created_at": "2025-01-06T09:04:26Z",
"last_seen_at": "2025-07-21T22:36:07Z",
"is_active": true
},
{
"id": "018cc252-ab98-7b5b-8f5c-8b6a21b71208",
"first_name": "Harry",
"last_name": "Martin",
"email": "[email protected]",
"country": "ES",
"created_at": "2026-02-21T17:42:10Z",
"last_seen_at": "2026-05-16T20:52:12Z",
"is_active": true
},
{
"id": "018cc252-af80-7504-8719-59c6e3efd9c3",
"first_name": "Carlos",
"last_name": "Gibson",
"email": "[email protected]",
"country": "ZA",
"created_at": "2024-01-14T06:39:34Z",
"last_seen_at": null,
"is_active": true
},
{
"id": "018cc252-b368-7525-9a9c-a09c2f8c2c8b",
"first_name": "Jean",
"last_name": "Morales",
"email": "[email protected]",
"country": "CA",
"created_at": "2025-06-05T13:13:54Z",
"last_seen_at": "2025-07-18T07:30:36Z",
"is_active": true
},
{
"id": "018cc252-b750-76bd-81cc-42435c3231bd",
"first_name": "Ernest",
"last_name": "Cooper",
"email": "[email protected]",
"country": "FR",
"created_at": "2026-06-30T05:15:30Z",
"last_seen_at": "2026-06-30T22:07:31Z",
"is_active": true
},
{
"id": "018cc252-bb38-7a65-8fdd-29417173ce08",
"first_name": "John",
"last_name": "Wallace",
"email": "[email protected]",
"country": "GR",
"created_at": "2024-01-01T11:53:11Z",
"last_seen_at": "2025-05-13T01:10:51Z",
"is_active": false
},
{
"id": "018cc252-bf20-7253-a075-e01c6d997ffd",
"first_name": "Lee",
"last_name": "Brooks",
"email": "[email protected]",
"country": "AU",
"created_at": "2024-03-20T07:03:24Z",
"last_seen_at": "2025-04-29T10:30:14Z",
"is_active": true
},
{
"id": "018cc252-c308-7709-a61e-916f4cb44f86",
"first_name": "Antonio",
"last_name": "Evans",
"email": "[email protected]",
"country": "JP",
"created_at": "2025-09-17T01:49:49Z",
"last_seen_at": "2026-04-27T19:54:08Z",
"is_active": true
},
{
"id": "018cc252-c6f0-7095-be95-c60913b0062d",
"first_name": "Jose",
"last_name": "Porter",
"email": "[email protected]",
"country": "ZA",
"created_at": "2024-06-01T00:33:54Z",
"last_seen_at": "2024-09-30T08:59:58Z",
"is_active": false
},
{
"id": "018cc252-cad8-7565-b5d8-117f4a6fb217",
"first_name": "Eric",
"last_name": "Ward",
"email": "[email protected]",
"country": "TR",
"created_at": "2024-03-06T08:01:45Z",
"last_seen_at": "2024-10-07T12:38:03Z",
"is_active": true
},
{
"id": "018cc252-cec0-79ae-adaa-96058dd4aabe",
"first_name": "Marjorie",
"last_name": "Cox",
"email": "[email protected]",
"country": "NG",
"created_at": "2026-06-08T11:01:04Z",
"last_seen_at": "2026-06-20T16:41:37Z",
"is_active": true
},
{
"id": "018cc252-d2a8-7d31-bab8-63bfaa7342bd",
"first_name": "Bryan",
"last_name": "Pena",
"email": "[email protected]",
"country": "IT",
"created_at": "2024-01-06T14:25:41Z",
"last_seen_at": null,
"is_active": true
},
{
"id": "018cc252-d690-7e1b-a275-f48a8c1ccbf6",
"first_name": "Catherine",
"last_name": "Munoz",
"email": "[email protected]",
"country": "AU",
"created_at": "2026-05-30T07:29:25Z",
"last_seen_at": "2026-06-23T08:23:39Z",
"is_active": true
},
{
"id": "018cc252-da78-7c22-9180-f137d46ec702",
"first_name": "Joyce",
"last_name": "Jordan",
"email": "[email protected]",
"country": "TR",
"created_at": "2025-01-13T19:52:26Z",
"last_seen_at": null,
"is_active": true
},
{
"id": "018cc252-de60-7bc5-907f-8eebca9226bf",
"first_name": "Jennifer",
"last_name": "Riley",
"email": "[email protected]",
"country": "AT",
"created_at": "2026-02-21T06:27:48Z",
"last_seen_at": "2026-04-30T10:23:57Z",
"is_active": true
},
{
"id": "018cc252-e248-7464-86b7-54ee11fc6051",
"first_name": "Amanda",
"last_name": "Daniels",
"email": "[email protected]",
"country": "IL",
"created_at": "2025-04-29T02:18:30Z",
"last_seen_at": "2026-04-17T18:37:07Z",
"is_active": false
},
{
"id": "018cc252-e630-7bf3-ab8d-a72175e7c3fb",
"first_name": "Laura",
"last_name": "Alvarado",
"email": "[email protected]",
"country": "PT",
"created_at": "2024-08-26T17:26:51Z",
"last_seen_at": "2025-09-16T12:46:07Z",
"is_active": true
},
{
"id": "018cc252-ea18-74fb-955a-5d6d42ed1760",
"first_name": "Andrea",
"last_name": "Turner",
"email": "[email protected]",
"country": "CA",
"created_at": "2024-07-13T08:04:19Z",
"last_seen_at": "2025-01-08T17:24:13Z",
"is_active": true
},
{
"id": "018cc252-ee00-7216-953a-2094b3402b1e",
"first_name": "Margaret",
"last_name": "Jackson",
"email": "[email protected]",
"country": "NZ",
"created_at": "2025-07-14T00:05:54Z",
"last_seen_at": "2026-05-05T09:44:04Z",
"is_active": true
},
{
"id": "018cc252-f1e8-7262-91aa-5818265220ca",
"first_name": "Rose",
"last_name": "Johnson",
"email": "[email protected]",
"country": "KR",
"created_at": "2024-07-18T02:49:21Z",
"last_seen_at": "2025-04-18T08:52:53Z",
"is_active": true
},
{
"id": "018cc252-f5d0-72f1-ba49-a52514f881dd",
"first_name": "Fred",
"last_name": "George",
"email": "[email protected]",
"country": "PL",
"created_at": "2025-10-26T23:11:53Z",
"last_seen_at": "2025-11-05T21:15:27Z",
"is_active": true
},
{
"id": "018cc252-f9b8-7173-b05d-540124a4fc47",
"first_name": "Sara",
"last_name": "Greene",
"email": "[email protected]",
"country": "PT",
"created_at": "2026-04-26T10:11:22Z",
"last_seen_at": "2026-05-07T04:01:08Z",
"is_active": true
},
{
"id": "018cc252-fda0-7ed5-a24a-3f179c69fc3c",
"first_name": "Jesse",
"last_name": "Bennett",
"email": "[email protected]",
"country": "SG",
"created_at": "2025-10-08T16:19:51Z",
"last_seen_at": "2026-03-04T05:50:50Z",
"is_active": true
},
{
"id": "018cc253-0188-74dd-a728-ed228fc827ac",
"first_name": "Louise",
"last_name": "Santos",
"email": "[email protected]",
"country": "FI",
"created_at": "2026-05-29T18:38:35Z",
"last_seen_at": "2026-06-01T15:33:29Z",
"is_active": true
},
{
"id": "018cc253-0570-7408-b582-07fbebeacbbf",
"first_name": "Scott",
"last_name": "Grant",
"email": "[email protected]",
"country": "NZ",
"created_at": "2024-02-11T17:35:11Z",
"last_seen_at": "2025-08-06T23:23:49Z",
"is_active": true
},
{
"id": "018cc253-0958-7c12-b38e-edc7af958916",
"first_name": "Judy",
"last_nПоказаны первые 20000 символов из 28086. Копирование и загрузка берут всё.
Почта уходит на example.com, телефоны — в блок 555-0100, адреса — в документационные сети, а карты — на опубликованные тестовые BIN. Каждое значение по умолчанию здесь взято из диапазона, зарезервированного стандартом, поэтому ничто созданное не может принадлежать реальному человеку.
Данные, которые проходят вашу валидацию
Обычная претензия к сгенерированным тестовым данным не в том, что они выглядят фальшиво. Они не проходят проверку. Номер карты, который не примет ни одна платёжная библиотека; IBAN, который отвергает банковская форма; ISBN, который не читает сканер; UUID, у которого поле версии — просто то, чем случайно оказались случайные байты. В итоге фикстуру правят вручную, и в этот момент генератор стоил больше, чем сэкономил.
Каждое значение здесь, для которого опубликованный стандарт определяет проверку, несёт правильную проверку. Это немного арифметики, и она меняет назначение данных: на них можно натравить вашу настоящую валидацию.
- Номера карт несут контрольную цифру Луна по ISO/IEC 7812-1, посчитанную по предшествующим ей цифрам, и стоят на опубликованном тестовом BIN выбранной вами платёжной системы.
- IBAN удовлетворяют ISO 7064 mod-97 — контрольные цифры подобраны так, чтобы переставленный и развёрнутый по буквам номер давал остаток 1, — и имеют ровно ту длину, которую регистрирует эта страна, чего одна лишь mod-97 не поймала бы.
- Значения ISBN-13 и EAN-13 несут контрольную цифру с чередующимися весами 1 и 3, под одним из двух префиксов GS1, выделенных системе ISBN.
- У UUID выставлены полубайт версии и два бита варианта, которых требует RFC 9562, поэтому парсер сообщает v4 или v7, а не разводит руками.
- Адреса, отметки времени, семантические версии и коды валют записаны в той форме, которую определяет их стандарт, а не в приближении к ней.
Ничто из этого не делает данные правдой. Оно делает их корректно построенными — единственное свойство, на которое фикстура может честно претендовать.
Сид, и почему в нём всё дело
Генератор, который каждый раз выдаёт другие строки, — игрушка. Как только данные попадают в тест, в демонстрацию или на скриншот, их нужно уметь вернуть: после перезагрузки, на машине коллеги, в CI через год.
Поэтому случайность здесь засеяна. Сид — строка, которую выбираете вы, и один и тот же сид с той же схемой и тем же числом строк даёт побайтово одинаковый результат где угодно. Генератор — xoshiro128**, засеянный через splitmix64; оба алгоритма опубликованы вместе с эталонными реализациями, и эта страница проверяется по выводу, переписанному из этих реализаций, а не по самой себе.
seed "orders-2026" same rows, every time, everywhere seed "orders-2027" a completely different set field stream = hash(seed, field name) row N of a field depends on nothing but the seed, the name and N
Последнюю строку стоит прочитать дважды, потому что именно она делает инструмент пригодным, а не просто воспроизводимым. Каждое поле берёт значения из собственного потока, привязанного к его имени. Добавьте столбец — все существующие столбцы выйдут прежними. Поднимите число строк со ста до тысячи — первая сотня будет той же, что у вас уже была. Фикстура, зафиксированная вчера, совпадает и после того, как схему расширили сегодня.
Честная плата за привязку к имени в том, что переименование поля заменяет его данные, ведь имя — половина сида. Доля пустых значений — единственная настройка, намеренно выведенная из-под этого правила: решение обнулить значение принимается после того, как значение получено, поэтому включение пустых убирает часть строк, не сдвигая остальные.
Из всего этого напрямую следует одно предупреждение. Генератор с сидом предсказуем по замыслу — в этом и смысл. Ничто из того, что он выдаёт, нельзя использовать как пароль, токен или ключ. Для этого возьмите генератор, который берёт данные из криптографического источника платформы.
Диапазоны, зарезервированные так, чтобы ваши данные не могли быть настоящими
Генератор, выдающий адреса на настоящем почтовом домене, вручает вам заряженное ружьё. Тесты отправляют почту. Стенды случайно направляют на продовый SMTP. Нагрузочные тесты бьют по тому IP-адресу, который записан в фикстуре. Когда значение кому-то принадлежит, авария доходит до него.
Организации по стандартизации это предвидели и отвели диапазоны, которые гарантированно никогда не будут назначены. Каждое значение по умолчанию здесь берётся из одного из них:
- Почта попадает на example.com, example.net и example.org, которые RFC 2606 резервирует навсегда, вместе с доменами верхнего уровня .test, .example и .invalid, добавленными RFC 6761.
- Телефонные номера используют 555-0100 — 555-0199, блок, который североамериканская нумерация резервирует для вымысла: именно поэтому его берут в кино.
- Адреса IPv4 приходят из 192.0.2.0/24, 198.51.100.0/24 и 203.0.113.0/24 — трёх документационных сетей RFC 5737, а IPv6 — из 2001:db8::/32 по RFC 3849.
- MAC-адреса выставляют бит локального администрирования, который IEEE гарантированно никогда не назначит; блок документации RFC 7042 тоже доступен, хотя в нём всего 256 адресов.
- Номера карт строятся на четырёх опубликованных тестовых BIN, а не на живом эмиссионном диапазоне, поэтому корректный по Луну номер не может совпасть с настоящей картой.
Каждое из этих значений можно переопределить, если есть причина: собственный домен для стенда, блок CIDR, совпадающий с вашей сетью. По умолчанию выбран безопасный ответ, а переопределение остаётся вашим осознанным решением.
Имена и населённые пункты взяты из опубликованных распределений имён Бюро переписи США и из его списка инкорпорированных населённых пунктов. Это распространённые англоязычные имена, а значит сгенерированное имя может совпасть с именем реального человека — как может любое имя. Относитесь к выводу как к тому, чем он является: правдоподобные строки, а не люди.
Поля, которые ссылаются друг на друга
Независимые столбцы дают строки, которые разваливаются при первом же взгляде. Пользовательница по имени Дана Леви с почтовым адресом, не связанным с её именем, выглядит поломкой на скриншоте, а отметка обновления, предшествующая отметке создания, провалит настоящую проверку.
Вместо частного случая на каждую пару здесь один механизм: любая настройка, помеченная как принимающая ссылки, может назвать другое поле в двойных фигурных скобках, и значение подставляется из той же строки. Поля тогда генерируются в порядке зависимостей, а не в том, в котором вы их перечислили, и цикл ссылок сообщается как ошибка схемы, а не подвешивает страницу.
Это работает шире, чем почта. Поле-шаблон собирает любую строку из других столбцов с необязательным преобразованием регистра. Нижняя или верхняя граница поля даты может назвать другое поле даты — так получается связная временная шкала. А когда значение, на которое ссылаются, пусто, зависящее поле тоже пусто, вместо тихого отката к окну по умолчанию, о котором схема никогда не упоминала.
Как это выгрузить: JSON, NDJSON, CSV, SQL
JSON — очевидный вариант, выходит с отступами или в одну строку. NDJSON — по одному компактному объекту на строку — это то, чего ждут конвейеры логов и потоковые импортёры, и именно этот формат стоит вставлять в инструмент, читающий по одной записи.
CSV следует RFC 4180: поля берутся в кавычки, только если содержат запятую, кавычку или перевод строки; внутренняя кавычка удваивается; строки заканчиваются CRLF. Это та форма, о которой договорились электронные таблицы и загрузчики баз данных.
Именно на SQL генераторы обычно халтурят, потому что правильный ответ зависит от диалекта. Кавычки для идентификаторов различаются — PostgreSQL и SQLite берут двойные кавычки, MySQL — обратные, SQL Server — квадратные скобки, — и каждый удваивает внутри имени свой собственный символ. Строковые литералы везде удваивают одинарную кавычку, но MySQL к тому же читает обратный слэш как экранирование, если не выставлен NO_BACKSLASH_ESCAPES, поэтому путь Windows, заканчивающийся слэшем, иначе проглотил бы закрывающую кавычку. Булевы значения — третье расхождение: у PostgreSQL есть настоящий булев тип, остальным нужны 1 и 0. А SQL Server отказывается принимать конструктор таблицы более чем с тысячей строк, поэтому большая выгрузка выводится несколькими операторами вместо одного падающего.
PostgreSQL INSERT INTO "records" ("id", "ok") VALUES (1, TRUE);
MySQL INSERT INTO `records` (`id`, `ok`) VALUES (1, 1);
SQLite INSERT INTO "records" ("id", "ok") VALUES (1, 1);
SQL Server INSERT INTO [records] ([id], [ok]) VALUES (1, 1);Схема — это файл
Панель рядом с конструктором — та же схема, записанная как JSON, и она работает в обе стороны: правьте поля — она обновляется, вставьте схему — конструктор подстроится. Настройки, оставленные по умолчанию, опускаются, поэтому вы читаете принятые вами решения, а не все рычаги, которые есть у инструмента.
Этот файл вместе с содержащимся в нём сидом и есть целостная воспроизводимая единица. Положите его рядом с тестом, который потребляет данные, и фикстура станет тем, что рецензент может прочитать, а коллега — сгенерировать заново, вместо большого куска значений, который никто не может объяснить.
Частые вопросы
- Номера карт настоящие?
- Они корректные и не настоящие. Каждый несёт верную контрольную цифру Луна, поэтому платёжная библиотека примет его формат, и каждый построен на одном из четырёх опубликованных тестовых BIN, а не на живом эмиссионном диапазоне, поэтому не может совпасть с картой, которая у кого-то есть. Оплату они нигде не авторизуют.
- Один и тот же сид действительно даст те же данные через год?
- Да. Генератор — опубликованный алгоритм с фиксированной эталонной реализацией, а не браузерный интерфейс, поведение которого может измениться, и страница проверяется по выводу, переписанному из этой реализации. Ничто здесь не читает часы: диапазоны дат — явные значения в схеме. Сохраните JSON схемы и сид внутри него, и строки вернутся в точности.
- Почему добавление столбца ничего больше не изменило?
- Потому что каждое поле берёт значения из собственного потока, привязанного к сиду и имени поля. Это сделано намеренно: фикстуру, которая перетасовывается при каждом расширении схемы, нельзя держать в репозитории. То же свойство означает, что увеличение числа строк не трогает уже полученные.
- Я переименовал поле, и его данные изменились.
- Это следует из того же устройства — имя поля составляет половину ключа его потока. Если нужно сохранить значения, переименуйте столбец дальше по конвейеру или примите новую выборку. Совместить устойчивость к переименованию и устойчивость к перестановке невозможно без скрытого идентификатора, который тогда пришлось бы носить в файле схемы.
- Можно этим сгенерировать пароль или ключ API?
- Нет. Всё здесь берётся из псевдослучайного генератора с сидом, который предсказуем по замыслу, — именно поэтому вывод воспроизводим. Секрет должен приходить из криптографического источника платформы. Для этого возьмите отдельный генератор токенов.
- Как сделать, чтобы почта совпадала с именем?
- Добавьте поле-шаблон и напишите другие столбцы в двойных фигурных скобках — что-нибудь вроде {{first_name}}.{{last_name}}@example.com — а затем поставьте преобразование регистра в нижний. Поля генерируются в порядке зависимостей, поэтому шаблон может назвать столбец, который стоит в списке после него.
- Сколько строк он может выдать?
- Десять тысяч, при не более чем сорока полях. Генерация на таком объёме достаточно быстра, чтобы остаться в главном потоке; по-настоящему неудобным становится сам получившийся текст, поэтому панель показывает усечённый предпросмотр, а копирование и загрузка берут всё целиком.
- Что-нибудь из этого покидает мой браузер?
- Нет. Генератор, корпус имён и все форматы вывода работают как JavaScript на странице. Обращений к серверу нет, и ничто из набранного в схеме никуда не отправляется.