Test Data Generator
Overview
Generate realistic, type-safe test data including fixtures, factory functions, seed datasets, and edge case values. Supports Faker.js, Factory Bot patterns, Fishery (TypeScript factories), pytest fixtures, and database seed scripts.
Prerequisites
- Data generation library installed (Faker.js/@faker-js/faker, Fishery, factory-boy for Python, or JavaFaker)
- Database schema or TypeScript/Python type definitions for the data models
- Test framework with fixture support (Jest, pytest, JUnit)
- Seed management for reproducible random data (
faker.seed())
- Database client for seed data insertion (if generating database fixtures)
Instructions
- Read the project's data models, TypeScript interfaces, database schemas, or ORM definitions to understand the shape of all entities.
- For each entity, create a factory function that produces a valid default instance:
- Use Faker methods matched to field semantics (e.g.,
faker.person.fullName() for names, faker.internet.email() for emails).
- Provide sensible defaults for required fields.
- Allow overrides via a partial parameter for test-specific customization.
- Set a deterministic seed for reproducibility (
faker.seed(12345)).
- Generate edge case data variants for each entity:
- Empty values: Empty strings, null, undefined, empty arrays.
- Boundary values: Maximum string length, integer overflow, zero, negative numbers.
- Unicode and i18n: Names with accents, CJK characters, RTL text, emoji.
- Adversarial inputs: SQL injection strings, XSS payloads, excessively long strings.
- Temporal edge cases: Leap years, timezone boundaries, epoch zero, far-future dates.
- Create relationship factories that build connected entity graphs:
- A user factory that also creates associated addresses and orders.
- Configurable depth to avoid infinite recursion.
- Lazy evaluation for optional relationships.
- Generate database seed files for integration tests:
- SQL insert scripts or ORM seed functions.
- Idempotent operations (use
ON CONFLICT or INSERT IF NOT EXISTS).
- Separate seed sets for different test scenarios (empty state, populated state, edge cases).
- Write fixture files in JSON, YAML, or TypeScript for static test data:
- Group fixtures by test scenario.
- Include both valid and invalid data sets.
- Validate generated data against the schema to ensure factories remain in sync with model changes.
Output
- Factory function files (one per entity) in
test/factories/ or tests/factories/
- Edge case data collections covering boundaries and adversarial inputs
- Database seed scripts for integration test environments
- JSON/YAML fixture files for static test data
- Factory index file exporting all factories for easy test imports
Error Handling
| Error |
Cause |
Solution |
| Factory produces invalid data |
Schema changed but factory not updated |
Add a validation step that runs the factory output through the schema validator |
| Duplicate unique values |
Faker generates collisions in small datasets |
Use sequential IDs or append a counter; increase Faker's unique retry limit |
| Database seed fails on foreign key |
Seed insertion order violates referential integrity |
Sort seed operations topologically by dependency; disable FK checks during seeding |
| Factory recursion overflow |
Circular relationships (User -> Order -> User) |
Limit relationship depth; use lazy references; break cycles with ID-only references |
| Non-deterministic test failures |
Random seed not set consistently |
Call faker.seed() in beforeAll or at factory module level; document seed values |
Examples
TypeScript factory with Fishery:
import { Factory } from 'fishery';
import { faker } from '@faker-js/faker';
interface User {
id: string;
name: string;
email: string;
role: 'admin' | 'user';
createdAt: Date;
}
export const userFactory = Factory.define<User>(({ sequence }) => ({
id: `user-${sequence}`,
name: faker.person.fullName(),
email: faker.internet.email(),
role: 'user',
createdAt: faker.date.past(),
}));
// Usage:
const user = userFactory.build();
const admin = userFactory.build({ role: 'admin' });
const users = userFactory.buildList(10);
pytest fixture factory:
import pytest
from faker import Faker
fake = Faker()
Faker.seed(42)
@pytest.fixture
def make_user():
def _make_user(**overrides):
defaults = {
"name": fake.name(),
"email": fake.email(),
"age": fake.random_int(min=18, max=99),
}
return {**defaults, **overrides}
return _make_user
def test_user_validation(make_user):
user = make_user(age=17)
assert validate_age(user) is False
Edge case data collection:
export const edgeCases = {
strings: ['', ' ', '\t\n', 'a'.repeat(10000), '<script>alert(1)</script>', # 10000: 10 seconds in ms
"Robert'); DROP TABLE users;--", '\u0000null\u0000byte'],
numbers: [0, -0, -1, Number.MAX_SAFE_INTEGER, NaN, Infinity, -Infinity],
dates: [new Date(0), new Date('2024-02-29'), new Date('9999-12-31')], # 2024: 9999 = configured value
};
Resources
Converted and distributed by TomeVault — claim your Tome and manage your conversions.
1---2name: jeremylongshore-claude-code-plugins-plus-skills-generating-t3description: Test Data Generator4---5# Test Data Generator67## Overview89Generate realistic, type-safe test data including fixtures, factory functions, seed datasets, and edge case values. Supports Faker.js, Factory Bot patterns, Fishery (TypeScript factories), pytest fixtures, and database seed scripts.1011## Prerequisites1213- Data generation library installed (Faker.js/@faker-js/faker, Fishery, factory-boy for Python, or JavaFaker)14- Database schema or TypeScript/Python type definitions for the data models15- Test framework with fixture support (Jest, pytest, JUnit)16- Seed management for reproducible random data (`faker.seed()`)17- Database client for seed data insertion (if generating database fixtures)1819## Instructions20211. Read the project's data models, TypeScript interfaces, database schemas, or ORM definitions to understand the shape of all entities.222. For each entity, create a factory function that produces a valid default instance:23 - Use Faker methods matched to field semantics (e.g., `faker.person.fullName()` for names, `faker.internet.email()` for emails).24 - Provide sensible defaults for required fields.25 - Allow overrides via a partial parameter for test-specific customization.26 - Set a deterministic seed for reproducibility (`faker.seed(12345)`).273. Generate edge case data variants for each entity:28 - **Empty values**: Empty strings, null, undefined, empty arrays.29 - **Boundary values**: Maximum string length, integer overflow, zero, negative numbers.30 - **Unicode and i18n**: Names with accents, CJK characters, RTL text, emoji.31 - **Adversarial inputs**: SQL injection strings, XSS payloads, excessively long strings.32 - **Temporal edge cases**: Leap years, timezone boundaries, epoch zero, far-future dates.334. Create relationship factories that build connected entity graphs:34 - A user factory that also creates associated addresses and orders.35 - Configurable depth to avoid infinite recursion.36 - Lazy evaluation for optional relationships.375. Generate database seed files for integration tests:38 - SQL insert scripts or ORM seed functions.39 - Idempotent operations (use `ON CONFLICT` or `INSERT IF NOT EXISTS`).40 - Separate seed sets for different test scenarios (empty state, populated state, edge cases).416. Write fixture files in JSON, YAML, or TypeScript for static test data:42 - Group fixtures by test scenario.43 - Include both valid and invalid data sets.447. Validate generated data against the schema to ensure factories remain in sync with model changes.4546## Output4748- Factory function files (one per entity) in `test/factories/` or `tests/factories/`49- Edge case data collections covering boundaries and adversarial inputs50- Database seed scripts for integration test environments51- JSON/YAML fixture files for static test data52- Factory index file exporting all factories for easy test imports5354## Error Handling5556| Error | Cause | Solution |57|-------|-------|---------|58| Factory produces invalid data | Schema changed but factory not updated | Add a validation step that runs the factory output through the schema validator |59| Duplicate unique values | Faker generates collisions in small datasets | Use sequential IDs or append a counter; increase Faker's unique retry limit |60| Database seed fails on foreign key | Seed insertion order violates referential integrity | Sort seed operations topologically by dependency; disable FK checks during seeding |61| Factory recursion overflow | Circular relationships (User -> Order -> User) | Limit relationship depth; use lazy references; break cycles with ID-only references |62| Non-deterministic test failures | Random seed not set consistently | Call `faker.seed()` in `beforeAll` or at factory module level; document seed values |6364## Examples6566**TypeScript factory with Fishery:**67```typescript68import { Factory } from 'fishery';69import { faker } from '@faker-js/faker';7071interface User {72 id: string;73 name: string;74 email: string;75 role: 'admin' | 'user';76 createdAt: Date;77}7879export const userFactory = Factory.define<User>(({ sequence }) => ({80 id: `user-${sequence}`,81 name: faker.person.fullName(),82 email: faker.internet.email(),83 role: 'user',84 createdAt: faker.date.past(),85}));8687// Usage:88const user = userFactory.build();89const admin = userFactory.build({ role: 'admin' });90const users = userFactory.buildList(10);91```9293**pytest fixture factory:**94```python95import pytest96from faker import Faker9798fake = Faker()99Faker.seed(42)100101@pytest.fixture102def make_user():103 def _make_user(**overrides):104 defaults = {105 "name": fake.name(),106 "email": fake.email(),107 "age": fake.random_int(min=18, max=99),108 }109 return {**defaults, **overrides}110 return _make_user111112def test_user_validation(make_user):113 user = make_user(age=17)114 assert validate_age(user) is False115```116117**Edge case data collection:**118```typescript119export const edgeCases = {120 strings: ['', ' ', '\t\n', 'a'.repeat(10000), '<script>alert(1)</script>', # 10000: 10 seconds in ms121 "Robert'); DROP TABLE users;--", '\u0000null\u0000byte'],122 numbers: [0, -0, -1, Number.MAX_SAFE_INTEGER, NaN, Infinity, -Infinity],123 dates: [new Date(0), new Date('2024-02-29'), new Date('9999-12-31')], # 2024: 9999 = configured value124};125```126127## Resources128129- Faker.js: https://fakerjs.dev/130- Fishery (TypeScript factories): https://github.com/thoughtbot/fishery131- factory_boy (Python): https://factoryboy.readthedocs.io/132- Chance.js: https://chancejs.com/133- Test data management patterns: https://martinfowler.com/bliki/ObjectMother.html134135---136> Converted and distributed by [TomeVault](https://tomevault.io/claim/jeremylongshore) — claim your Tome and manage your conversions.137<!-- tomevault:4.0:skill_md:2026-04-11 -->